From e6cffc6a9369ef5b30eb00b6a29549df1c287f47 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Fri, 13 Sep 2024 20:48:25 -0700 Subject: [PATCH 01/17] Disable broken tests for now (#4242) --- .../encounters/uncommon-breed-encounter.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts index ce9e37b8d68..f235609ee08 100644 --- a/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/uncommon-breed-encounter.test.ts @@ -107,7 +107,7 @@ describe("Uncommon Breed - Mystery Encounter", () => { expect(onInitResult).toBe(true); }); - describe("Option 1 - Fight", () => { + describe.skip("Option 1 - Fight", () => { it("should have the correct properties", () => { const option = UncommonBreedEncounter.options[0]; expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); From 8164ec596efafcd50a6154b350c038c2fb9bc5ca Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Fri, 13 Sep 2024 20:48:57 -0700 Subject: [PATCH 02/17] [Balance] Remove `isMax` conditions from move and ability effects (#4200) Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> --- src/data/ability.ts | 2 +- src/data/battler-tags.ts | 16 ---------------- src/data/move.ts | 19 ++++++------------- src/modifier/modifier.ts | 3 +-- 4 files changed, 8 insertions(+), 32 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index b38d9ea0fb3..944ee10244a 100755 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1086,7 +1086,7 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr { applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { if (attacker.getTag(BattlerTagType.DISABLED) === null) { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance) && !attacker.isMax()) { + if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon) && (this.chance === -1 || pokemon.randSeedInt(100) < this.chance)) { if (simulated) { return true; } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index e02cf205190..32b3d54f302 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -524,10 +524,6 @@ export class FlinchedTag extends BattlerTag { applyAbAttrs(FlinchEffectAbAttr, pokemon, null); } - canAdd(pokemon: Pokemon): boolean { - return !pokemon.isMax(); - } - /** * Cancels the Pokemon's next Move on the turn this tag is applied * @param pokemon The {@linkcode Pokemon} with this tag @@ -878,10 +874,6 @@ export class EncoreTag extends BattlerTag { } canAdd(pokemon: Pokemon): boolean { - if (pokemon.isMax()) { - return false; - } - const lastMoves = pokemon.getLastXMoves(1); if (!lastMoves.length) { return false; @@ -1060,19 +1052,11 @@ export class MinimizeTag extends BattlerTag { super(BattlerTagType.MINIMIZED, BattlerTagLapseType.TURN_END, 1, Moves.MINIMIZE); } - canAdd(pokemon: Pokemon): boolean { - return !pokemon.isMax(); - } - onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - //If a pokemon dynamaxes they lose minimized status - if (pokemon.isMax()) { - return false; - } return lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType); } diff --git a/src/data/move.ts b/src/data/move.ts index 1d1a788e768..e828c425d08 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -5248,7 +5248,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return false; } - if (!this.user && move.category === MoveCategory.STATUS && (target.hasAbilityWithAttr(ForceSwitchOutImmunityAbAttr) || target.isMax())) { + if (!this.user && move.category === MoveCategory.STATUS && (target.hasAbilityWithAttr(ForceSwitchOutImmunityAbAttr))) { return false; } @@ -6458,8 +6458,6 @@ const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user. const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune(); -const failOnMaxCondition: MoveConditionFunc = (user, target, move) => !target.isMax(); - const failIfSingleBattle: MoveConditionFunc = (user, target, move) => user.scene.currentBattle.double; const failIfDampCondition: MoveConditionFunc = (user, target, move) => { @@ -6855,8 +6853,7 @@ export function initMoves() { new StatusMove(Moves.DISABLE, Type.NORMAL, 100, 20, -1, 0, 1) .attr(AddBattlerTagAttr, BattlerTagType.DISABLED, false, true) .condition((user, target, move) => target.getMoveHistory().reverse().find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual) !== undefined) - .ignoresSubstitute() - .condition(failOnMaxCondition), + .ignoresSubstitute(), new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -6894,8 +6891,7 @@ export function initMoves() { .attr(RecoilAttr) .recklessMove(), new AttackMove(Moves.LOW_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, 0, 1) - .attr(WeightPowerAttr) - .condition(failOnMaxCondition), + .attr(WeightPowerAttr), new AttackMove(Moves.COUNTER, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 20, -1, -5, 1) .attr(CounterDamageAttr, (move: Move) => move.category === MoveCategory.PHYSICAL, 2) .target(MoveTarget.ATTACKER), @@ -8006,8 +8002,7 @@ export function initMoves() { .target(MoveTarget.ENEMY_SIDE), new AttackMove(Moves.GRASS_KNOT, Type.GRASS, MoveCategory.SPECIAL, -1, 100, 20, -1, 0, 4) .attr(WeightPowerAttr) - .makesContact() - .condition(failOnMaxCondition), + .makesContact(), new AttackMove(Moves.CHATTER, Type.FLYING, MoveCategory.SPECIAL, 65, 100, 20, 100, 0, 4) .attr(ConfuseAttr) .soundBased(), @@ -8109,8 +8104,7 @@ export function initMoves() { new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) .attr(MinimizeAccuracyAttr) .attr(CompareWeightPowerAttr) - .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) - .condition(failOnMaxCondition), + .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true), new AttackMove(Moves.SYNCHRONOISE, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 5) .target(MoveTarget.ALL_NEAR_OTHERS) .condition(unknownTypeCondition) @@ -8262,8 +8256,7 @@ export function initMoves() { new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5) .attr(MinimizeAccuracyAttr) .attr(CompareWeightPowerAttr) - .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true) - .condition(failOnMaxCondition), + .attr(HitsTagAttr, BattlerTagType.MINIMIZED, true), new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.ACC ], -1), new AttackMove(Moves.STEAMROLLER, Type.BUG, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 5) diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index b87d89e3733..6614ef38253 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -29,7 +29,6 @@ import { Abilities } from "#app/enums/abilities"; import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { LevelUpPhase } from "#app/phases/level-up-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; -import { SpeciesFormKey } from "#app/data/pokemon-species"; export type ModifierPredicate = (modifier: Modifier) => boolean; @@ -1086,7 +1085,7 @@ export class EvolutionStatBoosterModifier extends StatBoosterModifier { * @returns true if the stat boosts can be applied, false otherwise */ shouldApply(args: any[]): boolean { - return super.shouldApply(args) && ((args[0] as Pokemon).getFormKey() !== SpeciesFormKey.GIGANTAMAX); + return super.shouldApply(args) && !(args[0] as Pokemon).isMax(); } /** From 9d3681cf31f172e25dc80b8d57402fd9de66a73a Mon Sep 17 00:00:00 2001 From: damocleas Date: Fri, 13 Sep 2024 23:52:12 -0400 Subject: [PATCH 03/17] [Balance] Gigantamax Form Adjustments (Charizard, Eevee, Duraludon) and 999.9 Weight for all, + undo Voucher Event on beta (#4241) * Undo egg skip event * Readded vouchers to original weights * Gmax Adjustments - Charizard Berserk, Stats for Eevee and Duraludon * Set weight of 999.9kg for all Gigantamax forms --------- Co-authored-by: Frederico Santos --- src/data/pokemon-species.ts | 68 ++++++++++++++--------------- src/modifier/modifier-type.ts | 7 ++- src/phases/trainer-victory-phase.ts | 2 +- 3 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index d2f63275a5e..633150c62f2 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -944,7 +944,7 @@ export function initSpecies() { new PokemonSpecies(Species.VENUSAUR, 1, false, false, false, "Seed Pokémon", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, new PokemonForm("Normal", "", Type.GRASS, Type.POISON, 2, 100, Abilities.OVERGROW, Abilities.NONE, Abilities.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GRASS, Type.POISON, 2.4, 155.5, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.POISON, 24, 100, Abilities.CHLOROPHYLL, Abilities.CHLOROPHYLL, Abilities.CHLOROPHYLL, 625, 120, 82, 98, 130, 115, 80, 45, 50, 263, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.POISON, 24, 999.9, Abilities.CHLOROPHYLL, Abilities.CHLOROPHYLL, Abilities.CHLOROPHYLL, 625, 120, 82, 98, 130, 115, 80, 45, 50, 263, true), ), new PokemonSpecies(Species.CHARMANDER, 1, false, false, false, "Lizard Pokémon", Type.FIRE, null, 0.6, 8.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.CHARMELEON, 1, false, false, false, "Flame Pokémon", Type.FIRE, null, 1.1, 19, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -952,20 +952,20 @@ export function initSpecies() { new PokemonForm("Normal", "", Type.FIRE, Type.FLYING, 1.7, 90.5, Abilities.BLAZE, Abilities.NONE, Abilities.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, Type.FIRE, Type.DRAGON, 1.7, 110.5, Abilities.TOUGH_CLAWS, Abilities.NONE, Abilities.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, Type.FIRE, Type.FLYING, 1.7, 100.5, Abilities.DROUGHT, Abilities.NONE, Abilities.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.FLYING, 28, 90.5, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, Abilities.SOLAR_POWER, 634, 118, 84, 93, 139, 110, 100, 45, 50, 267), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.FLYING, 28, 999.9, Abilities.BERSERK, Abilities.BERSERK, Abilities.BERSERK, 634, 118, 84, 93, 139, 110, 100, 45, 50, 267), ), new PokemonSpecies(Species.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", Type.WATER, null, 0.5, 9, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.WARTORTLE, 1, false, false, false, "Turtle Pokémon", Type.WATER, null, 1, 22.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", Type.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", Type.WATER, null, 1.6, 85.5, Abilities.TORRENT, Abilities.NONE, Abilities.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.WATER, null, 1.6, 101.1, Abilities.MEGA_LAUNCHER, Abilities.NONE, Abilities.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.STEEL, 25, 85.5, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 630, 119, 83, 130, 115, 115, 68, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.STEEL, 25, 999.9, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 630, 119, 83, 130, 115, 115, 68, 45, 50, 265), ), new PokemonSpecies(Species.CATERPIE, 1, false, false, false, "Worm Pokémon", Type.BUG, null, 0.3, 2.9, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, new PokemonForm("Normal", "", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.FLYING, 17, 32, Abilities.COMPOUND_EYES, Abilities.COMPOUND_EYES, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.FLYING, 17, 999.9, Abilities.COMPOUND_EYES, Abilities.COMPOUND_EYES, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true), ), new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", Type.BUG, Type.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", Type.BUG, Type.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), @@ -994,7 +994,7 @@ export function initSpecies() { new PokemonForm("Cute Cosplay", "cute-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom new PokemonForm("Smart Cosplay", "smart-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom new PokemonForm("Tough Cosplay", "tough-cosplay", Type.ELECTRIC, null, 0.4, 6, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, null, 21, 6, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112), //+100 BST from Partner Form + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, null, 21, 999.9, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112), //+100 BST from Partner Form ), new PokemonSpecies(Species.RAICHU, 1, false, false, false, "Mouse Pokémon", Type.ELECTRIC, null, 0.8, 30, Abilities.STATIC, Abilities.NONE, Abilities.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true), new PokemonSpecies(Species.SANDSHREW, 1, false, false, false, "Mouse Pokémon", Type.GROUND, null, 0.6, 12, Abilities.SAND_VEIL, Abilities.NONE, Abilities.SAND_RUSH, 300, 50, 75, 85, 20, 30, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), @@ -1024,7 +1024,7 @@ export function initSpecies() { new PokemonSpecies(Species.DUGTRIO, 1, false, false, false, "Mole Pokémon", Type.GROUND, null, 0.7, 33.3, Abilities.SAND_VEIL, Abilities.ARENA_TRAP, Abilities.SAND_FORCE, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.MEOWTH, 1, false, false, false, "Scratch Cat Pokémon", Type.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.NORMAL, null, 0.4, 4.2, Abilities.PICKUP, Abilities.TECHNICIAN, Abilities.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 33, 4.2, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58), //+100 BST from Persian + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 33, 999.9, Abilities.TECHNICIAN, Abilities.TECHNICIAN, Abilities.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58), //+100 BST from Persian ), new PokemonSpecies(Species.PERSIAN, 1, false, false, false, "Classy Cat Pokémon", Type.NORMAL, null, 1, 32, Abilities.LIMBER, Abilities.TECHNICIAN, Abilities.UNNERVE, 440, 65, 70, 60, 65, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PSYDUCK, 1, false, false, false, "Duck Pokémon", Type.WATER, null, 0.8, 19.6, Abilities.DAMP, Abilities.CLOUD_NINE, Abilities.SWIFT_SWIM, 320, 50, 52, 48, 65, 50, 55, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), @@ -1046,7 +1046,7 @@ export function initSpecies() { new PokemonSpecies(Species.MACHOKE, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 1.5, 70.5, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), new PokemonSpecies(Species.MACHAMP, 1, false, false, false, "Superpower Pokémon", Type.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, new PokemonForm("Normal", "", Type.FIGHTING, null, 1.6, 130, Abilities.GUTS, Abilities.NO_GUARD, Abilities.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIGHTING, null, 25, 130, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 115, 170, 95, 65, 95, 65, 45, 50, 253), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIGHTING, null, 25, 999.9, Abilities.GUTS, Abilities.GUTS, Abilities.GUTS, 605, 115, 170, 95, 65, 95, 65, 45, 50, 253), ), new PokemonSpecies(Species.BELLSPROUT, 1, false, false, false, "Flower Pokémon", Type.GRASS, Type.POISON, 0.7, 4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", Type.GRASS, Type.POISON, 1, 6.4, Abilities.CHLOROPHYLL, Abilities.NONE, Abilities.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), @@ -1079,7 +1079,7 @@ export function initSpecies() { new PokemonSpecies(Species.GENGAR, 1, false, false, false, "Shadow Pokémon", Type.GHOST, Type.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Normal", "", Type.GHOST, Type.POISON, 1.5, 40.5, Abilities.CURSED_BODY, Abilities.NONE, Abilities.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, false, null, true), new PokemonForm("Mega", SpeciesFormKey.MEGA, Type.GHOST, Type.POISON, 1.4, 40.5, Abilities.SHADOW_TAG, Abilities.NONE, Abilities.NONE, 600, 60, 65, 80, 170, 95, 130, 45, 50, 250), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GHOST, Type.POISON, 20, 40.5, Abilities.CURSED_BODY, Abilities.CURSED_BODY, Abilities.CURSED_BODY, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GHOST, Type.POISON, 20, 999.9, Abilities.CURSED_BODY, Abilities.CURSED_BODY, Abilities.CURSED_BODY, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250), ), new PokemonSpecies(Species.ONIX, 1, false, false, false, "Rock Snake Pokémon", Type.ROCK, Type.GROUND, 8.8, 210, Abilities.ROCK_HEAD, Abilities.STURDY, Abilities.WEAK_ARMOR, 385, 35, 45, 160, 30, 45, 70, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DROWZEE, 1, false, false, false, "Hypnosis Pokémon", Type.PSYCHIC, null, 1, 32.4, Abilities.INSOMNIA, Abilities.FOREWARN, Abilities.INNER_FOCUS, 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), @@ -1087,7 +1087,7 @@ export function initSpecies() { new PokemonSpecies(Species.KRABBY, 1, false, false, false, "River Crab Pokémon", Type.WATER, null, 0.4, 6.5, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KINGLER, 1, false, false, false, "Pincer Pokémon", Type.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.WATER, null, 1.3, 60, Abilities.HYPER_CUTTER, Abilities.SHELL_ARMOR, Abilities.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 19, 60, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 90, 155, 140, 50, 80, 70, 60, 50, 166), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 19, 999.9, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, Abilities.TOUGH_CLAWS, 575, 90, 155, 140, 50, 80, 70, 60, 50, 166), ), new PokemonSpecies(Species.VOLTORB, 1, false, false, false, "Ball Pokémon", Type.ELECTRIC, null, 0.5, 10.4, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.ELECTRODE, 1, false, false, false, "Ball Pokémon", Type.ELECTRIC, null, 1.2, 66.6, Abilities.SOUNDPROOF, Abilities.STATIC, Abilities.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), @@ -1131,13 +1131,13 @@ export function initSpecies() { ), new PokemonSpecies(Species.LAPRAS, 1, false, false, false, "Transport Pokémon", Type.WATER, Type.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, new PokemonForm("Normal", "", Type.WATER, Type.ICE, 2.5, 220, Abilities.WATER_ABSORB, Abilities.SHELL_ARMOR, Abilities.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ICE, 24, 220, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 635, 170, 85, 95, 115, 110, 60, 45, 50, 187), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ICE, 24, 999.9, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, Abilities.SHELL_ARMOR, 635, 170, 85, 95, 115, 110, 60, 45, 50, 187), ), new PokemonSpecies(Species.DITTO, 1, false, false, false, "Transform Pokémon", Type.NORMAL, null, 0.3, 4, Abilities.LIMBER, Abilities.NONE, Abilities.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.EEVEE, 1, false, false, false, "Evolution Pokémon", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, new PokemonForm("Normal", "", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), new PokemonForm("Partner", "partner", Type.NORMAL, null, 0.3, 6.5, Abilities.RUN_AWAY, Abilities.ADAPTABILITY, Abilities.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 18, 6.5, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 105, 95, 70, 95, 85, 85, 45, 50, 65), //+100 BST from Partner Form + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 18, 999.9, Abilities.PROTEAN, Abilities.PROTEAN, Abilities.PROTEAN, 535, 110, 90, 70, 95, 85, 85, 45, 50, 65), //+100 BST from Partner Form ), new PokemonSpecies(Species.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", Type.WATER, null, 1, 29, Abilities.WATER_ABSORB, Abilities.NONE, Abilities.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), new PokemonSpecies(Species.JOLTEON, 1, false, false, false, "Lightning Pokémon", Type.ELECTRIC, null, 0.8, 24.5, Abilities.VOLT_ABSORB, Abilities.NONE, Abilities.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), @@ -1153,7 +1153,7 @@ export function initSpecies() { ), new PokemonSpecies(Species.SNORLAX, 1, false, false, false, "Sleeping Pokémon", Type.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true, new PokemonForm("Normal", "", Type.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 35, 460, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 200, 135, 80, 80, 125, 20, 25, 50, 189), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 35, 999.9, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 200, 135, 80, 80, 125, 20, 25, 50, 189), ), new PokemonSpecies(Species.ARTICUNO, 1, true, false, false, "Freeze Pokémon", Type.ICE, Type.FLYING, 1.7, 55.4, Abilities.PRESSURE, Abilities.NONE, Abilities.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ZAPDOS, 1, true, false, false, "Electric Pokémon", Type.ELECTRIC, Type.FLYING, 1.6, 52.6, Abilities.PRESSURE, Abilities.NONE, Abilities.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), @@ -1793,7 +1793,7 @@ export function initSpecies() { new PokemonSpecies(Species.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", Type.POISON, null, 0.6, 31, Abilities.STENCH, Abilities.STICKY_HOLD, Abilities.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.POISON, null, 1.9, 107.3, Abilities.STENCH, Abilities.WEAK_ARMOR, Abilities.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.POISON, Type.STEEL, 21, 107.3, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 135, 125, 102, 57, 102, 53, 60, 50, 166), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.POISON, Type.STEEL, 21, 999.9, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, Abilities.TOXIC_DEBRIS, 574, 135, 125, 102, 57, 102, 53, 60, 50, 166), ), new PokemonSpecies(Species.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", Type.DARK, null, 0.7, 12.5, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", Type.DARK, null, 1.6, 81.1, Abilities.ILLUSION, Abilities.NONE, Abilities.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), @@ -2267,25 +2267,25 @@ export function initSpecies() { new PokemonSpecies(Species.MELTAN, 7, false, false, true, "Hex Nut Pokémon", Type.STEEL, null, 0.2, 8, Abilities.MAGNET_PULL, Abilities.NONE, Abilities.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", Type.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.STEEL, null, 2.5, 800, Abilities.IRON_FIST, Abilities.NONE, Abilities.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, null, 25, 800, Abilities.IRON_FIST, Abilities.IRON_FIST, Abilities.IRON_FIST, 700, 175, 165, 155, 85, 75, 45, 3, 0, 300), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, null, 25, 999.9, Abilities.IRON_FIST, Abilities.IRON_FIST, Abilities.IRON_FIST, 700, 175, 165, 155, 85, 75, 45, 3, 0, 300), ), new PokemonSpecies(Species.GROOKEY, 8, false, false, false, "Chimp Pokémon", Type.GRASS, null, 0.3, 5, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.THWACKEY, 8, false, false, false, "Beat Pokémon", Type.GRASS, null, 0.7, 14, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.RILLABOOM, 8, false, false, false, "Drummer Pokémon", Type.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", Type.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, null, 28, 90, Abilities.GRASSY_SURGE, Abilities.GRASSY_SURGE, Abilities.GRASSY_SURGE, 630, 125, 150, 105, 85, 85, 80, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, null, 28, 999.9, Abilities.GRASSY_SURGE, Abilities.GRASSY_SURGE, Abilities.GRASSY_SURGE, 630, 125, 150, 105, 85, 85, 80, 45, 50, 265), ), new PokemonSpecies(Species.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", Type.FIRE, null, 0.3, 4.5, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.RABOOT, 8, false, false, false, "Rabbit Pokémon", Type.FIRE, null, 0.6, 9, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.CINDERACE, 8, false, false, false, "Striker Pokémon", Type.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", Type.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, null, 27, 33, Abilities.LIBERO, Abilities.LIBERO, Abilities.LIBERO, 630, 100, 146, 80, 90, 80, 134, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, null, 27, 999.9, Abilities.LIBERO, Abilities.LIBERO, Abilities.LIBERO, 630, 100, 146, 80, 90, 80, 134, 45, 50, 265), ), new PokemonSpecies(Species.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", Type.WATER, null, 0.3, 4, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", Type.WATER, null, 0.7, 11.5, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), new PokemonSpecies(Species.INTELEON, 8, false, false, false, "Secret Agent Pokémon", Type.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, new PokemonForm("Normal", "", Type.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 40, 45.2, Abilities.SNIPER, Abilities.SNIPER, Abilities.SNIPER, 630, 95, 97, 77, 147, 77, 137, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 40, 999.9, Abilities.SNIPER, Abilities.SNIPER, Abilities.SNIPER, 630, 95, 97, 77, 147, 77, 137, 45, 50, 265), ), new PokemonSpecies(Species.SKWOVET, 8, false, false, false, "Cheeky Pokémon", Type.NORMAL, null, 0.3, 2.5, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GREEDENT, 8, false, false, false, "Greedy Pokémon", Type.NORMAL, null, 0.6, 6, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), @@ -2293,13 +2293,13 @@ export function initSpecies() { new PokemonSpecies(Species.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", Type.FLYING, null, 0.8, 16, Abilities.KEEN_EYE, Abilities.UNNERVE, Abilities.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", Type.FLYING, Type.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Normal", "", Type.FLYING, Type.STEEL, 2.2, 75, Abilities.PRESSURE, Abilities.UNNERVE, Abilities.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FLYING, Type.STEEL, 14, 75, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 128, 102, 140, 53, 95, 77, 45, 50, 248), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FLYING, Type.STEEL, 14, 999.9, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, Abilities.MIRROR_ARMOR, 595, 128, 102, 140, 53, 95, 77, 45, 50, 248), ), new PokemonSpecies(Species.BLIPBUG, 8, false, false, false, "Larva Pokémon", Type.BUG, null, 0.4, 8, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DOTTLER, 8, false, false, false, "Radome Pokémon", Type.BUG, Type.PSYCHIC, 0.4, 19.5, Abilities.SWARM, Abilities.COMPOUND_EYES, Abilities.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", Type.BUG, Type.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.BUG, Type.PSYCHIC, 0.4, 40.8, Abilities.SWARM, Abilities.FRISK, Abilities.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.PSYCHIC, 14, 40.8, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 90, 45, 130, 110, 140, 90, 45, 50, 253), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.PSYCHIC, 14, 999.9, Abilities.TRACE, Abilities.TRACE, Abilities.TRACE, 605, 90, 45, 130, 110, 140, 90, 45, 50, 253), ), new PokemonSpecies(Species.NICKIT, 8, false, false, false, "Fox Pokémon", Type.DARK, null, 0.6, 8.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.THIEVUL, 8, false, false, false, "Fox Pokémon", Type.DARK, null, 1.2, 19.9, Abilities.RUN_AWAY, Abilities.UNBURDEN, Abilities.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), @@ -2310,7 +2310,7 @@ export function initSpecies() { new PokemonSpecies(Species.CHEWTLE, 8, false, false, false, "Snapping Pokémon", Type.WATER, null, 0.3, 8.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.DREDNAW, 8, false, false, false, "Bite Pokémon", Type.WATER, Type.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.WATER, Type.ROCK, 1, 115.5, Abilities.STRONG_JAW, Abilities.SHELL_ARMOR, Abilities.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ROCK, 24, 115.5, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 145, 115, 43, 83, 84, 75, 50, 170), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, Type.ROCK, 24, 999.9, Abilities.STRONG_JAW, Abilities.STRONG_JAW, Abilities.STRONG_JAW, 585, 115, 145, 115, 43, 83, 84, 75, 50, 170), ), new PokemonSpecies(Species.YAMPER, 8, false, false, false, "Puppy Pokémon", Type.ELECTRIC, null, 0.3, 13.5, Abilities.BALL_FETCH, Abilities.NONE, Abilities.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.BOLTUND, 8, false, false, false, "Dog Pokémon", Type.ELECTRIC, null, 1, 34, Abilities.STRONG_JAW, Abilities.NONE, Abilities.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), @@ -2318,21 +2318,21 @@ export function initSpecies() { new PokemonSpecies(Species.CARKOL, 8, false, false, false, "Coal Pokémon", Type.ROCK, Type.FIRE, 1.1, 78, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.COALOSSAL, 8, false, false, false, "Coal Pokémon", Type.ROCK, Type.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Normal", "", Type.ROCK, Type.FIRE, 2.8, 310.5, Abilities.STEAM_ENGINE, Abilities.FLAME_BODY, Abilities.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ROCK, Type.FIRE, 42, 310.5, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 95, 130, 95, 110, 40, 45, 50, 255), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ROCK, Type.FIRE, 42, 999.9, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, Abilities.STEAM_ENGINE, 610, 140, 95, 130, 95, 110, 40, 45, 50, 255), ), new PokemonSpecies(Species.APPLIN, 8, false, false, false, "Apple Core Pokémon", Type.GRASS, Type.DRAGON, 0.2, 0.5, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), new PokemonSpecies(Species.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", Type.GRASS, Type.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, new PokemonForm("Normal", "", Type.GRASS, Type.DRAGON, 0.3, 1, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 1, Abilities.HUSTLE, Abilities.HUSTLE, Abilities.HUSTLE, 585, 90, 130, 100, 85, 80, 100, 45, 50, 170), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 999.9, Abilities.HUSTLE, Abilities.HUSTLE, Abilities.HUSTLE, 585, 90, 130, 100, 85, 80, 100, 45, 50, 170), ), new PokemonSpecies(Species.APPLETUN, 8, false, false, false, "Apple Nectar Pokémon", Type.GRASS, Type.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, new PokemonForm("Normal", "", Type.GRASS, Type.DRAGON, 0.4, 13, Abilities.RIPEN, Abilities.GLUTTONY, Abilities.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 13, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 585, 130, 75, 115, 125, 115, 25, 45, 50, 170), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, Type.DRAGON, 24, 999.9, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 585, 130, 75, 115, 125, 115, 25, 45, 50, 170), ), new PokemonSpecies(Species.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", Type.GROUND, null, 2.2, 7.6, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", Type.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.GROUND, null, 3.8, 65.5, Abilities.SAND_SPIT, Abilities.SHED_SKIN, Abilities.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GROUND, null, 22, 65.5, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 117, 137, 140, 55, 80, 81, 120, 50, 179), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GROUND, null, 22, 999.9, Abilities.SAND_SPIT, Abilities.SAND_SPIT, Abilities.SAND_SPIT, 610, 117, 137, 140, 55, 80, 81, 120, 50, 179), ), new PokemonSpecies(Species.CRAMORANT, 8, false, false, false, "Gulp Pokémon", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Normal", "", Type.FLYING, Type.WATER, 0.8, 18, Abilities.GULP_MISSILE, Abilities.NONE, Abilities.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, false, null, true), @@ -2345,12 +2345,12 @@ export function initSpecies() { new PokemonSpecies(Species.TOXTRICITY, 8, false, false, false, "Punk Pokémon", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, GrowthRate.MEDIUM_SLOW, 50, false, true, new PokemonForm("Amped Form", "amped", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.PLUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "", true), new PokemonForm("Low-Key Form", "lowkey", Type.ELECTRIC, Type.POISON, 1.6, 40, Abilities.PUNK_ROCK, Abilities.MINUS, Abilities.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "lowkey", true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, Type.POISON, 24, 40, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, 602, 114, 98, 82, 144, 82, 82, 45, 50, 176), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.ELECTRIC, Type.POISON, 24, 999.9, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, Abilities.PUNK_ROCK, 602, 114, 98, 82, 144, 82, 82, 45, 50, 176), ), new PokemonSpecies(Species.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", Type.FIRE, Type.BUG, 0.7, 1, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", Type.FIRE, Type.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.FIRE, Type.BUG, 3, 120, Abilities.FLASH_FIRE, Abilities.WHITE_SMOKE, Abilities.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.BUG, 75, 120, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 140, 145, 75, 90, 100, 75, 75, 50, 184), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, Type.BUG, 75, 999.9, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, Abilities.FLASH_FIRE, 625, 140, 145, 75, 90, 100, 75, 75, 50, 184), ), new PokemonSpecies(Species.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", Type.FIGHTING, null, 0.6, 4, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", Type.FIGHTING, null, 1.6, 39, Abilities.LIMBER, Abilities.NONE, Abilities.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), @@ -2366,13 +2366,13 @@ export function initSpecies() { new PokemonSpecies(Species.HATTREM, 8, false, false, false, "Serene Pokémon", Type.PSYCHIC, null, 0.6, 4.8, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), new PokemonSpecies(Species.HATTERENE, 8, false, false, false, "Silent Pokémon", Type.PSYCHIC, Type.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, GrowthRate.SLOW, 0, false, true, new PokemonForm("Normal", "", Type.PSYCHIC, Type.FAIRY, 2.1, 5.1, Abilities.HEALER, Abilities.ANTICIPATION, Abilities.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.PSYCHIC, Type.FAIRY, 26, 5.1, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 610, 97, 90, 105, 146, 122, 50, 45, 50, 255), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.PSYCHIC, Type.FAIRY, 26, 999.9, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, Abilities.MAGIC_BOUNCE, 610, 97, 90, 105, 146, 122, 50, 45, 50, 255), ), new PokemonSpecies(Species.IMPIDIMP, 8, false, false, false, "Wily Pokémon", Type.DARK, Type.FAIRY, 0.4, 5.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 265, 45, 45, 30, 55, 40, 50, 255, 50, 53, GrowthRate.MEDIUM_FAST, 100, false), new PokemonSpecies(Species.MORGREM, 8, false, false, false, "Devious Pokémon", Type.DARK, Type.FAIRY, 0.8, 12.5, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 370, 65, 60, 45, 75, 55, 70, 120, 50, 130, GrowthRate.MEDIUM_FAST, 100, false), new PokemonSpecies(Species.GRIMMSNARL, 8, false, false, false, "Bulk Up Pokémon", Type.DARK, Type.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, GrowthRate.MEDIUM_FAST, 100, false, true, new PokemonForm("Normal", "", Type.DARK, Type.FAIRY, 1.5, 61, Abilities.PRANKSTER, Abilities.FRISK, Abilities.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.DARK, Type.FAIRY, 32, 61, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 610, 135, 138, 77, 110, 85, 65, 45, 50, 255), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.DARK, Type.FAIRY, 32, 999.9, Abilities.PRANKSTER, Abilities.PRANKSTER, Abilities.PRANKSTER, 610, 135, 138, 77, 110, 85, 65, 45, 50, 255), ), new PokemonSpecies(Species.OBSTAGOON, 8, false, false, false, "Blocking Pokémon", Type.DARK, Type.NORMAL, 1.6, 46, Abilities.RECKLESS, Abilities.GUTS, Abilities.DEFIANT, 520, 93, 90, 101, 60, 81, 95, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PERRSERKER, 8, false, false, false, "Viking Pokémon", Type.STEEL, null, 0.8, 28, Abilities.BATTLE_ARMOR, Abilities.TOUGH_CLAWS, Abilities.STEELY_SPIRIT, 440, 70, 110, 100, 50, 60, 50, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), @@ -2391,7 +2391,7 @@ export function initSpecies() { new PokemonForm("Ruby Swirl", "ruby-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), new PokemonForm("Caramel Swirl", "caramel-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), new PokemonForm("Rainbow Swirl", "rainbow-swirl", Type.FAIRY, null, 0.3, 0.5, Abilities.SWEET_VEIL, Abilities.NONE, Abilities.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FAIRY, null, 30, 0.5, Abilities.MISTY_SURGE, Abilities.MISTY_SURGE, Abilities.MISTY_SURGE, 595, 135, 60, 75, 130, 131, 64, 100, 50, 173), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FAIRY, null, 30, 999.9, Abilities.MISTY_SURGE, Abilities.MISTY_SURGE, Abilities.MISTY_SURGE, 595, 135, 60, 75, 130, 131, 64, 100, 50, 173), ), new PokemonSpecies(Species.FALINKS, 8, false, false, false, "Formation Pokémon", Type.FIGHTING, null, 3, 62, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), new PokemonSpecies(Species.PINCURCHIN, 8, false, false, false, "Sea Urchin Pokémon", Type.ELECTRIC, null, 0.3, 1, Abilities.LIGHTNING_ROD, Abilities.NONE, Abilities.ELECTRIC_SURGE, 435, 48, 101, 95, 91, 85, 15, 75, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), @@ -2413,7 +2413,7 @@ export function initSpecies() { new PokemonSpecies(Species.CUFANT, 8, false, false, false, "Copperderm Pokémon", Type.STEEL, null, 1.2, 100, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", Type.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.STEEL, null, 3, 650, Abilities.SHEER_FORCE, Abilities.NONE, Abilities.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.GROUND, 23, 650, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, 600, 167, 155, 89, 80, 89, 20, 90, 50, 175), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.GROUND, 23, 999.9, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, Abilities.MOLD_BREAKER, 600, 167, 155, 89, 80, 89, 20, 90, 50, 175), ), new PokemonSpecies(Species.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", Type.ELECTRIC, Type.DRAGON, 1.8, 190, Abilities.VOLT_ABSORB, Abilities.HUSTLE, Abilities.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", Type.ELECTRIC, Type.ICE, 2.3, 150, Abilities.VOLT_ABSORB, Abilities.STATIC, Abilities.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), @@ -2421,7 +2421,7 @@ export function initSpecies() { new PokemonSpecies(Species.ARCTOVISH, 8, false, false, false, "Fossil Pokémon", Type.WATER, Type.ICE, 2, 175, Abilities.WATER_ABSORB, Abilities.ICE_BODY, Abilities.SLUSH_RUSH, 505, 90, 90, 100, 80, 90, 55, 45, 50, 177, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.DURALUDON, 8, false, false, false, "Alloy Pokémon", Type.STEEL, Type.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false, true, new PokemonForm("Normal", "", Type.STEEL, Type.DRAGON, 1.8, 40, Abilities.LIGHT_METAL, Abilities.HEAVY_METAL, Abilities.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.DRAGON, 43, 40, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 635, 100, 105, 119, 166, 57, 88, 45, 50, 187), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.STEEL, Type.DRAGON, 43, 999.9, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, Abilities.LIGHTNING_ROD, 635, 100, 110, 120, 175, 60, 70, 45, 50, 187), ), new PokemonSpecies(Species.DREEPY, 8, false, false, false, "Lingering Pokémon", Type.DRAGON, Type.GHOST, 0.5, 2, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 270, 28, 60, 30, 40, 30, 82, 45, 50, 54, GrowthRate.SLOW, 50, false), new PokemonSpecies(Species.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", Type.DRAGON, Type.GHOST, 1.4, 11, Abilities.CLEAR_BODY, Abilities.INFILTRATOR, Abilities.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), @@ -2436,14 +2436,14 @@ export function initSpecies() { ), new PokemonSpecies(Species.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, new PokemonForm("Normal", "", Type.POISON, Type.DRAGON, 20, 950, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), - new PokemonForm("E-Max", "eternamax", Type.POISON, Type.DRAGON, 100, 0, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345), + new PokemonForm("E-Max", "eternamax", Type.POISON, Type.DRAGON, 100, 999.9, Abilities.PRESSURE, Abilities.NONE, Abilities.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345), ), new PokemonSpecies(Species.KUBFU, 8, true, false, false, "Wushu Pokémon", Type.FIGHTING, null, 0.6, 12, Abilities.INNER_FOCUS, Abilities.NONE, Abilities.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false), new PokemonSpecies(Species.URSHIFU, 8, true, false, false, "Wushu Pokémon", Type.FIGHTING, Type.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, new PokemonForm("Single Strike Style", "single-strike", Type.FIGHTING, Type.DARK, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), new PokemonForm("Rapid Strike Style", "rapid-strike", Type.FIGHTING, Type.WATER, 1.9, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), - new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, Type.FIGHTING, Type.DARK, 29, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), - new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, Type.FIGHTING, Type.WATER, 26, 105, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), + new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, Type.FIGHTING, Type.DARK, 29, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), + new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, Type.FIGHTING, Type.WATER, 26, 999.9, Abilities.UNSEEN_FIST, Abilities.NONE, Abilities.NONE, 650, 125, 150, 115, 73, 70, 117, 3, 50, 275), ), new PokemonSpecies(Species.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, new PokemonForm("Normal", "", Type.DARK, Type.GRASS, 1.8, 70, Abilities.LEAF_GUARD, Abilities.NONE, Abilities.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index ec600a62210..3703605d74e 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1613,7 +1613,6 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.TEMP_STAT_STAGE_BOOSTER, 4), new WeightedModifierType(modifierTypes.BERRY, 2), new WeightedModifierType(modifierTypes.TM_COMMON, 2), - new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1), ].map(m => { m.setTier(ModifierTier.COMMON); return m; }), @@ -1684,7 +1683,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BASE_STAT_BOOSTER, 3), new WeightedModifierType(modifierTypes.TERA_SHARD, 1), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 4 : 0), - new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 3, 0) : 0, 3), + new WeightedModifierType(modifierTypes.VOUCHER, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(1 - rerollCount, 0) : 0, 1), ].map(m => { m.setTier(ModifierTier.GREAT); return m; }), @@ -1765,7 +1764,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24), new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36), - new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(9 - rerollCount * 3, 0) : 0, 9), + new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3), ].map(m => { m.setTier(ModifierTier.ROGUE); return m; }), @@ -1774,7 +1773,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.SHINY_CHARM, 14), new WeightedModifierType(modifierTypes.HEALING_CHARM, 18), new WeightedModifierType(modifierTypes.MULTI_LENS, 18), - new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(15 - rerollCount * 5, 0) : 0, 15), + new WeightedModifierType(modifierTypes.VOUCHER_PREMIUM, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily && !party[0].scene.gameMode.isEndless && !party[0].scene.gameMode.isSplicedOnly ? Math.max(5 - rerollCount * 2, 0) : 0, 5), new WeightedModifierType(modifierTypes.DNA_SPLICERS, (party: Pokemon[]) => !party[0].scene.gameMode.isSplicedOnly && party.filter(p => !p.fusionSpecies).length > 1 ? 24 : 0, 24), new WeightedModifierType(modifierTypes.MINI_BLACK_HOLE, (party: Pokemon[]) => (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.MINI_BLACK_HOLE]) ? 1 : 0, 1), ].map(m => { diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index 55b2a1608c0..e925f0c47d4 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -30,7 +30,7 @@ export class TrainerVictoryPhase extends BattlePhase { const trainerType = this.scene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct? if (vouchers.hasOwnProperty(TrainerType[trainerType])) { if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer?.config.isBoss) { - this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType])); + this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, [modifierTypes.VOUCHER, modifierTypes.VOUCHER, modifierTypes.VOUCHER_PLUS, modifierTypes.VOUCHER_PREMIUM][vouchers[TrainerType[trainerType]].voucherType])); } } From 77f0fe6e4b409f1f705b03086cf853d9499d1e1a Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Fri, 13 Sep 2024 22:54:22 -0700 Subject: [PATCH 04/17] [Enhancement][EnemyAI] Add support for simulated damage calculations and "Search for KO" move filtering (#3975) * Create getAttackDamage function * Add ignoreAbility params to getBattleStat * Rewrite Pokemon.apply * renamed damage variables * Add `ignoreSourceAbility` arg to `getAttackDamage` * Enemy AI now searches for KO moves * Add probabilistic test for KO search * Add tests to `damage_calculation` * "killMoves" --> "koMoves" * Clean up `randomMultiplier` * Clean up damage calculation test Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Fix stabMultiplier using base type for Tera bonus * Restore simulation capabilities for Unaware * move sourceTeraType closer to where it's used * Add base damage test * Exclude counter moves from KO search --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/move.ts | 2 +- src/field/pokemon.ts | 697 ++++++++++++--------- src/test/battle/damage_calculation.test.ts | 109 +++- src/test/enemy_command.test.ts | 75 +++ 4 files changed, 568 insertions(+), 315 deletions(-) create mode 100644 src/test/enemy_command.test.ts diff --git a/src/data/move.ts b/src/data/move.ts index e828c425d08..732a1feea0c 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -3977,7 +3977,7 @@ export class StatusCategoryOnAllyAttr extends VariableMoveCategoryAttr { export class ShellSideArmCategoryAttr extends VariableMoveCategoryAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const category = (args[0] as Utils.IntegerHolder); + const category = (args[0] as Utils.NumberHolder); const atkRatio = user.getEffectiveStat(Stat.ATK, target, move) / target.getEffectiveStat(Stat.DEF, user, move); const specialRatio = user.getEffectiveStat(Stat.SPATK, target, move) / target.getEffectiveStat(Stat.SPDEF, user, move); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ea1b7fba372..a74b2643eef 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,7 +3,7 @@ import BattleScene, { AnySound } from "../battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr } from "../data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget } from "../data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species"; import { Constructor, isNullOrUndefined, randSeedInt } from "#app/utils"; import * as Utils from "../utils"; @@ -870,22 +870,29 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param stat the desired {@linkcode EffectiveStat} * @param opponent the target {@linkcode Pokemon} * @param move the {@linkcode Move} being used + * @param ignoreAbility determines whether this Pokemon's abilities should be ignored during the stat calculation + * @param ignoreOppAbility during an attack, determines whether the opposing Pokemon's abilities should be ignored during the stat calculation. * @param isCritical determines whether a critical hit has occurred or not (`false` by default) + * @param simulated if `true`, nullifies any effects that produce any changes to game state from triggering * @returns the final in-battle value of a stat */ - getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer { + getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreAbility: boolean = false, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): integer { const statValue = new Utils.NumberHolder(this.getStat(stat, false)); this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue); + // The Ruin abilities here are never ignored, but they reveal themselves on summon anyway const fieldApplied = new Utils.BooleanHolder(false); for (const pokemon of this.scene.getField(true)) { - applyFieldStatMultiplierAbAttrs(FieldMultiplyStatAbAttr, pokemon, stat, statValue, this, fieldApplied); + applyFieldStatMultiplierAbAttrs(FieldMultiplyStatAbAttr, pokemon, stat, statValue, this, fieldApplied, simulated); if (fieldApplied.value) { break; } } - applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue); - let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, isCritical); + if (!ignoreAbility) { + applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue, simulated); + } + + let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, ignoreOppAbility, isCritical, simulated); switch (stat) { case Stat.ATK: @@ -2223,10 +2230,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param stat the desired {@linkcode EffectiveStat} * @param opponent the target {@linkcode Pokemon} * @param move the {@linkcode Move} being used + * @param ignoreOppAbility determines whether the effects of the opponent's abilities (i.e. Unaware) should be ignored (`false` by default) * @param isCritical determines whether a critical hit has occurred or not (`false` by default) + * @param simulated determines whether effects are applied without altering game state (`true` by default) * @return the stat stage multiplier to be used for effective stat calculation */ - getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): number { + getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, ignoreOppAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): number { const statStage = new Utils.IntegerHolder(this.getStatStage(stat)); const ignoreStatStage = new Utils.BooleanHolder(false); @@ -2243,7 +2252,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { break; } } - applyAbAttrs(IgnoreOpponentStatStagesAbAttr, opponent, null, false, stat, ignoreStatStage); + if (!ignoreOppAbility) { + applyAbAttrs(IgnoreOpponentStatStagesAbAttr, opponent, null, simulated, stat, ignoreStatStage); + } if (move) { applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, opponent, move, ignoreStatStage); } @@ -2308,13 +2319,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Apply the results of a move to this pokemon - * @param {Pokemon} source The pokemon using the move - * @param {PokemonMove} battlerMove The move being used - * @returns {HitResult} The result of the attack - */ - apply(source: Pokemon, move: Move): HitResult { - let result: HitResult; + * Calculates the damage of an attack made by another Pokemon against this Pokemon + * @param source {@linkcode Pokemon} the attacking Pokemon + * @param move {@linkcode Pokemon} the move used in the attack + * @param ignoreAbility If `true`, ignores this Pokemon's defensive ability effects + * @param isCritical If `true`, calculates damage for a critical hit. + * @param simulated If `true`, suppresses changes to game state during the calculation. + * @returns a {@linkcode DamageCalculationResult} object with three fields: + * - `cancelled`: `true` if the move was cancelled by another effect. + * - `result`: {@linkcode HitResult} indicates the attack's type effectiveness. + * - `damage`: `number` the attack's final damage output. + */ + getAttackDamage(source: Pokemon, move: Move, ignoreAbility: boolean = false, ignoreSourceAbility: boolean = false, isCritical: boolean = false, simulated: boolean = true): DamageCalculationResult { const damage = new Utils.NumberHolder(0); const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; @@ -2332,291 +2348,354 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * The effectiveness of the move being used. Along with type matchups, this * accounts for changes in effectiveness from the move's attributes and the * abilities of both the source and this Pokemon. + * + * Note that the source's abilities are not ignored here */ - const typeMultiplier = this.getMoveEffectiveness(source, move, false, false, cancelled); + const typeMultiplier = this.getMoveEffectiveness(source, move, ignoreAbility, simulated, cancelled); - switch (moveCategory) { - case MoveCategory.PHYSICAL: - case MoveCategory.SPECIAL: - const isPhysical = moveCategory === MoveCategory.PHYSICAL; - const sourceTeraType = source.getTeraType(); + const isPhysical = moveCategory === MoveCategory.PHYSICAL; - const power = move.calculateBattlePower(source, this); + /** Combined damage multiplier from field effects such as weather, terrain, etc. */ + const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(moveType, source.isGrounded())); + applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); - if (cancelled.value) { - // Cancelled moves fail silently - source.stopMultiHit(this); - return HitResult.NO_EFFECT; - } else { - const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === moveType) as TypeBoostTag; - if (typeBoost?.oneUse) { - source.removeTag(typeBoost.tagType); + const isTypeImmune = (typeMultiplier * arenaAttackTypeMultiplier.value) === 0; + + if (cancelled.value || isTypeImmune) { + return { + cancelled: cancelled.value, + result: move.id === Moves.SHEER_COLD ? HitResult.IMMUNE : HitResult.NO_EFFECT, + damage: 0 + }; + } + + // If the attack deals fixed damaged, return a result with that much damage + const fixedDamage = new Utils.IntegerHolder(0); + applyMoveAttrs(FixedDamageAttr, source, this, move, fixedDamage); + if (fixedDamage.value) { + return { + cancelled: false, + result: HitResult.EFFECTIVE, + damage: fixedDamage.value + }; + } + + // If the attack is a one-hit KO move, return a result with damage equal to this Pokemon's HP + const isOneHitKo = new Utils.BooleanHolder(false); + applyMoveAttrs(OneHitKOAttr, source, this, move, isOneHitKo); + if (isOneHitKo.value) { + return { + cancelled: false, + result: HitResult.ONE_HIT_KO, + damage: this.hp + }; + } + + // ----- BEGIN BASE DAMAGE MULTIPLIERS ----- + + /** A base damage multiplier based on the source's level */ + const levelMultiplier = (2 * source.level / 5 + 2); + + /** The power of the move after power boosts from abilities, etc. have applied */ + const power = move.calculateBattlePower(source, this, simulated); + + /** + * The attacker's offensive stat for the given move's category. + * Critical hits ignore negative stat stages. + */ + const sourceAtk = new Utils.NumberHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, ignoreSourceAbility, ignoreAbility, isCritical, simulated)); + applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); + + /** + * This Pokemon's defensive stat for the given move's category. + * Critical hits ignore positive stat stages. + */ + const targetDef = new Utils.NumberHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, ignoreAbility, ignoreSourceAbility, isCritical, simulated)); + applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); + + /** + * The attack's base damage, as determined by the source's level, move power + * and Attack stat as well as this Pokemon's Defense stat + */ + const baseDamage = ((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2; + + // ------ END BASE DAMAGE MULTIPLIERS ------ + + /** 25% damage debuff on moves hitting more than one non-fainted target (regardless of immunities) */ + const { targets, multiple } = getMoveTargets(source, move.id); + const numTargets = multiple ? targets.length : 1; + const targetMultiplier = (numTargets > 1) ? 0.75 : 1; + + /** 0.25x multiplier if this is an added strike from the attacker's Parental Bond */ + const parentalBondMultiplier = new Utils.NumberHolder(1); + if (!ignoreSourceAbility) { + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, simulated, numTargets, new Utils.IntegerHolder(0), parentalBondMultiplier); + } + + /** Doubles damage if this Pokemon's last move was Glaive Rush */ + const glaiveRushMultiplier = new Utils.IntegerHolder(1); + if (this.getTag(BattlerTagType.RECEIVE_DOUBLE_DAMAGE)) { + glaiveRushMultiplier.value = 2; + } + + /** The damage multiplier when the given move critically hits */ + const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1); + applyAbAttrs(MultCritAbAttr, source, null, simulated, criticalMultiplier); + + /** + * A multiplier for random damage spread in the range [0.85, 1] + * This is always 1 for simulated calls. + */ + const randomMultiplier = simulated ? 1 : ((this.randSeedIntRange(85, 100)) / 100); + + const sourceTypes = source.getTypes(); + const sourceTeraType = source.getTeraType(); + const matchesSourceType = sourceTypes.includes(moveType); + /** A damage multiplier for when the attack is of the attacker's type and/or Tera type. */ + const stabMultiplier = new Utils.NumberHolder(1); + if (matchesSourceType) { + stabMultiplier.value += 0.5; + } + if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === moveType) { + stabMultiplier.value += 0.5; + } + + if (!ignoreSourceAbility) { + applyAbAttrs(StabBoostAbAttr, source, null, simulated, stabMultiplier); + } + + stabMultiplier.value = Math.min(stabMultiplier.value, 2.25); + + /** Halves damage if the attacker is using a physical attack while burned */ + const burnMultiplier = new Utils.NumberHolder(1); + if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { + if (!move.hasAttr(BypassBurnDamageReductionAttr)) { + const burnDamageReductionCancelled = new Utils.BooleanHolder(false); + if (!ignoreSourceAbility) { + applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled, simulated); } - - /** Combined damage multiplier from field effects such as weather, terrain, etc. */ - const arenaAttackTypeMultiplier = new Utils.NumberHolder(this.scene.arena.getAttackTypeMultiplier(moveType, source.isGrounded())); - applyMoveAttrs(IgnoreWeatherTypeDebuffAttr, source, this, move, arenaAttackTypeMultiplier); - - /** - * Whether or not this Pokemon is immune to the incoming move. - * Note that this isn't fully resolved in `getMoveEffectiveness` because - * of possible type-suppressing field effects (e.g. Desolate Land's effect on Water-type attacks). - */ - const isTypeImmune = (typeMultiplier * arenaAttackTypeMultiplier.value) === 0; - if (isTypeImmune) { - // Moves with no effect that were not cancelled queue a "no effect" message before failing - source.stopMultiHit(this); - result = (move.id === Moves.SHEER_COLD) - ? HitResult.IMMUNE - : HitResult.NO_EFFECT; - - if (result === HitResult.IMMUNE) { - this.scene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: this.name })); - } else { - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); - } - - return result; - } - - const glaiveRushModifier = new Utils.IntegerHolder(1); - if (this.getTag(BattlerTagType.RECEIVE_DOUBLE_DAMAGE)) { - glaiveRushModifier.value = 2; - } - let isCritical: boolean; - const critOnly = new Utils.BooleanHolder(false); - const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); - applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); - applyAbAttrs(ConditionalCritAbAttr, source, null, false, critOnly, this, move); - if (critOnly.value || critAlways) { - isCritical = true; - } else { - const critChance = [24, 8, 2, 1][Math.max(0, Math.min(this.getCritStage(source, move), 3))]; - isCritical = critChance === 1 || !this.scene.randBattleSeedInt(critChance); - if (Overrides.NEVER_CRIT_OVERRIDE) { - isCritical = false; - } - } - if (isCritical) { - const noCritTag = this.scene.arena.getTagOnSide(NoCritTag, defendingSide); - const blockCrit = new Utils.BooleanHolder(false); - applyAbAttrs(BlockCritAbAttr, this, null, false, blockCrit); - if (noCritTag || blockCrit.value) { - isCritical = false; - } - } - const sourceAtk = new Utils.IntegerHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, isCritical)); - const targetDef = new Utils.IntegerHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical)); - const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1); - applyAbAttrs(MultCritAbAttr, source, null, false, criticalMultiplier); - const screenMultiplier = new Utils.NumberHolder(1); - if (!isCritical) { - this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, move.category, this.scene.currentBattle.double, screenMultiplier); - } - const sourceTypes = source.getTypes(); - const matchesSourceType = sourceTypes[0] === moveType || (sourceTypes.length > 1 && sourceTypes[1] === moveType); - const stabMultiplier = new Utils.NumberHolder(1); - if (sourceTeraType === Type.UNKNOWN && matchesSourceType) { - stabMultiplier.value += 0.5; - } else if (sourceTeraType !== Type.UNKNOWN && sourceTeraType === moveType) { - stabMultiplier.value += 0.5; - } - - applyAbAttrs(StabBoostAbAttr, source, null, false, stabMultiplier); - - if (sourceTeraType !== Type.UNKNOWN && matchesSourceType) { - stabMultiplier.value = Math.min(stabMultiplier.value + 0.5, 2.25); - } - - // 25% damage debuff on moves hitting more than one non-fainted target (regardless of immunities) - const { targets, multiple } = getMoveTargets(source, move.id); - const targetMultiplier = (multiple && targets.length > 1) ? 0.75 : 1; - - applyMoveAttrs(VariableAtkAttr, source, this, move, sourceAtk); - applyMoveAttrs(VariableDefAttr, source, this, move, targetDef); - - const effectPhase = this.scene.getCurrentPhase(); - let numTargets = 1; - if (effectPhase instanceof MoveEffectPhase) { - numTargets = effectPhase.getTargets().length; - } - const twoStrikeMultiplier = new Utils.NumberHolder(1); - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, source, this, move, false, numTargets, new Utils.IntegerHolder(0), twoStrikeMultiplier); - - if (!isTypeImmune) { - const levelMultiplier = (2 * source.level / 5 + 2); - const randomMultiplier = (this.randSeedIntRange(85, 100) / 100); - damage.value = Utils.toDmgValue((((levelMultiplier * power * sourceAtk.value / targetDef.value) / 50) + 2) - * stabMultiplier.value - * typeMultiplier - * arenaAttackTypeMultiplier.value - * screenMultiplier.value - * twoStrikeMultiplier.value - * targetMultiplier - * criticalMultiplier.value - * glaiveRushModifier.value - * randomMultiplier); - - if (isPhysical && source.status && source.status.effect === StatusEffect.BURN) { - if (!move.hasAttr(BypassBurnDamageReductionAttr)) { - const burnDamageReductionCancelled = new Utils.BooleanHolder(false); - applyAbAttrs(BypassBurnDamageReductionAbAttr, source, burnDamageReductionCancelled, false); - if (!burnDamageReductionCancelled.value) { - damage.value = Utils.toDmgValue(damage.value / 2); - } - } - } - - applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, move, false, damage); - - /** - * For each {@link HitsTagAttr} the move has, doubles the damage of the move if: - * The target has a {@link BattlerTagType} that this move interacts with - * AND - * The move doubles damage when used against that tag - */ - move.getAttrs(HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { - if (this.getTag(hta.tagType)) { - damage.value *= 2; - } - }); - } - - if (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && moveType === Type.DRAGON) { - damage.value = Utils.toDmgValue(damage.value / 2); - } - - const fixedDamage = new Utils.IntegerHolder(0); - applyMoveAttrs(FixedDamageAttr, source, this, move, fixedDamage); - if (!isTypeImmune && fixedDamage.value) { - damage.value = fixedDamage.value; - isCritical = false; - result = HitResult.EFFECTIVE; - } - result = result!; // telling TS compiler that result is defined! - - if (!result) { - const isOneHitKo = new Utils.BooleanHolder(false); - applyMoveAttrs(OneHitKOAttr, source, this, move, isOneHitKo); - if (isOneHitKo.value) { - result = HitResult.ONE_HIT_KO; - isCritical = false; - damage.value = this.hp; - } else if (typeMultiplier >= 2) { - result = HitResult.SUPER_EFFECTIVE; - } else if (typeMultiplier >= 1) { - result = HitResult.EFFECTIVE; - } else { - result = HitResult.NOT_VERY_EFFECTIVE; - } - } - - const isOneHitKo = result === HitResult.ONE_HIT_KO; - - if (!fixedDamage.value && !isOneHitKo) { - if (!source.isPlayer()) { - this.scene.applyModifiers(EnemyDamageBoosterModifier, false, damage); - } - if (!this.isPlayer()) { - this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage); - } - - applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, false, damage); - } - - // This attribute may modify damage arbitrarily, so be careful about changing its order of application. - applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); - - console.log("damage", damage.value, move.name, power, sourceAtk, targetDef); - - // In case of fatal damage, this tag would have gotten cleared before we could lapse it. - const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); - - if (damage.value) { - this.lapseTags(BattlerTagLapseType.HIT); - - const substitute = this.getTag(SubstituteTag); - if (substitute && move.hitsSubstitute(source, this)) { - substitute.hp -= damage.value; - damage.value = 0; - } - if (this.isFullHp()) { - applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, false, damage); - } else if (!this.isPlayer() && damage.value >= this.hp) { - this.scene.applyModifiers(EnemyEndureChanceModifier, false, this); - } - - /** - * We explicitly require to ignore the faint phase here, as we want to show the messages - * about the critical hit and the super effective/not very effective messages before the faint phase. - */ - damage.value = this.damageAndUpdate(damage.value, result as DamageResult, isCritical, isOneHitKo, isOneHitKo, true); - this.turnData.damageTaken += damage.value; - - if (isCritical) { - this.scene.queueMessage(i18next.t("battle:hitResultCriticalHit")); - } - if (source.isPlayer()) { - this.scene.validateAchvs(DamageAchv, damage); - if (damage.value > this.scene.gameData.gameStats.highestDamage) { - this.scene.gameData.gameStats.highestDamage = damage.value; - } - } - - if (damage.value > 0) { - source.turnData.damageDealt += damage.value; - source.turnData.currDamageDealt = damage.value; - this.battleData.hitCount++; - const attackResult = { move: move.id, result: result as DamageResult, damage: damage.value, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; - this.turnData.attacksReceived.unshift(attackResult); - - if (source.isPlayer() && !this.isPlayer()) { - this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage); - } - } - } - - // want to include is.Fainted() in case multi hit move ends early, still want to render message - if (source.turnData.hitsLeft === 1 || this.isFainted()) { - switch (result) { - case HitResult.SUPER_EFFECTIVE: - this.scene.queueMessage(i18next.t("battle:hitResultSuperEffective")); - break; - case HitResult.NOT_VERY_EFFECTIVE: - this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); - break; - case HitResult.ONE_HIT_KO: - this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO")); - break; - case HitResult.IMMUNE: - case HitResult.NO_EFFECT: - console.error("Unhandled move immunity!"); - break; - } - } - - if (this.isFainted()) { - // set splice index here, so future scene queues happen before FaintedPhase - this.scene.setPhaseQueueSplice(); - this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), isOneHitKo)); - this.destroySubstitute(); - this.resetSummonData(); - } - - if (damage) { - destinyTag?.lapse(source, BattlerTagLapseType.CUSTOM); + if (!burnDamageReductionCancelled.value) { + burnMultiplier.value = 0.5; } } - break; - case MoveCategory.STATUS: + } + + /** Reduces damage if this Pokemon has a relevant screen (e.g. Light Screen for special attacks) */ + const screenMultiplier = new Utils.NumberHolder(1); + this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, move.category, this.scene.currentBattle.double, screenMultiplier); + + /** + * For each {@linkcode HitsTagAttr} the move has, doubles the damage of the move if: + * The target has a {@linkcode BattlerTagType} that this move interacts with + * AND + * The move doubles damage when used against that tag + */ + const hitsTagMultiplier = new Utils.NumberHolder(1); + move.getAttrs(HitsTagAttr).filter(hta => hta.doubleDamage).forEach(hta => { + if (this.getTag(hta.tagType)) { + hitsTagMultiplier.value *= 2; + } + }); + + /** Halves damage if this Pokemon is grounded in Misty Terrain against a Dragon-type attack */ + const mistyTerrainMultiplier = (this.scene.arena.terrain?.terrainType === TerrainType.MISTY && this.isGrounded() && moveType === Type.DRAGON) + ? 0.5 + : 1; + + damage.value = Utils.toDmgValue( + baseDamage + * targetMultiplier + * parentalBondMultiplier.value + * arenaAttackTypeMultiplier.value + * glaiveRushMultiplier.value + * criticalMultiplier.value + * randomMultiplier + * stabMultiplier.value + * typeMultiplier + * burnMultiplier.value + * screenMultiplier.value + * hitsTagMultiplier.value + * mistyTerrainMultiplier + ); + + /** Doubles damage if the attacker has Tinted Lens and is using a resisted move */ + if (!ignoreSourceAbility) { + applyPreAttackAbAttrs(DamageBoostAbAttr, source, this, move, simulated, damage); + } + + /** Apply the enemy's Damage and Resistance tokens */ + if (!source.isPlayer()) { + this.scene.applyModifiers(EnemyDamageBoosterModifier, false, damage); + } + if (!this.isPlayer()) { + this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage); + } + + /** Apply this Pokemon's post-calc defensive modifiers (e.g. Fur Coat) */ + if (!ignoreAbility) { + applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, simulated, damage); + } + + // This attribute may modify damage arbitrarily, so be careful about changing its order of application. + applyMoveAttrs(ModifiedDamageAttr, source, this, move, damage); + + if (this.isFullHp() && !ignoreAbility) { + applyPreDefendAbAttrs(PreDefendFullHpEndureAbAttr, this, source, move, cancelled, false, damage); + } + + // debug message for when damage is applied (i.e. not simulated) + if (!simulated) { + console.log("damage", damage.value, move.name, power, sourceAtk, targetDef); + } + + let hitResult: HitResult; + if (typeMultiplier < 1) { + hitResult = HitResult.NOT_VERY_EFFECTIVE; + } else if (typeMultiplier > 1) { + hitResult = HitResult.SUPER_EFFECTIVE; + } else { + hitResult = HitResult.EFFECTIVE; + } + + return { + cancelled: cancelled.value, + result: hitResult, + damage: damage.value + }; + } + + /** + * Applies the results of a move to this pokemon + * @param source The {@linkcode Pokemon} using the move + * @param move The {@linkcode Move} being used + * @returns The {@linkcode HitResult} of the attack + */ + apply(source: Pokemon, move: Move): HitResult { + const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + if (move.category === MoveCategory.STATUS) { + const cancelled = new Utils.BooleanHolder(false); + const typeMultiplier = this.getMoveEffectiveness(source, move, false, false, cancelled); + if (!cancelled.value && typeMultiplier === 0) { this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); } - result = (cancelled.value || typeMultiplier === 0) ? HitResult.NO_EFFECT : HitResult.STATUS; - break; - } + return (typeMultiplier === 0) ? HitResult.NO_EFFECT : HitResult.STATUS; + } else { + /** Determines whether the attack critically hits */ + let isCritical: boolean; + const critOnly = new Utils.BooleanHolder(false); + const critAlways = source.getTag(BattlerTagType.ALWAYS_CRIT); + applyMoveAttrs(CritOnlyAttr, source, this, move, critOnly); + applyAbAttrs(ConditionalCritAbAttr, source, null, false, critOnly, this, move); + if (critOnly.value || critAlways) { + isCritical = true; + } else { + const critChance = [24, 8, 2, 1][Math.max(0, Math.min(this.getCritStage(source, move), 3))]; + isCritical = critChance === 1 || !this.scene.randBattleSeedInt(critChance); + } - return result; + const noCritTag = this.scene.arena.getTagOnSide(NoCritTag, defendingSide); + const blockCrit = new Utils.BooleanHolder(false); + applyAbAttrs(BlockCritAbAttr, this, null, false, blockCrit); + if (noCritTag || blockCrit.value || Overrides.NEVER_CRIT_OVERRIDE) { + isCritical = false; + } + + const { cancelled, result, damage: dmg } = this.getAttackDamage(source, move, false, false, isCritical, false); + + const typeBoost = source.findTag(t => t instanceof TypeBoostTag && t.boostedType === source.getMoveType(move)) as TypeBoostTag; + if (typeBoost?.oneUse) { + source.removeTag(typeBoost.tagType); + } + + if (cancelled || result === HitResult.IMMUNE || result === HitResult.NO_EFFECT) { + source.stopMultiHit(this); + + if (!cancelled) { + if (result === HitResult.IMMUNE) { + this.scene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: getPokemonNameWithAffix(this) })); + } else { + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect")); + } + } + return result; + } + + if (isCritical) { + this.scene.queueMessage(i18next.t("battle:hitResultCriticalHit")); + } + + // In case of fatal damage, this tag would have gotten cleared before we could lapse it. + const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); + + const isOneHitKo = result === HitResult.ONE_HIT_KO; + + if (dmg) { + this.lapseTags(BattlerTagLapseType.HIT); + + const substitute = this.getTag(SubstituteTag); + const isBlockedBySubstitute = !!substitute && move.hitsSubstitute(source, this); + if (isBlockedBySubstitute) { + substitute.hp -= dmg; + } + if (!this.isPlayer() && dmg >= this.hp) { + this.scene.applyModifiers(EnemyEndureChanceModifier, false, this); + } + + /** + * We explicitly require to ignore the faint phase here, as we want to show the messages + * about the critical hit and the super effective/not very effective messages before the faint phase. + */ + const damage = this.damageAndUpdate(isBlockedBySubstitute ? 0 : dmg, result as DamageResult, isCritical, isOneHitKo, isOneHitKo, true); + + if (damage > 0) { + if (source.isPlayer()) { + this.scene.validateAchvs(DamageAchv, damage); + if (damage > this.scene.gameData.gameStats.highestDamage) { + this.scene.gameData.gameStats.highestDamage = damage; + } + } + source.turnData.damageDealt += damage; + source.turnData.currDamageDealt = damage; + this.turnData.damageTaken += damage; + this.battleData.hitCount++; + const attackResult = { move: move.id, result: result as DamageResult, damage: damage, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; + this.turnData.attacksReceived.unshift(attackResult); + if (source.isPlayer() && !this.isPlayer()) { + this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage); + } + } + } + + // want to include is.Fainted() in case multi hit move ends early, still want to render message + if (source.turnData.hitsLeft === 1 || this.isFainted()) { + switch (result) { + case HitResult.SUPER_EFFECTIVE: + this.scene.queueMessage(i18next.t("battle:hitResultSuperEffective")); + break; + case HitResult.NOT_VERY_EFFECTIVE: + this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); + break; + case HitResult.ONE_HIT_KO: + this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO")); + break; + } + } + + if (this.isFainted()) { + // set splice index here, so future scene queues happen before FaintedPhase + this.scene.setPhaseQueueSplice(); + this.scene.unshiftPhase(new FaintPhase(this.scene, this.getBattlerIndex(), isOneHitKo)); + this.destroySubstitute(); + this.resetSummonData(); + } + + if (dmg) { + destinyTag?.lapse(source, BattlerTagLapseType.CUSTOM); + } + + return result; + } } /** @@ -4287,7 +4366,7 @@ export class EnemyPokemon extends Pokemon { } // Filter out any moves this Pokemon cannot use - const movePool = this.getMoveset().filter(m => m?.isUsable(this)); + let movePool = this.getMoveset().filter(m => m?.isUsable(this)); // If no moves are left, use Struggle. Otherwise, continue with move selection if (movePool.length) { // If there's only 1 move in the move pool, use it. @@ -4308,6 +4387,36 @@ export class EnemyPokemon extends Pokemon { return { move: moveId, targets: this.getNextTargets(moveId) }; case AiType.SMART_RANDOM: case AiType.SMART: + /** + * Search this Pokemon's move pool for moves that will KO an opposing target. + * If there are any moves that can KO an opponent (i.e. a player Pokemon), + * those moves are the only ones considered for selection on this turn. + */ + const koMoves = movePool.filter(pkmnMove => { + if (!pkmnMove) { + return false; + } + + const move = pkmnMove.getMove()!; + if (move.moveTarget === MoveTarget.ATTACKER) { + return false; + } + + const fieldPokemon = this.scene.getField(); + const moveTargets = getMoveTargets(this, move.id).targets + .map(ind => fieldPokemon[ind]) + .filter(p => this.isPlayer() !== p.isPlayer()); + // Only considers critical hits for crit-only moves or when this Pokemon is under the effect of Laser Focus + const isCritical = move.hasAttr(CritOnlyAttr) || !!this.getTag(BattlerTagType.ALWAYS_CRIT); + + return move.category !== MoveCategory.STATUS + && moveTargets.some(p => p.getAttackDamage(this, move, !p.battleData.abilityRevealed, false, isCritical).damage >= p.hp); + }, this); + + if (koMoves.length > 0) { + movePool = koMoves; + } + /** * Move selection is based on the move's calculated "benefit score" against the * best possible target(s) (as determined by {@linkcode getNextTargets}). @@ -4779,6 +4888,16 @@ export enum HitResult { export type DamageResult = HitResult.EFFECTIVE | HitResult.SUPER_EFFECTIVE | HitResult.NOT_VERY_EFFECTIVE | HitResult.ONE_HIT_KO | HitResult.OTHER; +/** Interface containing the results of a damage calculation for a given move */ +export interface DamageCalculationResult { + /** `true` if the move was cancelled (thus suppressing "No Effect" messages) */ + cancelled: boolean; + /** The effectiveness of the move */ + result: HitResult; + /** The damage dealt by the move */ + damage: number; +} + /** * Wrapper class for the {@linkcode Move} class for Pokemon to interact with. * These are the moves assigned to a {@linkcode Pokemon} object. diff --git a/src/test/battle/damage_calculation.test.ts b/src/test/battle/damage_calculation.test.ts index 89f2bb4c269..a348df6c085 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/src/test/battle/damage_calculation.test.ts @@ -1,14 +1,13 @@ -import { DamagePhase } from "#app/phases/damage-phase"; -import { toDmgValue } from "#app/utils"; +import { allMoves } from "#app/data/move"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -describe("Round Down and Minimun 1 test in Damage Calculation", () => { +describe("Battle Mechanics - Damage Calculation", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -24,24 +23,86 @@ describe("Round Down and Minimun 1 test in Damage Calculation", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single"); - game.override.startingLevel(10); + game.override + .battleType("single") + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .startingLevel(100) + .enemyLevel(100) + .disableCrits() + .moveset([Moves.TACKLE, Moves.DRAGON_RAGE, Moves.FISSURE, Moves.JUMP_KICK]); + }); + + it("Tackle deals expected base damage", async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + vi.spyOn(playerPokemon, "getEffectiveStat").mockReturnValue(80); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "getEffectiveStat").mockReturnValue(90); + + // expected base damage = [(2*level/5 + 2) * power * playerATK / enemyDEF / 50] + 2 + // = 31.8666... + expect(enemyPokemon.getAttackDamage(playerPokemon, allMoves[Moves.TACKLE]).damage).toBeCloseTo(31); + }); + + it("Attacks deal 1 damage at minimum", async () => { + game.override + .startingLevel(1) + .enemySpecies(Species.AGGRON); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const aggron = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.TACKLE); + + await game.phaseInterceptor.to("BerryPhase", false); + + // Lvl 1 0 Atk Magikarp Tackle vs. 0 HP / 0 Def Aggron: 1-1 (0.3 - 0.3%) -- possibly the worst move ever + expect(aggron.hp).toBe(aggron.getMaxHp() - 1); + }); + + it("Fixed-damage moves ignore damage multipliers", async () => { + game.override + .enemySpecies(Species.DRAGONITE) + .enemyAbility(Abilities.MULTISCALE); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const magikarp = game.scene.getPlayerPokemon()!; + const dragonite = game.scene.getEnemyPokemon()!; + + expect(dragonite.getAttackDamage(magikarp, allMoves[Moves.DRAGON_RAGE]).damage).toBe(40); + }); + + it("One-hit KO moves ignore damage multipliers", async () => { + game.override + .enemySpecies(Species.AGGRON) + .enemyAbility(Abilities.MULTISCALE); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const magikarp = game.scene.getPlayerPokemon()!; + const aggron = game.scene.getEnemyPokemon()!; + + expect(aggron.getAttackDamage(magikarp, allMoves[Moves.FISSURE]).damage).toBe(aggron.hp); }); it("When the user fails to use Jump Kick with Wonder Guard ability, the damage should be 1.", async () => { - game.override.enemySpecies(Species.GASTLY); - game.override.enemyMoveset(Moves.SPLASH); - game.override.starterSpecies(Species.SHEDINJA); - game.override.moveset([Moves.JUMP_KICK]); - game.override.ability(Abilities.WONDER_GUARD); + game.override + .enemySpecies(Species.GASTLY) + .ability(Abilities.WONDER_GUARD); - await game.startBattle(); + await game.classicMode.startBattle([Species.SHEDINJA]); const shedinja = game.scene.getPlayerPokemon()!; game.move.select(Moves.JUMP_KICK); - await game.phaseInterceptor.to(DamagePhase); + await game.phaseInterceptor.to("DamagePhase"); expect(shedinja.hp).toBe(shedinja.getMaxHp() - 1); }); @@ -49,21 +110,19 @@ describe("Round Down and Minimun 1 test in Damage Calculation", () => { it("Charizard with odd HP survives Stealth Rock damage twice", async () => { game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0); - game.override.seed("Charizard Stealth Rock test"); - game.override.enemySpecies(Species.CHARIZARD); - game.override.enemyAbility(Abilities.BLAZE); - game.override.starterSpecies(Species.PIKACHU); - game.override.enemyLevel(100); + game.override + .seed("Charizard Stealth Rock test") + .enemySpecies(Species.CHARIZARD) + .enemyAbility(Abilities.BLAZE); - await game.startBattle(); + await game.classicMode.startBattle([Species.PIKACHU]); const charizard = game.scene.getEnemyPokemon()!; - const maxHp = charizard.getMaxHp(); - const damage_prediction = toDmgValue(charizard.getMaxHp() / 2); - const currentHp = charizard.hp; - const expectedHP = maxHp - damage_prediction; - - expect(currentHp).toBe(expectedHP); + if (charizard.getMaxHp() % 2 === 1) { + expect(charizard.hp).toBeGreaterThan(charizard.getMaxHp() / 2); + } else { + expect(charizard.hp).toBe(charizard.getMaxHp() / 2); + } }); }); diff --git a/src/test/enemy_command.test.ts b/src/test/enemy_command.test.ts new file mode 100644 index 00000000000..39b77845ea9 --- /dev/null +++ b/src/test/enemy_command.test.ts @@ -0,0 +1,75 @@ +import { allMoves, MoveCategory } from "#app/data/move"; +import { Abilities } from "#app/enums/abilities"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { AiType, EnemyPokemon } from "#app/field/pokemon"; +import { randSeedInt } from "#app/utils"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; + +const TIMEOUT = 20 * 1000; +const NUM_TRIALS = 300; + +type MoveChoiceSet = { [key: number]: number }; + +function getEnemyMoveChoices(pokemon: EnemyPokemon, moveChoices: MoveChoiceSet): void { + // Use an unseeded random number generator in place of the mocked-out randBattleSeedInt + vi.spyOn(pokemon.scene, "randBattleSeedInt").mockImplementation((range, min?) => { + return randSeedInt(range, min); + }); + for (let i = 0; i < NUM_TRIALS; i++) { + const queuedMove = pokemon.getNextMove(); + moveChoices[queuedMove.move]++; + } + + for (const [moveId, count] of Object.entries(moveChoices)) { + console.log(`Move: ${allMoves[moveId].name} Count: ${count} (${count / NUM_TRIALS * 100}%)`); + } +} + +describe("Enemy Commands - Move Selection", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + game = new GameManager(phaserGame); + game.override.ability(Abilities.BALL_FETCH); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it( + "should never use Status moves if an attack can KO", + async () => { + game.override + .enemySpecies(Species.ETERNATUS) + .enemyMoveset([Moves.ETERNABEAM, Moves.SLUDGE_BOMB, Moves.DRAGON_DANCE, Moves.COSMIC_POWER]) + .enemyAbility(Abilities.BALL_FETCH) + .ability(Abilities.BALL_FETCH) + .startingLevel(1) + .enemyLevel(100); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.aiType = AiType.SMART_RANDOM; + + const moveChoices: MoveChoiceSet = {}; + const enemyMoveset = enemyPokemon.getMoveset(); + enemyMoveset.forEach(mv => moveChoices[mv!.moveId] = 0); + getEnemyMoveChoices(enemyPokemon, moveChoices); + + enemyMoveset.forEach(mv => { + if (mv?.getMove().category === MoveCategory.STATUS) { + expect(moveChoices[mv.moveId]).toBe(0); + } + }); + }, TIMEOUT + ); +}); From 783b9d85ee65ac22806d5a216dc11dca3857fdae Mon Sep 17 00:00:00 2001 From: Opaque02 <66582645+Opaque02@users.noreply.github.com> Date: Sat, 14 Sep 2024 18:56:28 +1000 Subject: [PATCH 05/17] [Bug] Golden punch bug fix (#4246) * Fixes damage within pokemon.ts for golden punch, since it has changed from a IntegerHolder (main) to a number (beta). This updates it to pass through the damage as an integer holder instead of a number * Updated integer holder to number holder as per PR comment --- src/field/pokemon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index a74b2643eef..8a305f36d73 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2662,7 +2662,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const attackResult = { move: move.id, result: result as DamageResult, damage: damage, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; this.turnData.attacksReceived.unshift(attackResult); if (source.isPlayer() && !this.isPlayer()) { - this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, damage); + this.scene.applyModifiers(DamageMoneyRewardModifier, true, source, new Utils.NumberHolder(damage)); } } } From a7b3344c6d58f14f609b4c74737c0d732d6041c3 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Sat, 14 Sep 2024 05:21:31 -0700 Subject: [PATCH 06/17] Fix missing key in "No Effect" message (#4244) --- src/field/pokemon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 8a305f36d73..43a7090bff5 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2615,7 +2615,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (result === HitResult.IMMUNE) { this.scene.queueMessage(i18next.t("battle:hitResultImmune", { pokemonName: getPokemonNameWithAffix(this) })); } else { - this.scene.queueMessage(i18next.t("battle:hitResultNoEffect")); + this.scene.queueMessage(i18next.t("battle:hitResultNoEffect", { pokemonName: getPokemonNameWithAffix(this) })); } } return result; From 39a1963941332b77056b928711a2f5e414b3646f Mon Sep 17 00:00:00 2001 From: Lugiad Date: Sat, 14 Sep 2024 18:33:41 +0200 Subject: [PATCH 07/17] [Localization] French Translations tiny settings batch (#4250) * Update settings.json * Update move.json --- src/locales/fr/move.json | 4 ++-- src/locales/fr/settings.json | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/locales/fr/move.json b/src/locales/fr/move.json index a48e17b3fd9..957895b5db9 100644 --- a/src/locales/fr/move.json +++ b/src/locales/fr/move.json @@ -364,8 +364,8 @@ "effect": "Le lanceur creuse au premier tour et frappe au second." }, "toxic": { - "name": "Fil Toxique", - "effect": "Tisse un fil imprégné de venin. Empoisonne la cible et baisse sa Vitesse." + "name": "Toxik", + "effect": "Le lanceur empoisonne gravement la cible. Les dégâts dus au poison augmentent à chaque tour." }, "confusion": { "name": "Choc Mental", diff --git a/src/locales/fr/settings.json b/src/locales/fr/settings.json index c752b336b6e..e310f5d5733 100644 --- a/src/locales/fr/settings.json +++ b/src/locales/fr/settings.json @@ -11,6 +11,10 @@ "expGainsSpeed": "Vit. barre d’Exp", "expPartyDisplay": "Afficher Exp équipe", "skipSeenDialogues": "Passer dialogues connus", + "eggSkip": "Animation d’éclosion", + "never": "Jamais", + "always": "Toujours", + "ask": "Demander", "battleStyle": "Style de combat", "enableRetries": "Activer les réessais", "hideIvs": "Masquer Scanner d’IV", From bdc7c95c1cfc0e9a3177cfadde2c1170e92f0268 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Sat, 14 Sep 2024 09:35:36 -0700 Subject: [PATCH 08/17] [Misc][AI] Fix KO filter not accounting for move conditions (#4245) * Only filter KO moves that won't fail * Add Last Resort enemy command test --- src/field/pokemon.ts | 5 ++++- src/test/enemy_command.test.ts | 41 +++++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 43a7090bff5..faae3b06ba0 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4410,7 +4410,10 @@ export class EnemyPokemon extends Pokemon { const isCritical = move.hasAttr(CritOnlyAttr) || !!this.getTag(BattlerTagType.ALWAYS_CRIT); return move.category !== MoveCategory.STATUS - && moveTargets.some(p => p.getAttackDamage(this, move, !p.battleData.abilityRevealed, false, isCritical).damage >= p.hp); + && moveTargets.some(p => { + const doesNotFail = move.applyConditions(this, p, move) || [Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP].includes(move.id); + return doesNotFail && p.getAttackDamage(this, move, !p.battleData.abilityRevealed, false, isCritical).damage >= p.hp; + }); }, this); if (koMoves.length > 0) { diff --git a/src/test/enemy_command.test.ts b/src/test/enemy_command.test.ts index 39b77845ea9..9a2caa56dfc 100644 --- a/src/test/enemy_command.test.ts +++ b/src/test/enemy_command.test.ts @@ -6,7 +6,7 @@ import { AiType, EnemyPokemon } from "#app/field/pokemon"; import { randSeedInt } from "#app/utils"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const TIMEOUT = 20 * 1000; const NUM_TRIALS = 300; @@ -36,22 +36,26 @@ describe("Enemy Commands - Move Selection", () => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS, }); - game = new GameManager(phaserGame); - game.override.ability(Abilities.BALL_FETCH); }); afterEach(() => { game.phaseInterceptor.restoreOg(); }); + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.BALL_FETCH); + }); + it( "should never use Status moves if an attack can KO", async () => { game.override .enemySpecies(Species.ETERNATUS) .enemyMoveset([Moves.ETERNABEAM, Moves.SLUDGE_BOMB, Moves.DRAGON_DANCE, Moves.COSMIC_POWER]) - .enemyAbility(Abilities.BALL_FETCH) - .ability(Abilities.BALL_FETCH) .startingLevel(1) .enemyLevel(100); @@ -72,4 +76,31 @@ describe("Enemy Commands - Move Selection", () => { }); }, TIMEOUT ); + + it( + "should not select Last Resort if it would fail, even if the move KOs otherwise", + async () => { + game.override + .enemySpecies(Species.KANGASKHAN) + .enemyMoveset([Moves.LAST_RESORT, Moves.GIGA_IMPACT, Moves.SPLASH, Moves.SWORDS_DANCE]) + .startingLevel(1) + .enemyLevel(100); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.aiType = AiType.SMART_RANDOM; + + const moveChoices: MoveChoiceSet = {}; + const enemyMoveset = enemyPokemon.getMoveset(); + enemyMoveset.forEach(mv => moveChoices[mv!.moveId] = 0); + getEnemyMoveChoices(enemyPokemon, moveChoices); + + enemyMoveset.forEach(mv => { + if (mv?.getMove().category === MoveCategory.STATUS || mv?.moveId === Moves.LAST_RESORT) { + expect(moveChoices[mv.moveId]).toBe(0); + } + }); + }, TIMEOUT + ); }); From 763c1922fbad172e6c3d2b178aae9be5679b3267 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Sat, 14 Sep 2024 09:35:46 -0700 Subject: [PATCH 09/17] [Bug] Fix exp gains speed not applying properly (#4243) * update battle-info.ts * add: ExpGainsSpeed enum * address PR comments * add test coverage (exp gains speed) --------- Co-authored-by: Mr.WaterT Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/battle-scene.ts | 3 +- src/enums/exp-gains-speed.ts | 22 ++++++++++ src/phases/show-party-exp-bar-phase.ts | 3 +- src/test/ui/battle_info.test.ts | 55 ++++++++++++++++++++++++ src/test/utils/gameManager.ts | 3 +- src/test/utils/helpers/settingsHelper.ts | 10 +++++ src/test/utils/phaseInterceptor.ts | 4 +- src/ui/battle-info.ts | 9 +++- 8 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 src/enums/exp-gains-speed.ts create mode 100644 src/test/ui/battle_info.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 9a7221d3fb3..516662617f1 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -105,6 +105,7 @@ import HeldModifierConfig from "#app/interfaces/held-modifier-config"; import { ExpPhase } from "#app/phases/exp-phase"; import { ShowPartyExpBarPhase } from "#app/phases/show-party-exp-bar-phase"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import { ExpGainsSpeed } from "./enums/exp-gains-speed"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -180,7 +181,7 @@ export default class BattleScene extends SceneBase { public experimentalSprites: boolean = false; public musicPreference: integer = 0; public moveAnimations: boolean = true; - public expGainsSpeed: integer = 0; + public expGainsSpeed: ExpGainsSpeed = ExpGainsSpeed.DEFAULT; public skipSeenDialogues: boolean = false; /** * Determines if the egg hatching animation should be skipped diff --git a/src/enums/exp-gains-speed.ts b/src/enums/exp-gains-speed.ts new file mode 100644 index 00000000000..964c4f99c70 --- /dev/null +++ b/src/enums/exp-gains-speed.ts @@ -0,0 +1,22 @@ +/** + * Defines the speed of gaining experience. + * + * @remarks + * The `expGainSpeed` can have several modes: + * - `0` - Default: The normal speed. + * - `1` - Fast: Fast speed. + * - `2` - Faster: Faster speed. + * - `3` - Skip: Skip gaining exp animation. + * + * @default 0 - Uses the default normal speed. + */ +export enum ExpGainsSpeed { + /** The normal speed. */ + DEFAULT, + /** Fast speed. */ + FAST, + /** Faster speed. */ + FASTER, + /** Skip gaining exp animation. */ + SKIP +} diff --git a/src/phases/show-party-exp-bar-phase.ts b/src/phases/show-party-exp-bar-phase.ts index 9e019b202a5..f1783e7715f 100644 --- a/src/phases/show-party-exp-bar-phase.ts +++ b/src/phases/show-party-exp-bar-phase.ts @@ -1,4 +1,5 @@ import BattleScene from "#app/battle-scene"; +import { ExpGainsSpeed } from "#app/enums/exp-gains-speed"; import { ExpNotification } from "#app/enums/exp-notification"; import { ExpBoosterModifier } from "#app/modifier/modifier"; import * as Utils from "#app/utils"; @@ -44,7 +45,7 @@ export class ShowPartyExpBarPhase extends PlayerPartyMemberPokemonPhase { } else { this.end(); } - } else if (this.scene.expGainsSpeed < 3) { + } else if (this.scene.expGainsSpeed < ExpGainsSpeed.SKIP) { this.scene.partyExpBar.showPokemonExp(pokemon, exp.value, false, newLevel).then(() => { setTimeout(() => this.end(), 500 / Math.pow(2, this.scene.expGainsSpeed)); }); diff --git a/src/test/ui/battle_info.test.ts b/src/test/ui/battle_info.test.ts new file mode 100644 index 00000000000..4d511b75e6f --- /dev/null +++ b/src/test/ui/battle_info.test.ts @@ -0,0 +1,55 @@ +import { ExpGainsSpeed } from "#app/enums/exp-gains-speed"; +import { Species } from "#app/enums/species"; +import { ExpPhase } from "#app/phases/exp-phase"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +vi.mock("../data/exp", ({}) => { + return { + getLevelRelExp: vi.fn(() => 1), //consistent levelRelExp + }; +}); + +describe("UI - Battle Info", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([Moves.GUILLOTINE, Moves.SPLASH]) + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .enemySpecies(Species.CATERPIE); + }); + + it.each([ExpGainsSpeed.FAST, ExpGainsSpeed.FASTER, ExpGainsSpeed.SKIP])( + "should increase exp gains animation by 2^%i", + async (expGainsSpeed) => { + game.settings.expGainsSpeed(expGainsSpeed); + vi.spyOn(Math, "pow"); + + await game.classicMode.startBattle([Species.CHARIZARD]); + + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(ExpPhase, true); + + expect(Math.pow).not.toHaveBeenCalledWith(2, expGainsSpeed); + } + ); +}); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index a10ed70b97e..452956ab466 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -54,6 +54,7 @@ import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { expect } from "vitest"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { isNullOrUndefined } from "#app/utils"; +import { ExpGainsSpeed } from "#app/enums/exp-gains-speed"; /** * Class to manage the game state and transitions between phases. @@ -148,7 +149,7 @@ export default class GameManager { this.scene.gameSpeed = 5; this.scene.moveAnimations = false; this.scene.showLevelUpStats = false; - this.scene.expGainsSpeed = 3; + this.scene.expGainsSpeed = ExpGainsSpeed.SKIP; this.scene.expParty = ExpNotification.SKIP; this.scene.hpBarSpeed = 3; this.scene.enableTutorials = false; diff --git a/src/test/utils/helpers/settingsHelper.ts b/src/test/utils/helpers/settingsHelper.ts index 8fca2a34d47..c611a705107 100644 --- a/src/test/utils/helpers/settingsHelper.ts +++ b/src/test/utils/helpers/settingsHelper.ts @@ -1,6 +1,7 @@ import { PlayerGender } from "#app/enums/player-gender"; import { BattleStyle } from "#app/enums/battle-style"; import { GameManagerHelper } from "./gameManagerHelper"; +import { ExpGainsSpeed } from "#app/enums/exp-gains-speed"; /** * Helper to handle settings for tests @@ -38,6 +39,15 @@ export class SettingsHelper extends GameManagerHelper { this.log(`Gender set to: ${PlayerGender[gender]} (=${gender})` ); } + /** + * Change the exp gains speed + * @param speed the {@linkcode ExpGainsSpeed} to set + */ + expGainsSpeed(speed: ExpGainsSpeed) { + this.game.scene.expGainsSpeed = speed; + this.log(`Exp Gains Speed set to: ${ExpGainsSpeed[speed]} (=${speed})` ); + } + private log(...params: any[]) { console.log("Settings:", ...params); } diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index cdf0ad41057..46bb757c867 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -60,6 +60,7 @@ export interface PromptHandler { expireFn?: () => void; awaitingActionInput?: boolean; } +import { ExpPhase } from "#app/phases/exp-phase"; export default class PhaseInterceptor { public scene; @@ -127,7 +128,8 @@ export default class PhaseInterceptor { [MysteryEncounterRewardsPhase, this.startPhase], [PostMysteryEncounterPhase, this.startPhase], [ModifierRewardPhase, this.startPhase], - [PartyExpPhase, this.startPhase] + [PartyExpPhase, this.startPhase], + [ExpPhase, this.startPhase], ]; private endBySetMode = [ diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index c7b82dc826e..8e7e5bc4060 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -11,8 +11,11 @@ import { Stat } from "#enums/stat"; import BattleFlyout from "./battle-flyout"; import { WindowVariant, addWindow } from "./ui-theme"; import i18next from "i18next"; +import { ExpGainsSpeed } from "#app/enums/exp-gains-speed"; export default class BattleInfo extends Phaser.GameObjects.Container { + public static readonly EXP_GAINS_DURATION_BASE = 1650; + private baseY: number; private player: boolean; @@ -702,7 +705,11 @@ export default class BattleInfo extends Phaser.GameObjects.Container { instant = true; } const durationMultiplier = Phaser.Tweens.Builders.GetEaseFunction("Sine.easeIn")(1 - (Math.max(this.lastLevel - 100, 0) / 150)); - const duration = this.visible && !instant ? (((levelExp - this.lastLevelExp) / relLevelExp) * 1650) * durationMultiplier * levelDurationMultiplier : 0; + let duration = this.visible && !instant ? (((levelExp - this.lastLevelExp) / relLevelExp) * BattleInfo.EXP_GAINS_DURATION_BASE) * durationMultiplier * levelDurationMultiplier : 0; + const speed = (this.scene as BattleScene).expGainsSpeed; + if (speed && speed >= ExpGainsSpeed.DEFAULT) { + duration = speed >= ExpGainsSpeed.SKIP ? ExpGainsSpeed.DEFAULT : duration / Math.pow(2, speed); + } if (ratio === 1) { this.lastLevelExp = 0; this.lastLevel++; From 9f8e9de9676ae965af8e5d5275375cb03a58f3ff Mon Sep 17 00:00:00 2001 From: DanStevensonx <114961842+DanStevensonx@users.noreply.github.com> Date: Sun, 15 Sep 2024 01:12:05 +0200 Subject: [PATCH 10/17] Update menu.json (#4258) Added a line-break to the server connection error in Spanish --- src/locales/es/menu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/es/menu.json b/src/locales/es/menu.json index ef1ae93dd82..a35025819fa 100644 --- a/src/locales/es/menu.json +++ b/src/locales/es/menu.json @@ -51,7 +51,7 @@ "renamePokemon": "Renombrar Pokémon.", "rename": "Renombrar", "nickname": "Apodo", - "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta, el juego se reconectará automáticamente.", + "errorServerDown": "¡Ups! Ha habido un problema al contactar con el servidor.\n\nPuedes mantener esta ventana abierta,\nel juego se reconectará automáticamente.", "noSaves": "No tienes ninguna partida guardada registrada!", "tooManySaves": "¡Tienes demasiadas partidas guardadas registradas!" } From aecdcd34f55520c7d7226ded792901fec312fe76 Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Sun, 15 Sep 2024 01:12:55 +0200 Subject: [PATCH 11/17] [BUG] Fix a couple of bugs regarding MEs and their localization (#4261) * Fixed SURF and FLY not beeing localized in "lost at sea" Fixed Mysterious Challenger Title not beeing correct Fixed Winstrate Names not beeing localized * Revert the winstrate fix. It breaks other trainer battles for some reason... * A new way of giving the winstrates localized names (and for the future all named trainers that dont use a "initFor" method) * Updated test (with ok from ImperialSympathizer) * Made the expected value simpler * FLY and SURF can be localized much simpler --- .../encounters/lost-at-sea-encounter.ts | 5 ++-- .../mysterious-challengers-encounter.ts | 1 + src/data/trainer-config.ts | 27 +++++++++++++++---- .../encounters/lost-at-sea-encounter.test.ts | 6 ++--- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts index 0f0538d7542..16568d8cb7d 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -10,6 +10,7 @@ import { applyDamageToPokemon } from "#app/data/mystery-encounters/utils/encount import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import {PokemonMove} from "#app/field/pokemon"; const OPTION_1_REQUIRED_MOVE = Moves.SURF; const OPTION_2_REQUIRED_MOVE = Moves.FLY; @@ -44,8 +45,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with const encounter = scene.currentBattle.mysteryEncounter!; encounter.setDialogueToken("damagePercentage", String(DAMAGE_PERCENTAGE)); - encounter.setDialogueToken("option1RequiredMove", Moves[OPTION_1_REQUIRED_MOVE]); - encounter.setDialogueToken("option2RequiredMove", Moves[OPTION_2_REQUIRED_MOVE]); + encounter.setDialogueToken("option1RequiredMove", new PokemonMove(OPTION_1_REQUIRED_MOVE).getName()); + encounter.setDialogueToken("option2RequiredMove", new PokemonMove(OPTION_2_REQUIRED_MOVE).getName()); return true; }) diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 230f5242a36..71a44bd6852 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -87,6 +87,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = ); const e4Template = trainerPartyTemplates.ELITE_FOUR; const brutalConfig = trainerConfigs[brutalTrainerType].clone(); + brutalConfig.title = trainerConfigs[brutalTrainerType].title; brutalConfig.setPartyTemplates(e4Template); // @ts-ignore brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 0323c6d43c4..8b96e3cefb8 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -255,7 +255,9 @@ export class TrainerConfig { name = i18next.t("trainerNames:rival"); } } + this.name = name; + return this; } @@ -899,6 +901,20 @@ export class TrainerConfig { return this; } + /** + * Sets a localized name for the trainer. This should only be used for trainers that dont use a "initFor" function and are considered "named" trainers + * @param name - The name of the trainer. + * @returns {TrainerConfig} The updated TrainerConfig instance. + */ + setLocalizedName(name: string): TrainerConfig { + // Check if the internationalization (i18n) system is initialized. + if (!getIsInitialized()) { + initI18n(); + } + this.name = i18next.t(`trainerNames:${name.toLowerCase()}`); + return this; + } + /** * Retrieves the title for the trainer based on the provided trainer slot and variant. * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE. @@ -2270,21 +2286,22 @@ export const trainerConfigs: TrainerConfigs = { } p.pokeball = PokeballType.MASTER_BALL; })), - [TrainerType.VICTOR]: new TrainerConfig(++t).setName("Victor").setTitle("The Winstrates") + [TrainerType.VICTOR]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Victor") .setMoneyMultiplier(1) // The Winstrate trainers have total money multiplier of 6 .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), - [TrainerType.VICTORIA]: new TrainerConfig(++t).setName("Victoria").setTitle("The Winstrates") + [TrainerType.VICTORIA]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Victoria") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), - [TrainerType.VIVI]: new TrainerConfig(++t).setName("Vivi").setTitle("The Winstrates") + [TrainerType.VIVI]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vivi") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.TWO_AVG_ONE_STRONG), - [TrainerType.VICKY]: new TrainerConfig(++t).setName("Vicky").setTitle("The Winstrates") + [TrainerType.VICKY]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vicky") .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.ONE_AVG), - [TrainerType.VITO]: new TrainerConfig(++t).setName("Vito").setTitle("The Winstrates") + [TrainerType.VITO]: new TrainerConfig(++t).setTitle("The Winstrates").setLocalizedName("Vito") .setMoneyMultiplier(2) .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))), [TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t).setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) .setPartyTemplates(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE)) }; + diff --git a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts b/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts index 5d43172f6c0..82670e32daa 100644 --- a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -3,7 +3,6 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Biome } from "#app/enums/biome"; -import { Moves } from "#app/enums/moves"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; @@ -16,6 +15,7 @@ import BattleScene from "#app/battle-scene"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { PartyExpPhase } from "#app/phases/party-exp-phase"; + const namespace = "mysteryEncounter:lostAtSea"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; @@ -102,8 +102,8 @@ describe("Lost at Sea - Mystery Encounter", () => { const onInitResult = onInit!(scene); expect(LostAtSeaEncounter.dialogueTokens?.damagePercentage).toBe("25"); - expect(LostAtSeaEncounter.dialogueTokens?.option1RequiredMove).toBe(Moves[Moves.SURF]); - expect(LostAtSeaEncounter.dialogueTokens?.option2RequiredMove).toBe(Moves[Moves.FLY]); + expect(LostAtSeaEncounter.dialogueTokens?.option1RequiredMove).toBe("Surf"); + expect(LostAtSeaEncounter.dialogueTokens?.option2RequiredMove).toBe("Fly"); expect(onInitResult).toBe(true); }); From d8dbc471af17fe1643c7d857579b4ebd9e7e1e11 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Sat, 14 Sep 2024 16:13:32 -0700 Subject: [PATCH 12/17] [Bug][Beta] Fix Pokemon info flyout being offset on switchout after double battle (#4260) --- src/field/pokemon.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index faae3b06ba0..088d11abf90 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -592,8 +592,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Resetting properties should not be shown on the field this.setVisible(false); - // Reset field position - this.setFieldPosition(FieldPosition.CENTER); + // Remove the offset from having a Substitute active if (this.isOffsetBySubstitute()) { this.x -= this.getSubstituteOffset()[0]; this.y -= this.getSubstituteOffset()[1]; From 79fa80cfd8a20a45308311c478a2be7b48c71246 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Sat, 14 Sep 2024 16:14:37 -0700 Subject: [PATCH 13/17] [Bug][Beta] Fix error in message sequencing on critical hits (#4259) --- src/field/pokemon.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 088d11abf90..453bce71503 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -2620,10 +2620,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return result; } - if (isCritical) { - this.scene.queueMessage(i18next.t("battle:hitResultCriticalHit")); - } - // In case of fatal damage, this tag would have gotten cleared before we could lapse it. const destinyTag = this.getTag(BattlerTagType.DESTINY_BOND); @@ -2666,6 +2662,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + if (isCritical) { + this.scene.queueMessage(i18next.t("battle:hitResultCriticalHit")); + } + // want to include is.Fainted() in case multi hit move ends early, still want to render message if (source.turnData.hitsLeft === 1 || this.isFainted()) { switch (result) { From 3a683c0663237269dcfd0ecbb6ab8b7580a7821a Mon Sep 17 00:00:00 2001 From: PrabbyDD <147005742+PrabbyDD@users.noreply.github.com> Date: Sat, 14 Sep 2024 17:11:54 -0700 Subject: [PATCH 14/17] [Bug] Fix for "Moves Can Miss Against Protect, Baneful Bunker, King's Shield" (#4262) * added various tests for protect based moves, reset protect test file bc no easy way to test specifically with protect, and changes in move-effect to fix the issue * adding another non contact move test for baneful bunker * Update src/test/moves/obstruct.test.ts Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * Update src/test/moves/baneful_bunker.test.ts Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * Update src/test/moves/baneful_bunker.test.ts Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * Update src/test/moves/baneful_bunker.test.ts Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> * better descriptions for baneful bunker test --------- Co-authored-by: innerthunder <168692175+innerthunder@users.noreply.github.com> --- src/phases/move-effect-phase.ts | 31 ++++----- src/test/moves/baneful_bunker.test.ts | 93 +++++++++++++++++++++++++++ src/test/moves/obstruct.test.ts | 17 +++++ 3 files changed, 126 insertions(+), 15 deletions(-) create mode 100644 src/test/moves/baneful_bunker.test.ts diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index ffd9d45b4bd..c3199166e84 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -102,7 +102,7 @@ export class MoveEffectPhase extends PokemonPhase { * (and not random target) and failed the hit check against its target (MISS), log the move * as FAILed or MISSed (depending on the conditions above) and end this phase. */ - if (!hasActiveTargets || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]])) { + if (!hasActiveTargets || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag))) { this.stopMultiHit(); if (hasActiveTargets) { this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getTarget()? getPokemonNameWithAffix(this.getTarget()!) : "" })); @@ -125,20 +125,6 @@ export class MoveEffectPhase extends PokemonPhase { /** Has the move successfully hit a target (for damage) yet? */ let hasHit: boolean = false; for (const target of targets) { - /** - * If the move missed a target, stop all future hits against that target - * and move on to the next target (if there is one). - */ - if (!targetHitChecks[target.getBattlerIndex()]) { - this.stopMultiHit(target); - this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); - if (moveHistoryEntry.result === MoveResult.PENDING) { - moveHistoryEntry.result = MoveResult.MISS; - } - user.pushMoveHistory(moveHistoryEntry); - applyMoveAttrs(MissEffectAttr, user, null, move); - continue; - } /** The {@linkcode ArenaTagSide} to which the target belongs */ const targetSide = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; @@ -156,6 +142,21 @@ export class MoveEffectPhase extends PokemonPhase { && (hasConditionalProtectApplied.value || (!target.findTags(t => t instanceof DamageProtectedTag).length && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType))) || (this.move.getMove().category !== MoveCategory.STATUS && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); + /** + * If the move missed a target, stop all future hits against that target + * and move on to the next target (if there is one). + */ + if (!isProtected && !targetHitChecks[target.getBattlerIndex()]) { + this.stopMultiHit(target); + this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); + if (moveHistoryEntry.result === MoveResult.PENDING) { + moveHistoryEntry.result = MoveResult.MISS; + } + user.pushMoveHistory(moveHistoryEntry); + applyMoveAttrs(MissEffectAttr, user, null, move); + continue; + } + /** Does this phase represent the invoked move's first strike? */ const firstHit = (user.turnData.hitsLeft === user.turnData.hitCount); diff --git a/src/test/moves/baneful_bunker.test.ts b/src/test/moves/baneful_bunker.test.ts new file mode 100644 index 00000000000..c4a3036565c --- /dev/null +++ b/src/test/moves/baneful_bunker.test.ts @@ -0,0 +1,93 @@ +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import GameManager from "../utils/gameManager"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { StatusEffect } from "#app/enums/status-effect"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - Baneful Bunker", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("single"); + + game.override.moveset(Moves.SLASH); + + game.override.enemySpecies(Species.SNORLAX); + game.override.enemyAbility(Abilities.INSOMNIA); + game.override.enemyMoveset(Moves.BANEFUL_BUNKER); + + game.override.startingLevel(100); + game.override.enemyLevel(100); + }); + test( + "should protect the user and poison attackers that make contact", + async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); + }, TIMEOUT + ); + test( + "should protect the user and poison attackers that make contact, regardless of accuracy checks", + async () => { + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SLASH); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + await game.move.forceMiss(); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); + }, TIMEOUT + ); + + test( + "should not poison attackers that don't make contact", + async () => { + game.override.moveset(Moves.FLASH_CANNON); + await game.classicMode.startBattle([Species.CHARIZARD]); + + const leadPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FLASH_CANNON); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.phaseInterceptor.to("MoveEffectPhase"); + + await game.move.forceMiss(); + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeFalsy(); + }, TIMEOUT + ); +}); diff --git a/src/test/moves/obstruct.test.ts b/src/test/moves/obstruct.test.ts index 539b11090de..eb12daa785d 100644 --- a/src/test/moves/obstruct.test.ts +++ b/src/test/moves/obstruct.test.ts @@ -43,6 +43,23 @@ describe("Moves - Obstruct", () => { expect(enemy.getStatStage(Stat.DEF)).toBe(-2); }, TIMEOUT); + it("bypasses accuracy checks when applying protection and defense reduction", async () => { + game.override.enemyMoveset(Array(4).fill(Moves.ICE_PUNCH)); + await game.classicMode.startBattle(); + + game.move.select(Moves.OBSTRUCT); + await game.phaseInterceptor.to("MoveEffectPhase"); + await game.move.forceMiss(); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(player.isFullHp()).toBe(true); + expect(enemy.getStatStage(Stat.DEF)).toBe(-2); + }, TIMEOUT + ); + it("protects from non-contact damaging moves and doesn't lower the opponent's defense by 2 stages", async () => { game.override.enemyMoveset(Array(4).fill(Moves.WATER_GUN)); await game.classicMode.startBattle(); From 540a1c3e21be8af146b2a636f1410e5572d5e0a7 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sat, 14 Sep 2024 21:32:43 -0400 Subject: [PATCH 15/17] [Balance] Rework some evolutions (#2732) * Changes some evolutions * more work * Give Onix Iron Defense at 30 * Sirfetch'd and Gholdengo, pause any evolutions * Fix pause evolution text * adjust wild evolution delay * Add localization keys, clean up evo pausing * Clean up evo delays * Adjust friendship evos, Leader's Crest sprite by chaosgrimmon * Fix Nugget crash * Fixed Gimmighoul fr * Move Charcadet armors to common * Locale migration, Lilligant shiny stone * Cleanup * Fix language migration error * Change Cosmog line evo method * Undo Ursaluna being night only * Evo items roll during evo pause on Eevee * Make all time based evos use dusk and dawn times * Fix paused and unpaused evolution texts being reversed * Fixed evolution delays * Moved up Mimic in Mime Jr's moveset * Remove Cosmoem time conditions, add Gimmighoul tracker * Remove tracker after Gimmighoul evo * Change Scyther Steel Wing back to 30, mark custom --- public/images/items/leaders_crest.png | Bin 0 -> 694 bytes public/images/items/moon_flute.png | Bin 0 -> 555 bytes public/images/items/sun_flute.png | Bin 0 -> 582 bytes src/data/pokemon-evolutions.ts | 148 ++++++++++++++------------ src/data/pokemon-level-moves.ts | 8 +- src/field/pokemon.ts | 10 +- src/locales/en/modifier-type.json | 17 +++ src/locales/en/party-ui-handler.json | 2 + src/modifier/modifier-type.ts | 6 +- src/modifier/modifier.ts | 46 +++++++- src/system/pokemon-data.ts | 3 + src/ui/party-ui-handler.ts | 8 +- 12 files changed, 172 insertions(+), 76 deletions(-) create mode 100644 public/images/items/leaders_crest.png create mode 100644 public/images/items/moon_flute.png create mode 100644 public/images/items/sun_flute.png diff --git a/public/images/items/leaders_crest.png b/public/images/items/leaders_crest.png new file mode 100644 index 0000000000000000000000000000000000000000..45cf16563747dba7846f52f46a51df81af69b261 GIT binary patch literal 694 zcmV;n0!jUeP)Px#1ZP1_K>z@;j|==^1poj7MoC0LR9HvtmN95kQ51%cfgplp5fs|NAnl+grAXr< z5tl%5YX%8qFccIF4y6@Du!|1jP%K0uC`cBebm-Pnh)ya9aVTx*B1i@mS}2rKa44w! zC+~l~$;(S#US2_HK6t#Fo0oj&oO|y{q|dSEgmv$kXf*oQ8cMBJ)9*Fs2;U=t1OQRt z_IVwD{{CAQK5pyy%Zs>F*7kJ#x^i0X+Gz&0v?ngxNoR_Rtom@4nTwcf)r8%pN=`{Lt(nfBfpb&Uq!U3UD8s+%4;U zr&7}Fx%R_D7aipXz5?i!J>*{Lx(`qu9>~hK7oVA`3x%1|aW)E6zKH{qa zkQ0{PloRayPIOfPWdH5coQ}=x%`*>>J$Js_+7r(efV^5=w_epTJuN<@tAb#nxj?HXYY7m5&G<*T%#h3L~ zOVCgVju!|*OdJ6;w_8dpFAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-u}MThRCwCdmLX5WP!xr~M=JOU%uzX9=Ll}{$$}!d;riU_7UbOOTE`rjTjd;e z%iQL8^5NE>P*=p(hC*2vRs=U`(&W9IlXLGqrxkgg^OtqTAD30U^m;vj&vL{m!0Yw8 zN&w`quS>K}F($%z&5B;M(I>NInw?6Z<6z z(2A0;TT~%wLrLA5wyNYOAGD^#I&daT?B@X!GMxc%-d!;am&FPnGqg?t2*Y_}%ML0ifW}dTlrHzuLF<%p6fyEV zg2c2Fc9)JU!HXJ45kTYMk0QA0oLAIrb;8K=$n>IdyAHN!W40_7F#vCl8#F+t+ebf*ZA3qXG9 z$OPFK#~C>GuRoch<|)sV tx-G#?>{lFa(N2kdTljIv|MsuqV*px@<{k~r6czvg002ovPDHLkV1hC*`4j*E literal 0 HcmV?d00001 diff --git a/public/images/items/sun_flute.png b/public/images/items/sun_flute.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cbcdf5569e04fed086f61bb561ea7c6ea104e6 GIT binary patch literal 582 zcmV-M0=fN(P)pFAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-%t=H+RCwCdmLYW7P!xv0*E5kg<`UP)$oJfs0@*omJyV>zNpKm8#kFz{D(i|{ zTvJuz@?>P@z^#tBR0KE#80ly#cGWxQo^${F_ul`%5qX~To^i%I$A|SpDFv`iN4%wQ z9LIYM@}~!nc;qndunSgCi_F;_%jPAMz+f!1T0lww_m2&d!I0};eN@M-g~>L6@I%cc zY1GPOcZ)=nWwkOnw5DYyj#V%@5#(<=*f25E1=nLqpl!Ui{AZA3LKA+dxqoahxYG2; zJ(6^>%_Ofw$-)mc?WPO!5ZAE?v`xo(J)0_k{OQ4?+X6Gqxab+UjzxcTzRTuxFEVEV zvDU;|7a-mR!EFXW`YhknqQW|~MoEd1l6V@yJS0gM%;$gTww^0loK=1Oq3Dm!vF(p6 z9SbFod)HBbAGZrgv;BnK=6lcLX85~OCt`hYR(8GDrg*e!4WK%oR-VPCO+P)GW%Ckq zc1NsJuBJuZLw0>ImW~0AQ7RtJ5~k^#jTpDQYj=Gsb@2IX#3V3?wdR|j&}~7KW$S|^ z{7?fh_;OR|<%E+dqAWv6NxSKyhI%irhUupG3Q)Xu2BmpaoYGQ$Jp=LI|5dyU0HuxT UXL3}E?f?J)07*qoM6N<$f true /* King's Rock */), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.SLOWKING, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MAGNEMITE]: [ new SpeciesEvolution(Species.MAGNETON, 30, null, null) @@ -249,8 +265,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ELECTRODE, 30, null, null) ], [Species.CUBONE]: [ - new SpeciesEvolution(Species.ALOLA_MAROWAK, 28, null, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ISLAND || p.scene.arena.biomeType === Biome.BEACH), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.MAROWAK, 28, null, null) + new SpeciesEvolution(Species.ALOLA_MAROWAK, 28, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), + new SpeciesEvolution(Species.MAROWAK, 28, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.TYROGUE]: [ new SpeciesEvolution(Species.HITMONLEE, 20, null, new SpeciesEvolutionCondition(p => p.stats[Stat.ATK] > p.stats[Stat.DEF])), @@ -258,8 +274,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.HITMONTOP, 20, null, new SpeciesEvolutionCondition(p => p.stats[Stat.ATK] === p.stats[Stat.DEF])) ], [Species.KOFFING]: [ - new SpeciesEvolution(Species.GALAR_WEEZING, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.METROPOLIS || p.scene.arena.biomeType === Biome.SLUM), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.WEEZING, 35, null, null) + new SpeciesEvolution(Species.GALAR_WEEZING, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), + new SpeciesEvolution(Species.WEEZING, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.RHYHORN]: [ new SpeciesEvolution(Species.RHYDON, 42, null, null) @@ -304,7 +320,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.QUILAVA, 14, null, null) ], [Species.QUILAVA]: [ - new SpeciesEvolution(Species.HISUI_TYPHLOSION, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.HISUI_TYPHLOSION, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), new SpeciesEvolution(Species.TYPHLOSION, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.TOTODILE]: [ @@ -652,7 +668,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.DEWOTT, 17, null, null) ], [Species.DEWOTT]: [ - new SpeciesEvolution(Species.HISUI_SAMUROTT, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.HISUI_SAMUROTT, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), new SpeciesEvolution(Species.SAMUROTT, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.PATRAT]: [ @@ -800,10 +816,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.BISHARP, 52, null, null) ], [Species.BISHARP]: [ - new SpeciesEvolution(Species.KINGAMBIT, 64, null, null) + new SpeciesEvolution(Species.KINGAMBIT, 1, EvolutionItem.LEADERS_CREST, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RUFFLET]: [ - new SpeciesEvolution(Species.HISUI_BRAVIARY, 54, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.HISUI_BRAVIARY, 54, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), new SpeciesEvolution(Species.BRAVIARY, 54, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.VULLABY]: [ @@ -883,20 +899,20 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CLAWITZER, 37, null, null) ], [Species.TYRUNT]: [ - new SpeciesEvolution(Species.TYRANTRUM, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.TYRANTRUM, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.AMAURA]: [ - new SpeciesEvolution(Species.AURORUS, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.AURORUS, 39, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.GOOMY]: [ - new SpeciesEvolution(Species.HISUI_SLIGGOO, 40, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.HISUI_SLIGGOO, 40, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), new SpeciesEvolution(Species.SLIGGOO, 40, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.SLIGGOO]: [ new SpeciesEvolution(Species.GOODRA, 50, null, new SpeciesEvolutionCondition(p => [ WeatherType.RAIN, WeatherType.FOG, WeatherType.HEAVY_RAIN ].indexOf(p.scene.arena.weather?.weatherType || WeatherType.NONE) > -1), SpeciesWildEvolutionDelay.LONG) ], [Species.BERGMITE]: [ - new SpeciesEvolution(Species.HISUI_AVALUGG, 37, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.HISUI_AVALUGG, 37, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), new SpeciesEvolution(Species.AVALUGG, 37, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.NOIBAT]: [ @@ -906,7 +922,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.DARTRIX, 17, null, null) ], [Species.DARTRIX]: [ - new SpeciesEvolution(Species.HISUI_DECIDUEYE, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.HISUI_DECIDUEYE, 36, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), new SpeciesEvolution(Species.DECIDUEYE, 34, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.LITTEN]: [ @@ -928,7 +944,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.TOUCANNON, 28, null, null) ], [Species.YUNGOOS]: [ - new SpeciesEvolution(Species.GUMSHOOS, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.GUMSHOOS, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.GRUBBIN]: [ new SpeciesEvolution(Species.CHARJABUG, 20, null, null) @@ -946,7 +962,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ARAQUANID, 22, null, null) ], [Species.FOMANTIS]: [ - new SpeciesEvolution(Species.LURANTIS, 34, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) + new SpeciesEvolution(Species.LURANTIS, 34, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.MORELULL]: [ new SpeciesEvolution(Species.SHIINOTIC, 24, null, null) @@ -973,17 +989,17 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.KOMMO_O, 45, null, null) ], [Species.COSMOG]: [ - new SpeciesEvolution(Species.COSMOEM, 43, null, null) + new SpeciesEvolution(Species.COSMOEM, 23, null, null) ], [Species.COSMOEM]: [ - new SpeciesEvolution(Species.SOLGALEO, 53, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)), - new SpeciesEvolution(Species.LUNALA, 53, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.SOLGALEO, 53, EvolutionItem.SUN_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesEvolution(Species.LUNALA, 53, EvolutionItem.MOON_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MELTAN]: [ new SpeciesEvolution(Species.MELMETAL, 48, null, null) ], [Species.ALOLA_RATTATA]: [ - new SpeciesEvolution(Species.ALOLA_RATICATE, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.ALOLA_RATICATE, 20, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.ALOLA_DIGLETT]: [ new SpeciesEvolution(Species.ALOLA_DUGTRIO, 26, null, null) @@ -1090,7 +1106,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GALAR_RAPIDASH, 40, null, null) ], [Species.GALAR_FARFETCHD]: [ - new SpeciesEvolution(Species.SIRFETCHD, 30, null, null) + new SpeciesEvolution(Species.SIRFETCHD, 30, null, null, SpeciesWildEvolutionDelay.LONG) ], [Species.GALAR_SLOWPOKE]: [ new SpeciesEvolution(Species.GALAR_SLOWBRO, 1, EvolutionItem.GALARICA_CUFF, null, SpeciesWildEvolutionDelay.VERY_LONG), @@ -1106,7 +1122,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GALAR_LINOONE, 20, null, null) ], [Species.GALAR_LINOONE]: [ - new SpeciesEvolution(Species.OBSTAGOON, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.OBSTAGOON, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.GALAR_YAMASK]: [ new SpeciesEvolution(Species.RUNERIGUS, 34, null, null) @@ -1214,7 +1230,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.GLIMMORA, 35, null, null) ], [Species.GREAVARD]: [ - new SpeciesEvolution(Species.HOUNDSTONE, 30, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) + new SpeciesEvolution(Species.HOUNDSTONE, 30, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)) ], [Species.FRIGIBAX]: [ new SpeciesEvolution(Species.ARCTIBAX, 35, null, null) @@ -1226,8 +1242,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CLODSIRE, 20, null, null) ], [Species.PIKACHU]: [ - new SpeciesFormEvolution(Species.ALOLA_RAICHU, "", "", 1, EvolutionItem.THUNDER_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ISLAND || p.scene.arena.biomeType === Biome.BEACH), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ALOLA_RAICHU, "partner", "", 1, EvolutionItem.THUNDER_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ISLAND || p.scene.arena.biomeType === Biome.BEACH), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALOLA_RAICHU, "", "", 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ALOLA_RAICHU, "partner", "", 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.RAICHU, "", "", 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.RAICHU, "partner", "", 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], @@ -1255,7 +1271,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.POLIWHIRL]: [ new SpeciesEvolution(Species.POLIWRATH, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG), - new SpeciesEvolution(Species.POLITOED, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* King's Rock */), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.POLITOED, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.WEEPINBELL]: [ new SpeciesEvolution(Species.VICTREEBEL, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1267,7 +1283,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CLOYSTER, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.EXEGGCUTE]: [ - new SpeciesEvolution(Species.ALOLA_EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.biomeType === Biome.ISLAND || p.scene.arena.biomeType === Biome.BEACH), SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.ALOLA_EXEGGUTOR, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG), new SpeciesEvolution(Species.EXEGGUTOR, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.TANGELA]: [ @@ -1280,12 +1296,12 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.STARMIE, 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.EEVEE]: [ - new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => !!p.getMoveset().find(m => m?.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.SYLVEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => !!p.getMoveset().find(m => m?.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ESPEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.ESPEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.UMBREON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), - new SpeciesFormEvolution(Species.UMBREON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(70, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => !!p.getMoveset().find(m => m?.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.SYLVEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => !!p.getMoveset().find(m => m?.getMove().type === Type.FAIRY)), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ESPEON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.ESPEON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.UMBREON, "", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), + new SpeciesFormEvolution(Species.UMBREON, "partner", "", 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.VAPOREON, "", "", 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.VAPOREON, "partner", "", 1, EvolutionItem.WATER_STONE, null, SpeciesWildEvolutionDelay.LONG), new SpeciesFormEvolution(Species.JOLTEON, "", "", 1, EvolutionItem.THUNDER_STONE, null, SpeciesWildEvolutionDelay.LONG), @@ -1329,10 +1345,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.DUDUNSPARCE, 32, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.HYPER_DRILL).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.GLIGAR]: [ - new SpeciesEvolution(Species.GLISCOR, 1, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT /* Razor fang at night*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.GLISCOR, 1, EvolutionItem.RAZOR_FANG, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT /* Razor fang at night*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SNEASEL]: [ - new SpeciesEvolution(Species.WEAVILE, 1, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT /* Razor claw at night*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.WEAVILE, 1, EvolutionItem.RAZOR_CLAW, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT /* Razor claw at night*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.URSARING]: [ new SpeciesEvolution(Species.URSALUNA, 1, EvolutionItem.PEAT_BLOCK, null, SpeciesWildEvolutionDelay.VERY_LONG) //Ursaring does not evolve into Bloodmoon Ursaluna @@ -1362,8 +1378,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.SUDOWOODO, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.MIME_JR]: [ - new SpeciesEvolution(Species.GALAR_MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0 && (p.scene.arena.biomeType === Biome.ICE_CAVE || p.scene.arena.biomeType === Biome.SNOWY_FOREST)), SpeciesWildEvolutionDelay.MEDIUM), - new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.GALAR_MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0 && (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), SpeciesWildEvolutionDelay.MEDIUM), + new SpeciesEvolution(Species.MR_MIME, 1, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.MIMIC).length > 0 && (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.PANSAGE]: [ new SpeciesEvolution(Species.SIMISAGE, 1, EvolutionItem.LEAF_STONE, null, SpeciesWildEvolutionDelay.LONG) @@ -1381,8 +1397,8 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.WHIMSICOTT, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.PETILIL]: [ - new SpeciesEvolution(Species.HISUI_LILLIGANT, 1, EvolutionItem.SUN_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesEvolution(Species.LILLIGANT, 1, EvolutionItem.SUN_STONE, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.HISUI_LILLIGANT, 1, EvolutionItem.SHINY_STONE, null, SpeciesWildEvolutionDelay.LONG), + new SpeciesEvolution(Species.LILLIGANT, 1, EvolutionItem.SUN_STONE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.BASCULIN]: [ new SpeciesFormEvolution(Species.BASCULEGION, "white-striped", "female", 40, null, new SpeciesEvolutionCondition(p => p.gender === Gender.FEMALE, p => p.gender = Gender.FEMALE), SpeciesWildEvolutionDelay.VERY_LONG), @@ -1435,7 +1451,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.APPLETUN, 1, EvolutionItem.SWEET_APPLE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.CLOBBOPUS]: [ - new SpeciesEvolution(Species.GRAPPLOCT, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.TAUNT).length > 0), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.GRAPPLOCT, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.TAUNT).length > 0)/*Once Taunt is implemented, change evo level to 1 and delay to LONG*/) ], [Species.SINISTEA]: [ new SpeciesFormEvolution(Species.POLTEAGEIST, "phony", "phony", 1, EvolutionItem.CRACKED_POT, null, SpeciesWildEvolutionDelay.LONG), @@ -1472,7 +1488,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.OVERQWIL, 28, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.BARB_BARRAGE).length > 0), SpeciesWildEvolutionDelay.LONG) ], [Species.HISUI_SNEASEL]: [ - new SpeciesEvolution(Species.SNEASLER, 1, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAY /* Razor claw at day*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.SNEASLER, 1, EvolutionItem.RAZOR_CLAW, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY /* Razor claw at day*/), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.CHARCADET]: [ new SpeciesEvolution(Species.ARMAROUGE, 1, EvolutionItem.AUSPICIOUS_ARMOR, null, SpeciesWildEvolutionDelay.LONG), @@ -1512,10 +1528,10 @@ export const pokemonEvolutions: PokemonEvolutions = { SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.RHYDON]: [ - new SpeciesEvolution(Species.RHYPERIOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* Protector */), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.RHYPERIOR, 1, EvolutionItem.PROTECTOR, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SEADRA]: [ - new SpeciesEvolution(Species.KINGDRA, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* Dragon scale*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.KINGDRA, 1, EvolutionItem.DRAGON_SCALE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SCYTHER]: [ new SpeciesEvolution(Species.SCIZOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition( @@ -1524,22 +1540,22 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.KLEAVOR, 1, EvolutionItem.BLACK_AUGURITE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.ELECTABUZZ]: [ - new SpeciesEvolution(Species.ELECTIVIRE, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* Electirizer*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.ELECTIVIRE, 1, EvolutionItem.ELECTIRIZER, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.MAGMAR]: [ - new SpeciesEvolution(Species.MAGMORTAR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* Magmarizer*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MAGMORTAR, 1, EvolutionItem.MAGMARIZER, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.PORYGON]: [ - new SpeciesEvolution(Species.PORYGON2, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /*Upgrade*/), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.PORYGON2, 1, EvolutionItem.UPGRADE, null, SpeciesWildEvolutionDelay.LONG) ], [Species.PORYGON2]: [ - new SpeciesEvolution(Species.PORYGON_Z, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* Dubious disc*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.PORYGON_Z, 1, EvolutionItem.DUBIOUS_DISC, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.FEEBAS]: [ - new SpeciesEvolution(Species.MILOTIC, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* Prism scale*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.MILOTIC, 1, EvolutionItem.PRISM_SCALE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.DUSCLOPS]: [ - new SpeciesEvolution(Species.DUSKNOIR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /* Reaper cloth*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.DUSKNOIR, 1, EvolutionItem.REAPER_CLOTH, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.CLAMPERL]: [ new SpeciesEvolution(Species.HUNTAIL, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => p.gender === Gender.MALE, p => p.gender = Gender.MALE /* Deep Sea Tooth */), SpeciesWildEvolutionDelay.VERY_LONG), @@ -1558,10 +1574,10 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ACCELGOR, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => !!p.scene.gameData.dexData[Species.KARRABLAST].caughtAttr), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SPRITZEE]: [ - new SpeciesEvolution(Species.AROMATISSE, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /*Sachet*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.AROMATISSE, 1, EvolutionItem.SACHET, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.SWIRLIX]: [ - new SpeciesEvolution(Species.SLURPUFF, 1, EvolutionItem.LINKING_CORD, new SpeciesEvolutionCondition(p => true /*Whipped Dream*/), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.SLURPUFF, 1, EvolutionItem.WHIPPED_DREAM, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.PHANTUMP]: [ new SpeciesEvolution(Species.TREVENANT, 1, EvolutionItem.LINKING_CORD, null, SpeciesWildEvolutionDelay.VERY_LONG) @@ -1576,7 +1592,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.ANNIHILAPE, 35, null, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m?.moveId === Moves.RAGE_FIST).length > 0), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.GOLBAT]: [ - new SpeciesEvolution(Species.CROBAT, 1, null, new SpeciesFriendshipEvolutionCondition(110), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(Species.CROBAT, 1, null, new SpeciesFriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.VERY_LONG) ], [Species.CHANSEY]: [ new SpeciesEvolution(Species.BLISSEY, 1, null, new SpeciesFriendshipEvolutionCondition(200), SpeciesWildEvolutionDelay.LONG) @@ -1610,29 +1626,29 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.CHANSEY, 1, null, new SpeciesFriendshipEvolutionCondition(160), SpeciesWildEvolutionDelay.SHORT) ], [Species.MUNCHLAX]: [ - new SpeciesEvolution(Species.SNORLAX, 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.SNORLAX, 1, null, new SpeciesFriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) ], [Species.RIOLU]: [ - new SpeciesEvolution(Species.LUCARIO, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LUCARIO, 1, null, new SpeciesFriendshipEvolutionCondition(120, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY), SpeciesWildEvolutionDelay.LONG) ], [Species.WOOBAT]: [ - new SpeciesEvolution(Species.SWOOBAT, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(Species.SWOOBAT, 1, null, new SpeciesFriendshipEvolutionCondition(90), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.SWADLOON]: [ - new SpeciesEvolution(Species.LEAVANNY, 1, null, new SpeciesFriendshipEvolutionCondition(110), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.LEAVANNY, 1, null, new SpeciesFriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) ], [Species.TYPE_NULL]: [ - new SpeciesEvolution(Species.SILVALLY, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.SILVALLY, 1, null, new SpeciesFriendshipEvolutionCondition(100), SpeciesWildEvolutionDelay.LONG) ], [Species.ALOLA_MEOWTH]: [ - new SpeciesEvolution(Species.ALOLA_PERSIAN, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.LONG) + new SpeciesEvolution(Species.ALOLA_PERSIAN, 1, null, new SpeciesFriendshipEvolutionCondition(120), SpeciesWildEvolutionDelay.LONG) ], [Species.SNOM]: [ new SpeciesEvolution(Species.FROSMOTH, 1, null, new SpeciesFriendshipEvolutionCondition(90, p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT), SpeciesWildEvolutionDelay.MEDIUM) ], [Species.GIMMIGHOUL]: [ - new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new SpeciesEvolutionCondition( p => p.evoCounter > 9 ), SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new SpeciesEvolutionCondition( p => p.evoCounter > 9 ), SpeciesWildEvolutionDelay.VERY_LONG) ] }; diff --git a/src/data/pokemon-level-moves.ts b/src/data/pokemon-level-moves.ts index 93bd57ae32c..b56bab724be 100644 --- a/src/data/pokemon-level-moves.ts +++ b/src/data/pokemon-level-moves.ts @@ -1609,6 +1609,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 12, Moves.DRAGON_BREATH ], [ 16, Moves.CURSE ], [ 20, Moves.ROCK_SLIDE ], + [ 22, Moves.GYRO_BALL ], //Custom, from USUM [ 24, Moves.SCREECH ], [ 28, Moves.SAND_TOMB ], [ 32, Moves.STEALTH_ROCK ], @@ -2121,7 +2122,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 20, Moves.DOUBLE_HIT ], [ 24, Moves.SLASH ], [ 28, Moves.FOCUS_ENERGY ], - [ 30, Moves.STEEL_WING ], + [ 30, Moves.STEEL_WING ], //Custom [ 32, Moves.AGILITY ], [ 36, Moves.AIR_SLASH ], [ 40, Moves.X_SCISSOR ], @@ -7549,14 +7550,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.POUND ], [ 1, Moves.COPYCAT ], [ 1, Moves.BARRIER ], + [ 1, Moves.TICKLE ], //USUM [ 4, Moves.BATON_PASS ], [ 8, Moves.ENCORE ], [ 12, Moves.CONFUSION ], - [ 16, Moves.ROLE_PLAY ], + [ 16, Moves.MIMIC ], //Custom, swapped with Role Play to be closer to USUM [ 20, Moves.PROTECT ], [ 24, Moves.RECYCLE ], [ 28, Moves.PSYBEAM ], - [ 32, Moves.MIMIC ], + [ 32, Moves.ROLE_PLAY ], //Custom, swapped with Mimic [ 36, Moves.LIGHT_SCREEN ], [ 36, Moves.REFLECT ], [ 36, Moves.SAFEGUARD ], diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 453bce71503..9c8c1e6ce46 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -10,7 +10,7 @@ import * as Utils from "../utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { getLevelTotalExp } from "../data/exp"; import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; -import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier } from "../modifier/modifier"; +import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier } from "../modifier/modifier"; import { PokeballType } from "../data/pokeball"; import { Gender } from "../data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; @@ -99,6 +99,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public pauseEvolutions: boolean; public pokerus: boolean; public wildFlee: boolean; + public evoCounter: integer; public fusionSpecies: PokemonSpecies | null; public fusionFormIndex: integer; @@ -195,6 +196,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.metSpecies = dataSource.metSpecies ?? (this.metBiome !== -1 ? this.species.speciesId : this.species.getRootSpeciesId(true)); this.pauseEvolutions = dataSource.pauseEvolutions; this.pokerus = !!dataSource.pokerus; + this.evoCounter = dataSource.evoCounter ?? 0; this.fusionSpecies = dataSource.fusionSpecies instanceof PokemonSpecies ? dataSource.fusionSpecies : dataSource.fusionSpecies ? getPokemonSpecies(dataSource.fusionSpecies) : null; this.fusionFormIndex = dataSource.fusionFormIndex; this.fusionAbilityIndex = dataSource.fusionAbilityIndex; @@ -4046,6 +4048,12 @@ export class PlayerPokemon extends Pokemon { this.updateInfo(true).then(() => resolve()); }); }; + if (preEvolution.speciesId === Species.GIMMIGHOUL) { + const evotracker = this.getHeldItems().filter(m => m instanceof EvoTrackerModifier)[0] ?? null; + if (evotracker) { + this.scene.removeModifier(evotracker); + } + } if (!this.scene.gameMode.isDaily || this.metBiome > -1) { this.scene.gameData.updateSpeciesDexIvs(this.species.speciesId, this.ivs); this.scene.gameData.setPokemonSeen(this, false); diff --git a/src/locales/en/modifier-type.json b/src/locales/en/modifier-type.json index b57073325dc..c362b3f30d4 100644 --- a/src/locales/en/modifier-type.json +++ b/src/locales/en/modifier-type.json @@ -240,6 +240,8 @@ "TOXIC_ORB": { "name": "Toxic Orb", "description": "It's a bizarre orb that exudes toxins when touched and will badly poison the holder during battle." }, "FLAME_ORB": { "name": "Flame Orb", "description": "It's a bizarre orb that gives off heat when touched and will affect the holder with a burn during battle." }, + "EVOLUTION_TRACKER_GIMMIGHOUL": { "name": "Treasures", "description": "This Pokémon loves treasure! Keep collecting treasure and something might happen!"}, + "BATON": { "name": "Baton", "description": "Allows passing along effects when switching Pokémon, which also bypasses traps." }, "SHINY_CHARM": { "name": "Shiny Charm", "description": "Dramatically increases the chance of a wild Pokémon being Shiny." }, @@ -330,6 +332,21 @@ "TART_APPLE": "Tart Apple", "STRAWBERRY_SWEET": "Strawberry Sweet", "UNREMARKABLE_TEACUP": "Unremarkable Teacup", + "UPGRADE": "Upgrade", + "DUBIOUS_DISC": "Dubious Disc", + "DRAGON_SCALE": "Dragon Scale", + "PRISM_SCALE": "Prism Scale", + "RAZOR_CLAW": "Razor Claw", + "RAZOR_FANG": "Razor Fang", + "REAPER_CLOTH": "Reaper Cloth", + "ELECTIRIZER": "Electirizer", + "MAGMARIZER": "Magmarizer", + "PROTECTOR": "Protector", + "SACHET": "Sachet", + "WHIPPED_DREAM": "Whipped Dream", + "LEADERS_CREST": "Leader's Crest", + "SUN_FLUTE": "Sun Flute", + "MOON_FLUTE": "Moon Flute", "CHIPPED_POT": "Chipped Pot", "BLACK_AUGURITE": "Black Augurite", diff --git a/src/locales/en/party-ui-handler.json b/src/locales/en/party-ui-handler.json index 338bdfaec80..8e6e8046c7e 100644 --- a/src/locales/en/party-ui-handler.json +++ b/src/locales/en/party-ui-handler.json @@ -13,6 +13,7 @@ "ALL": "All", "PASS_BATON": "Pass Baton", "UNPAUSE_EVOLUTION": "Unpause Evolution", + "PAUSE_EVOLUTION": "Pause Evolution", "REVIVE": "Revive", "RENAME": "Rename", "SELECT": "Select", @@ -24,6 +25,7 @@ "tooManyItems": "{{pokemonName}} has too many\nof this item!", "anyEffect": "It won't have any effect.", "unpausedEvolutions": "Evolutions have been unpaused for {{pokemonName}}.", + "pausedEvolutions": "Evolutions have been paused for {{pokemonName}}.", "unspliceConfirmation": "Do you really want to unsplice {{fusionName}}\nfrom {{pokemonName}}? {{fusionName}} will be lost.", "wasReverted": "{{fusionName}} was reverted to {{pokemonName}}.", "releaseConfirmation": "Do you really want to release {{pokemonName}}?", diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 3703605d74e..a23a9c5ece2 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1109,11 +1109,11 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { } const evolutionItemPool = [ - party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId)).map(p => { + party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId) && (!p.pauseEvolutions || p.species.speciesId === Species.SLOWPOKE || p.species.speciesId === Species.EEVEE)).map(p => { const evolutions = pokemonEvolutions[p.species.speciesId]; return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFormKey()) && (!e.condition || e.condition.predicate(p))); }).flat(), - party.filter(p => p.isFusion() && p.fusionSpecies && pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId)).map(p => { + party.filter(p => p.isFusion() && p.fusionSpecies && pokemonEvolutions.hasOwnProperty(p.fusionSpecies.speciesId) && (!p.pauseEvolutions || p.fusionSpecies.speciesId === Species.SLOWPOKE || p.fusionSpecies.speciesId === Species.EEVEE)).map(p => { const evolutions = pokemonEvolutions[p.fusionSpecies!.speciesId]; return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || "") === p.getFusionFormKey()) && (!e.condition || e.condition.predicate(p))); }).flat() @@ -1372,6 +1372,8 @@ export const modifierTypes = { FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(false), RARE_FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(true), + EVOLUTION_TRACKER_GIMMIGHOUL: () => new PokemonHeldItemModifierType("modifierType:ModifierType.EVOLUTION_TRACKER_GIMMIGHOUL", "relic_gold", (type, _args) => new Modifiers.EvoTrackerModifier(type, (_args[0] as Pokemon).id, Species.GIMMIGHOUL, 10)), + MEGA_BRACELET: () => new ModifierType("modifierType:ModifierType.MEGA_BRACELET", "mega_bracelet", (type, _args) => new Modifiers.MegaEvolutionAccessModifier(type)), DYNAMAX_BAND: () => new ModifierType("modifierType:ModifierType.DYNAMAX_BAND", "dynamax_band", (type, _args) => new Modifiers.GigantamaxAccessModifier(type)), TERA_ORB: () => new ModifierType("modifierType:ModifierType.TERA_ORB", "tera_orb", (type, _args) => new Modifiers.TerastallizeAccessModifier(type)), diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 6614ef38253..0c4d2a63802 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -840,6 +840,41 @@ export class BaseStatModifier extends PokemonHeldItemModifier { } } +export class EvoTrackerModifier extends PokemonHeldItemModifier { + protected species: Species; + protected required: integer; + readonly isTransferrable: boolean = false; + + constructor(type: ModifierType, pokemonId: integer, species: Species, required: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + this.species = species; + this.required = required; + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof EvoTrackerModifier) { + return (modifier as EvoTrackerModifier).species === this.species; + } + return false; + } + + clone(): PersistentModifier { + return new EvoTrackerModifier(this.type, this.pokemonId, this.species, this.stackCount); + } + + getArgs(): any[] { + return super.getArgs().concat(this.species); + } + + apply(args: any[]): boolean { + return true; + } + + getMaxHeldItemCount(_pokemon: Pokemon): integer { + return this.required; + } +} + /** * Currently used by Shuckle Juice item */ @@ -1272,7 +1307,7 @@ export class SpeciesCritBoosterModifier extends CritBoosterModifier { * Applies Specific Type item boosts (e.g., Magnet) */ export class AttackTypeBoosterModifier extends PokemonHeldItemModifier { - private moveType: Type; + public moveType: Type; private boostMultiplier: number; constructor(type: ModifierType, pokemonId: integer, moveType: Type, boostPercent: number, stackCount?: integer) { @@ -2372,6 +2407,15 @@ export class MoneyRewardModifier extends ConsumableModifier { scene.addMoney(moneyAmount.value); + scene.getParty().map(p => { + if (p.species?.speciesId === Species.GIMMIGHOUL || p.fusionSpecies?.speciesId === Species.GIMMIGHOUL) { + p.evoCounter++; + const modifierType: ModifierType = modifierTypes.EVOLUTION_TRACKER_GIMMIGHOUL(); + const modifier = modifierType!.newModifier(p); + scene.addModifier(modifier); + } + }); + return true; } } diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 92bfc627ddb..5e6c0d93c8c 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -44,6 +44,7 @@ export default class PokemonData { public pauseEvolutions: boolean; public pokerus: boolean; public usedTMs: Moves[]; + public evoCounter: integer; public fusionSpecies: Species; public fusionFormIndex: integer; @@ -95,6 +96,8 @@ export default class PokemonData { } this.pokerus = !!source.pokerus; + this.evoCounter = source.evoCounter ?? 0; + this.fusionSpecies = sourcePokemon ? sourcePokemon.fusionSpecies?.speciesId : source.fusionSpecies; this.fusionFormIndex = source.fusionFormIndex; this.fusionAbilityIndex = source.fusionAbilityIndex; diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index aafcdc9bb34..a793dad6a73 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -467,8 +467,8 @@ export default class PartyUiHandler extends MessageUiHandler { } else if (option === PartyOption.UNPAUSE_EVOLUTION) { this.clearOptions(); ui.playSelect(); - pokemon.pauseEvolutions = false; - this.showText(i18next.t("partyUiHandler:unpausedEvolutions", { pokemonName: getPokemonNameWithAffix(pokemon) }), undefined, () => this.showText("", 0), null, true); + pokemon.pauseEvolutions = !pokemon.pauseEvolutions; + this.showText(i18next.t(pokemon.pauseEvolutions? "partyUiHandler:pausedEvolutions" : "partyUiHandler:unpausedEvolutions", { pokemonName: getPokemonNameWithAffix(pokemon) }), undefined, () => this.showText("", 0), null, true); } else if (option === PartyOption.UNSPLICE) { this.clearOptions(); ui.playSelect(); @@ -889,7 +889,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.options.push(PartyOption.SUMMARY); this.options.push(PartyOption.RENAME); - if (pokemon.pauseEvolutions && (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) || (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId)))) { + if ((pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) || (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId)))) { this.options.push(PartyOption.UNPAUSE_EVOLUTION); } @@ -976,6 +976,8 @@ export default class PartyUiHandler extends MessageUiHandler { if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; optionName = `${modifier.active ? i18next.t("partyUiHandler:DEACTIVATE") : i18next.t("partyUiHandler:ACTIVATE")} ${modifier.type.name}`; + } else if (option === PartyOption.UNPAUSE_EVOLUTION) { + optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:UNPAUSE_EVOLUTION") : i18next.t("partyUiHandler:PAUSE_EVOLUTION")}`; } else { if (this.localizedOptions.includes(option)) { optionName = i18next.t(`partyUiHandler:${PartyOption[option]}`); From cc5b46d5c1558938d1563253fb8d5888ecaa0586 Mon Sep 17 00:00:00 2001 From: Madmadness65 Date: Sat, 14 Sep 2024 20:46:20 -0500 Subject: [PATCH 16/17] Compile item atlas Adds the new item sprites from #2732 --- public/images/items.json | 8837 +++++++++++++++++++------------------- public/images/items.png | Bin 58177 -> 58664 bytes 2 files changed, 4450 insertions(+), 4387 deletions(-) diff --git a/public/images/items.json b/public/images/items.json index dd0cf6837be..509b4458a9f 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 428, - "h": 428 + "w": 431, + "h": 431 }, "scale": 1, "frames": [ @@ -93,6 +93,27 @@ "h": 28 } }, + { + "filename": "leaders_crest", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 29, + "h": 27 + }, + "frame": { + "x": 61, + "y": 0, + "w": 29, + "h": 27 + } + }, { "filename": "ribbon_gen2", "rotated": false, @@ -171,8 +192,8 @@ "h": 26 }, "frame": { - "x": 61, - "y": 0, + "x": 59, + "y": 27, "w": 27, "h": 26 } @@ -339,7 +360,7 @@ "h": 26 }, "frame": { - "x": 88, + "x": 90, "y": 0, "w": 24, "h": 26 @@ -388,7 +409,7 @@ } }, { - "filename": "ability_capsule", + "filename": "black_glasses", "rotated": false, "trimmed": true, "sourceSize": { @@ -397,15 +418,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 9, - "w": 24, - "h": 14 + "y": 8, + "w": 23, + "h": 17 }, "frame": { "x": 0, "y": 414, - "w": 24, - "h": 14 + "w": 23, + "h": 17 } }, { @@ -423,7 +444,7 @@ "h": 26 }, "frame": { - "x": 112, + "x": 114, "y": 0, "w": 23, "h": 26 @@ -444,7 +465,7 @@ "h": 22 }, "frame": { - "x": 135, + "x": 137, "y": 0, "w": 27, "h": 22 @@ -465,7 +486,7 @@ "h": 21 }, "frame": { - "x": 162, + "x": 164, "y": 0, "w": 28, "h": 21 @@ -486,7 +507,7 @@ "h": 21 }, "frame": { - "x": 190, + "x": 192, "y": 0, "w": 28, "h": 21 @@ -507,7 +528,7 @@ "h": 21 }, "frame": { - "x": 218, + "x": 220, "y": 0, "w": 28, "h": 21 @@ -528,7 +549,7 @@ "h": 21 }, "frame": { - "x": 246, + "x": 248, "y": 0, "w": 28, "h": 21 @@ -549,7 +570,7 @@ "h": 21 }, "frame": { - "x": 274, + "x": 276, "y": 0, "w": 28, "h": 21 @@ -570,7 +591,7 @@ "h": 21 }, "frame": { - "x": 302, + "x": 304, "y": 0, "w": 28, "h": 21 @@ -591,7 +612,7 @@ "h": 20 }, "frame": { - "x": 330, + "x": 332, "y": 0, "w": 26, "h": 20 @@ -612,7 +633,7 @@ "h": 20 }, "frame": { - "x": 356, + "x": 358, "y": 0, "w": 26, "h": 20 @@ -633,14 +654,14 @@ "h": 20 }, "frame": { - "x": 382, + "x": 384, "y": 0, "w": 25, "h": 20 } }, { - "filename": "catching_charm", + "filename": "ribbon_gen6", "rotated": false, "trimmed": true, "sourceSize": { @@ -649,15 +670,15 @@ }, "spriteSourceSize": { "x": 5, - "y": 4, - "w": 21, - "h": 24 + "y": 2, + "w": 22, + "h": 28 }, "frame": { - "x": 407, + "x": 409, "y": 0, - "w": 21, - "h": 24 + "w": 22, + "h": 28 } }, { @@ -745,7 +766,7 @@ } }, { - "filename": "ribbon_gen6", + "filename": "ribbon_gen8", "rotated": false, "trimmed": true, "sourceSize": { @@ -765,27 +786,6 @@ "h": 28 } }, - { - "filename": "ribbon_gen8", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 22, - "h": 28 - }, - "frame": { - "x": 22, - "y": 237, - "w": 22, - "h": 28 - } - }, { "filename": "black_augurite", "rotated": false, @@ -802,7 +802,7 @@ }, "frame": { "x": 22, - "y": 265, + "y": 237, "w": 22, "h": 25 } @@ -823,7 +823,7 @@ }, "frame": { "x": 22, - "y": 290, + "y": 262, "w": 23, "h": 24 } @@ -844,7 +844,7 @@ }, "frame": { "x": 22, - "y": 314, + "y": 286, "w": 24, "h": 24 } @@ -865,7 +865,7 @@ }, "frame": { "x": 22, - "y": 338, + "y": 310, "w": 24, "h": 24 } @@ -886,7 +886,7 @@ }, "frame": { "x": 22, - "y": 362, + "y": 334, "w": 24, "h": 24 } @@ -907,13 +907,13 @@ }, "frame": { "x": 22, - "y": 386, + "y": 358, "w": 24, "h": 24 } }, { - "filename": "choice_specs", + "filename": "earth_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -922,15 +922,36 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, + "y": 4, "w": 24, - "h": 18 + "h": 24 }, "frame": { - "x": 24, - "y": 410, + "x": 22, + "y": 382, "w": 24, - "h": 18 + "h": 24 + } + }, + { + "filename": "fist_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 23, + "y": 406, + "w": 24, + "h": 24 } }, { @@ -975,6 +996,27 @@ "h": 16 } }, + { + "filename": "choice_specs", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 59, + "y": 53, + "w": 24, + "h": 18 + } + }, { "filename": "calcium", "rotated": false, @@ -1018,7 +1060,7 @@ } }, { - "filename": "earth_plate", + "filename": "catching_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -1026,20 +1068,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 5, "y": 4, - "w": 24, + "w": 21, "h": 24 }, "frame": { "x": 39, "y": 134, - "w": 24, + "w": 21, "h": 24 } }, { - "filename": "fist_plate", + "filename": "flame_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1060,7 +1102,7 @@ } }, { - "filename": "flame_plate", + "filename": "focus_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -1081,7 +1123,7 @@ } }, { - "filename": "focus_band", + "filename": "golden_punch", "rotated": false, "trimmed": true, "sourceSize": { @@ -1102,7 +1144,7 @@ } }, { - "filename": "golden_punch", + "filename": "gracidea", "rotated": false, "trimmed": true, "sourceSize": { @@ -1122,27 +1164,6 @@ "h": 24 } }, - { - "filename": "gracidea", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 44, - "y": 254, - "w": 24, - "h": 24 - } - }, { "filename": "grip_claw", "rotated": false, @@ -1159,7 +1180,7 @@ }, "frame": { "x": 45, - "y": 278, + "y": 254, "w": 24, "h": 24 } @@ -1180,7 +1201,7 @@ }, "frame": { "x": 46, - "y": 302, + "y": 278, "w": 24, "h": 24 } @@ -1201,7 +1222,7 @@ }, "frame": { "x": 46, - "y": 326, + "y": 302, "w": 24, "h": 24 } @@ -1222,7 +1243,7 @@ }, "frame": { "x": 46, - "y": 350, + "y": 326, "w": 24, "h": 24 } @@ -1243,13 +1264,13 @@ }, "frame": { "x": 46, - "y": 374, + "y": 350, "w": 24, "h": 24 } }, { - "filename": "abomasite", + "filename": "lucky_punch_great", "rotated": false, "trimmed": true, "sourceSize": { @@ -1257,16 +1278,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 48, - "y": 70, - "w": 16, - "h": 16 + "x": 46, + "y": 374, + "w": 24, + "h": 24 } }, { @@ -1284,12 +1305,33 @@ "h": 24 }, "frame": { - "x": 48, + "x": 47, "y": 398, "w": 23, "h": 24 } }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 48, + "y": 71, + "w": 24, + "h": 15 + } + }, { "filename": "elixir", "rotated": false, @@ -1347,14 +1389,14 @@ "h": 24 }, "frame": { - "x": 63, + "x": 60, "y": 134, "w": 18, "h": 24 } }, { - "filename": "lucky_punch_great", + "filename": "hp_up", "rotated": false, "trimmed": true, "sourceSize": { @@ -1362,20 +1404,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 8, "y": 4, - "w": 24, + "w": 16, "h": 24 }, "frame": { "x": 63, "y": 158, - "w": 24, + "w": 16, "h": 24 } }, { - "filename": "lucky_punch_master", + "filename": "iron", "rotated": false, "trimmed": true, "sourceSize": { @@ -1383,20 +1425,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 8, "y": 4, - "w": 24, + "w": 16, "h": 24 }, "frame": { "x": 63, "y": 182, - "w": 24, + "w": 16, "h": 24 } }, { - "filename": "lucky_punch_ultra", + "filename": "lucky_punch_master", "rotated": false, "trimmed": true, "sourceSize": { @@ -1417,7 +1459,7 @@ } }, { - "filename": "lustrous_globe", + "filename": "lucky_punch_ultra", "rotated": false, "trimmed": true, "sourceSize": { @@ -1437,6 +1479,27 @@ "h": 24 } }, + { + "filename": "lustrous_globe", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 69, + "y": 254, + "w": 24, + "h": 24 + } + }, { "filename": "meadow_plate", "rotated": false, @@ -1452,8 +1515,8 @@ "h": 24 }, "frame": { - "x": 68, - "y": 254, + "x": 70, + "y": 278, "w": 24, "h": 24 } @@ -1473,8 +1536,8 @@ "h": 24 }, "frame": { - "x": 69, - "y": 278, + "x": 70, + "y": 302, "w": 24, "h": 24 } @@ -1495,7 +1558,7 @@ }, "frame": { "x": 70, - "y": 302, + "y": 326, "w": 24, "h": 24 } @@ -1516,7 +1579,7 @@ }, "frame": { "x": 70, - "y": 326, + "y": 350, "w": 24, "h": 24 } @@ -1537,7 +1600,7 @@ }, "frame": { "x": 70, - "y": 350, + "y": 374, "w": 24, "h": 24 } @@ -1558,13 +1621,55 @@ }, "frame": { "x": 70, - "y": 374, + "y": 398, "w": 24, "h": 24 } }, { - "filename": "reveal_glass", + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 137, + "y": 22, + "w": 24, + "h": 14 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 86, + "y": 27, + "w": 17, + "h": 24 + } + }, + { + "filename": "silk_scarf", "rotated": false, "trimmed": true, "sourceSize": { @@ -1574,13 +1679,13 @@ "spriteSourceSize": { "x": 4, "y": 4, - "w": 23, + "w": 24, "h": 24 }, "frame": { - "x": 71, - "y": 398, - "w": 23, + "x": 103, + "y": 26, + "w": 24, "h": 24 } }, @@ -1599,14 +1704,14 @@ "h": 23 }, "frame": { - "x": 135, - "y": 22, + "x": 127, + "y": 36, "w": 24, "h": 23 } }, { - "filename": "berry_pouch", + "filename": "coin_case", "rotated": false, "trimmed": true, "sourceSize": { @@ -1616,18 +1721,39 @@ "spriteSourceSize": { "x": 4, "y": 5, - "w": 23, + "w": 24, "h": 23 }, "frame": { - "x": 159, - "y": 22, - "w": 23, + "x": 103, + "y": 50, + "w": 24, "h": 23 } }, { - "filename": "silk_scarf", + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 83, + "y": 53, + "w": 20, + "h": 20 + } + }, + { + "filename": "dragon_scale", "rotated": false, "trimmed": true, "sourceSize": { @@ -1636,17 +1762,59 @@ }, "spriteSourceSize": { "x": 4, - "y": 4, + "y": 8, "w": 24, + "h": 18 + }, + "frame": { + "x": 127, + "y": 59, + "w": 24, + "h": 18 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, "h": 24 }, "frame": { - "x": 182, - "y": 21, - "w": 24, + "x": 151, + "y": 36, + "w": 18, "h": 24 } }, + { + "filename": "adamant_crystal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 151, + "y": 60, + "w": 23, + "h": 21 + } + }, { "filename": "sky_plate", "rotated": false, @@ -1662,7 +1830,7 @@ "h": 24 }, "frame": { - "x": 206, + "x": 169, "y": 21, "w": 24, "h": 24 @@ -1683,7 +1851,7 @@ "h": 24 }, "frame": { - "x": 230, + "x": 193, "y": 21, "w": 24, "h": 24 @@ -1704,7 +1872,7 @@ "h": 24 }, "frame": { - "x": 254, + "x": 217, "y": 21, "w": 24, "h": 24 @@ -1725,7 +1893,7 @@ "h": 24 }, "frame": { - "x": 278, + "x": 241, "y": 21, "w": 24, "h": 24 @@ -1746,33 +1914,12 @@ "h": 24 }, "frame": { - "x": 302, + "x": 265, "y": 21, "w": 24, "h": 24 } }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 326, - "y": 21, - "w": 16, - "h": 24 - } - }, { "filename": "toxic_plate", "rotated": false, @@ -1788,12 +1935,33 @@ "h": 24 }, "frame": { - "x": 342, - "y": 20, + "x": 289, + "y": 21, "w": 24, "h": 24 } }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 313, + "y": 21, + "w": 22, + "h": 24 + } + }, { "filename": "zap_plate", "rotated": false, @@ -1809,117 +1977,12 @@ "h": 24 }, "frame": { - "x": 366, + "x": 335, "y": 20, "w": 24, "h": 24 } }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 390, - "y": 20, - "w": 17, - "h": 24 - } - }, - { - "filename": "oval_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 407, - "y": 24, - "w": 21, - "h": 24 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 59, - "y": 48, - "w": 18, - "h": 22 - } - }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 59, - "y": 27, - "w": 23, - "h": 21 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 82, - "y": 26, - "w": 24, - "h": 23 - } - }, { "filename": "expert_belt", "rotated": false, @@ -1935,222 +1998,12 @@ "h": 23 }, "frame": { - "x": 106, - "y": 26, + "x": 359, + "y": 20, "w": 24, "h": 23 } }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 77, - "y": 49, - "w": 24, - "h": 22 - } - }, - { - "filename": "exp_share", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 101, - "y": 49, - "w": 24, - "h": 22 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 64, - "y": 71, - "w": 24, - "h": 15 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 88, - "y": 71, - "w": 24, - "h": 18 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 73, - "y": 86, - "w": 15, - "h": 23 - } - }, - { - "filename": "golden_net", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 21 - }, - "frame": { - "x": 88, - "y": 89, - "w": 24, - "h": 21 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 73, - "y": 110, - "w": 22, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 81, - "y": 134, - "w": 16, - "h": 24 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 95, - "y": 110, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 97, - "y": 134, - "w": 18, - "h": 24 - } - }, { "filename": "hearthflame_mask", "rotated": false, @@ -2166,8 +2019,8 @@ "h": 23 }, "frame": { - "x": 87, - "y": 158, + "x": 383, + "y": 20, "w": 24, "h": 23 } @@ -2187,201 +2040,12 @@ "h": 23 }, "frame": { - "x": 87, - "y": 181, + "x": 407, + "y": 28, "w": 24, "h": 23 } }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 92, - "y": 204, - "w": 20, - "h": 24 - } - }, - { - "filename": "shiny_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 92, - "y": 228, - "w": 21, - "h": 24 - } - }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 92, - "y": 252, - "w": 22, - "h": 23 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 93, - "y": 275, - "w": 22, - "h": 23 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 94, - "y": 298, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 94, - "y": 321, - "w": 22, - "h": 23 - } - }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 94, - "y": 344, - "w": 23, - "h": 23 - } - }, - { - "filename": "griseous_core", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 94, - "y": 367, - "w": 23, - "h": 23 - } - }, - { - "filename": "leek", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 94, - "y": 390, - "w": 23, - "h": 23 - } - }, { "filename": "candy_overlay", "rotated": false, @@ -2397,14 +2061,14 @@ "h": 15 }, "frame": { - "x": 94, - "y": 413, + "x": 169, + "y": 45, "w": 16, "h": 15 } }, { - "filename": "eviolite", + "filename": "exp_balance", "rotated": false, "trimmed": true, "sourceSize": { @@ -2412,57 +2076,57 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 110, - "y": 413, - "w": 15, - "h": 15 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 112, - "y": 71, - "w": 17, - "h": 24 - } - }, - { - "filename": "bug_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, + "x": 4, "y": 5, - "w": 22, + "w": 24, "h": 22 }, "frame": { - "x": 125, - "y": 49, - "w": 22, + "x": 185, + "y": 45, + "w": 24, + "h": 22 + } + }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 209, + "y": 45, + "w": 24, + "h": 22 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 233, + "y": 45, + "w": 24, "h": 22 } }, @@ -2481,7 +2145,7 @@ "h": 23 }, "frame": { - "x": 147, + "x": 257, "y": 45, "w": 24, "h": 23 @@ -2502,14 +2166,14 @@ "h": 23 }, "frame": { - "x": 171, + "x": 281, "y": 45, "w": 24, "h": 23 } }, { - "filename": "macho_brace", + "filename": "berry_pouch", "rotated": false, "trimmed": true, "sourceSize": { @@ -2523,35 +2187,14 @@ "h": 23 }, "frame": { - "x": 195, + "x": 305, "y": 45, "w": 23, "h": 23 } }, { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 218, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "healing_charm", + "filename": "black_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -2560,82 +2203,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 242, - "y": 45, - "w": 23, - "h": 22 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 265, - "y": 45, - "w": 23, - "h": 23 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 288, - "y": 45, - "w": 23, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, "y": 4, "w": 22, "h": 23 }, "frame": { - "x": 311, + "x": 328, "y": 45, "w": 22, "h": 23 } }, { - "filename": "max_potion", + "filename": "max_ether", "rotated": false, "trimmed": true, "sourceSize": { @@ -2649,140 +2229,14 @@ "h": 24 }, "frame": { - "x": 129, - "y": 71, + "x": 350, + "y": 44, "w": 18, "h": 24 } }, { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 147, - "y": 68, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 169, - "y": 68, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 191, - "y": 68, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 333, - "y": 45, - "w": 21, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 354, - "y": 44, - "w": 22, - "h": 23 - } - }, - { - "filename": "flying_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 376, - "y": 44, - "w": 22, - "h": 23 - } - }, - { - "filename": "icy_reins_of_unity", + "filename": "reveal_glass", "rotated": false, "trimmed": true, "sourceSize": { @@ -2791,36 +2245,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 24, - "h": 20 + "y": 4, + "w": 23, + "h": 24 }, "frame": { - "x": 398, - "y": 48, - "w": 24, - "h": 20 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 112, - "y": 95, - "w": 15, - "h": 15 + "x": 368, + "y": 43, + "w": 23, + "h": 24 } }, { @@ -2838,266 +2271,14 @@ "h": 24 }, "frame": { - "x": 113, - "y": 110, + "x": 391, + "y": 43, "w": 16, "h": 24 } }, { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 115, - "y": 134, - "w": 16, - "h": 24 - } - }, - { - "filename": "focus_sash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 111, - "y": 158, - "w": 22, - "h": 23 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 111, - "y": 181, - "w": 22, - "h": 23 - } - }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 112, - "y": 204, - "w": 22, - "h": 23 - } - }, - { - "filename": "ground_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 113, - "y": 227, - "w": 22, - "h": 23 - } - }, - { - "filename": "ice_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 114, - "y": 250, - "w": 22, - "h": 23 - } - }, - { - "filename": "lansat_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 115, - "y": 273, - "w": 21, - "h": 23 - } - }, - { - "filename": "leaf_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 116, - "y": 296, - "w": 21, - "h": 23 - } - }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 116, - "y": 319, - "w": 22, - "h": 23 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 117, - "y": 342, - "w": 22, - "h": 23 - } - }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 117, - "y": 365, - "w": 22, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 117, - "y": 388, - "w": 22, - "h": 23 - } - }, - { - "filename": "black_glasses", + "filename": "golden_net", "rotated": false, "trimmed": true, "sourceSize": { @@ -3106,40 +2287,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 125, - "y": 411, - "w": 23, - "h": 17 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, "y": 5, - "w": 17, - "h": 23 + "w": 24, + "h": 21 }, "frame": { - "x": 213, - "y": 68, - "w": 17, - "h": 23 + "x": 407, + "y": 51, + "w": 24, + "h": 21 } }, { - "filename": "psychic_tera_shard", + "filename": "icy_reins_of_unity", "rotated": false, "trimmed": true, "sourceSize": { @@ -3147,20 +2307,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 + "x": 4, + "y": 7, + "w": 24, + "h": 20 }, "frame": { - "x": 230, + "x": 174, "y": 67, - "w": 22, - "h": 23 + "w": 24, + "h": 20 } }, { - "filename": "rusted_sword", + "filename": "metal_powder", "rotated": false, "trimmed": true, "sourceSize": { @@ -3169,15 +2329,120 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, - "w": 23, - "h": 22 + "y": 6, + "w": 24, + "h": 20 }, "frame": { - "x": 252, + "x": 198, + "y": 67, + "w": 24, + "h": 20 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 222, + "y": 67, + "w": 24, + "h": 20 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 246, "y": 68, - "w": 23, - "h": 22 + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 270, + "y": 68, + "w": 24, + "h": 20 + } + }, + { + "filename": "shadow_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 294, + "y": 68, + "w": 24, + "h": 20 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 318, + "y": 68, + "w": 24, + "h": 20 } }, { @@ -3195,7 +2460,7 @@ "h": 21 }, "frame": { - "x": 275, + "x": 342, "y": 68, "w": 23, "h": 21 @@ -3216,77 +2481,14 @@ "h": 21 }, "frame": { - "x": 298, - "y": 68, - "w": 23, - "h": 21 - } - }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 321, - "y": 68, - "w": 24, - "h": 20 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 345, - "y": 68, - "w": 19, - "h": 20 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 364, + "x": 368, "y": 67, "w": 23, "h": 21 } }, { - "filename": "quick_powder", + "filename": "pp_max", "rotated": false, "trimmed": true, "sourceSize": { @@ -3294,20 +2496,41 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 391, + "y": 67, + "w": 16, + "h": 24 + } + }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, "y": 6, - "w": 24, + "w": 23, "h": 20 }, "frame": { - "x": 387, - "y": 68, - "w": 24, + "x": 407, + "y": 72, + "w": 23, "h": 20 } }, { - "filename": "super_lure", + "filename": "max_lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -3321,77 +2544,14 @@ "h": 24 }, "frame": { - "x": 411, - "y": 68, + "x": 73, + "y": 87, "w": 17, "h": 24 } }, { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 147, - "y": 91, - "w": 24, - "h": 20 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 171, - "y": 91, - "w": 24, - "h": 20 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 195, - "y": 91, - "w": 24, - "h": 20 - } - }, - { - "filename": "sachet", + "filename": "bug_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3401,18 +2561,18 @@ "spriteSourceSize": { "x": 6, "y": 4, - "w": 18, + "w": 22, "h": 23 }, "frame": { - "x": 129, - "y": 95, - "w": 18, + "x": 73, + "y": 111, + "w": 22, "h": 23 } }, { - "filename": "relic_band", + "filename": "max_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -3421,15 +2581,141 @@ }, "spriteSourceSize": { "x": 7, - "y": 9, - "w": 17, - "h": 16 + "y": 4, + "w": 18, + "h": 24 }, "frame": { - "x": 129, - "y": 118, - "w": 17, - "h": 16 + "x": 78, + "y": 134, + "w": 18, + "h": 24 + } + }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 79, + "y": 158, + "w": 21, + "h": 24 + } + }, + { + "filename": "shiny_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 79, + "y": 182, + "w": 21, + "h": 24 + } + }, + { + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 90, + "y": 73, + "w": 23, + "h": 23 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 90, + "y": 96, + "w": 15, + "h": 15 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 95, + "y": 111, + "w": 22, + "h": 23 + } + }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 96, + "y": 134, + "w": 20, + "h": 24 } }, { @@ -3447,8 +2733,8 @@ "h": 24 }, "frame": { - "x": 131, - "y": 134, + "x": 100, + "y": 158, "w": 16, "h": 24 } @@ -3468,14 +2754,14 @@ "h": 24 }, "frame": { - "x": 133, - "y": 158, + "x": 100, + "y": 182, "w": 16, "h": 24 } }, { - "filename": "charcoal", + "filename": "griseous_core", "rotated": false, "trimmed": true, "sourceSize": { @@ -3485,18 +2771,18 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 22, - "h": 22 + "w": 23, + "h": 23 }, "frame": { - "x": 133, - "y": 182, - "w": 22, - "h": 22 + "x": 92, + "y": 206, + "w": 23, + "h": 23 } }, { - "filename": "reaper_cloth", + "filename": "leek", "rotated": false, "trimmed": true, "sourceSize": { @@ -3504,20 +2790,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 4, "y": 5, - "w": 22, + "w": 23, "h": 23 }, "frame": { - "x": 134, - "y": 204, - "w": 22, + "x": 92, + "y": 229, + "w": 23, "h": 23 } }, { - "filename": "rock_tera_shard", + "filename": "dragon_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3531,14 +2817,14 @@ "h": 23 }, "frame": { - "x": 135, - "y": 227, + "x": 93, + "y": 252, "w": 22, "h": 23 } }, { - "filename": "sharp_beak", + "filename": "dragon_fang", "rotated": false, "trimmed": true, "sourceSize": { @@ -3551,15 +2837,204 @@ "w": 21, "h": 23 }, + "frame": { + "x": 94, + "y": 275, + "w": 21, + "h": 23 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 94, + "y": 298, + "w": 22, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 94, + "y": 321, + "w": 22, + "h": 23 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 94, + "y": 344, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 94, + "y": 367, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 94, + "y": 390, + "w": 22, + "h": 23 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 94, + "y": 413, + "w": 23, + "h": 18 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 105, + "y": 96, + "w": 15, + "h": 15 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 113, + "y": 77, + "w": 23, + "h": 19 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, "frame": { "x": 136, - "y": 250, - "w": 21, + "y": 77, + "w": 15, "h": 23 } }, { - "filename": "steel_tera_shard", + "filename": "golden_mystic_ticket", "rotated": false, "trimmed": true, "sourceSize": { @@ -3567,121 +3042,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 + "x": 4, + "y": 7, + "w": 23, + "h": 19 }, "frame": { - "x": 136, - "y": 273, - "w": 22, - "h": 23 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 137, - "y": 296, - "w": 22, - "h": 23 - } - }, - { - "filename": "water_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 138, - "y": 319, - "w": 22, - "h": 23 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 139, - "y": 342, - "w": 21, - "h": 23 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 139, - "y": 365, - "w": 22, - "h": 23 - } - }, - { - "filename": "mystic_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 139, - "y": 388, - "w": 20, - "h": 23 + "x": 151, + "y": 81, + "w": 23, + "h": 19 } }, { @@ -3699,33 +3069,12 @@ "h": 17 }, "frame": { - "x": 148, - "y": 411, + "x": 174, + "y": 87, "w": 23, "h": 17 } }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 159, - "y": 388, - "w": 17, - "h": 23 - } - }, { "filename": "chill_drive", "rotated": false, @@ -3741,12 +3090,264 @@ "h": 17 }, "frame": { - "x": 171, - "y": 411, + "x": 197, + "y": 87, "w": 23, "h": 17 } }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 220, + "y": 87, + "w": 23, + "h": 17 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 243, + "y": 88, + "w": 23, + "h": 22 + } + }, + { + "filename": "macho_brace", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 266, + "y": 88, + "w": 23, + "h": 23 + } + }, + { + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 289, + "y": 88, + "w": 23, + "h": 23 + } + }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 312, + "y": 88, + "w": 23, + "h": 23 + } + }, + { + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 335, + "y": 89, + "w": 23, + "h": 22 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 120, + "y": 96, + "w": 16, + "h": 16 + } + }, + { + "filename": "bug_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 117, + "y": 112, + "w": 22, + "h": 22 + } + }, + { + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 116, + "y": 134, + "w": 22, + "h": 23 + } + }, + { + "filename": "focus_sash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 116, + "y": 157, + "w": 22, + "h": 23 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 116, + "y": 180, + "w": 22, + "h": 23 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 139, + "y": 100, + "w": 22, + "h": 23 + } + }, { "filename": "berry_juice", "rotated": false, @@ -3762,14 +3363,14 @@ "h": 21 }, "frame": { - "x": 219, - "y": 91, + "x": 139, + "y": 123, "w": 22, "h": 21 } }, { - "filename": "dark_memory", + "filename": "ground_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3777,20 +3378,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, + "x": 6, + "y": 4, "w": 22, - "h": 22 + "h": 23 }, "frame": { - "x": 241, - "y": 90, + "x": 138, + "y": 144, "w": 22, - "h": 22 + "h": 23 } }, { - "filename": "dire_hit", + "filename": "ice_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3798,41 +3399,41 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, + "x": 6, + "y": 4, "w": 22, - "h": 22 + "h": 23 }, "frame": { - "x": 263, - "y": 90, + "x": 138, + "y": 167, "w": 22, - "h": 22 + "h": 23 } }, { - "filename": "dna_splicers", + "filename": "black_sludge", "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 32 + "w": 24, + "h": 24 }, "spriteSourceSize": { - "x": 5, - "y": 5, + "x": 1, + "y": 2, "w": 22, - "h": 22 + "h": 19 }, "frame": { - "x": 285, - "y": 89, + "x": 138, + "y": 190, "w": 22, - "h": 22 + "h": 19 } }, { - "filename": "dragon_memory", + "filename": "never_melt_ice", "rotated": false, "trimmed": true, "sourceSize": { @@ -3843,17 +3444,17 @@ "x": 5, "y": 5, "w": 22, - "h": 22 + "h": 23 }, "frame": { - "x": 307, - "y": 89, + "x": 161, + "y": 104, "w": 22, - "h": 22 + "h": 23 } }, { - "filename": "electirizer", + "filename": "normal_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3861,20 +3462,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, + "x": 6, + "y": 4, "w": 22, - "h": 22 + "h": 23 }, "frame": { - "x": 329, - "y": 88, + "x": 183, + "y": 104, "w": 22, - "h": 22 + "h": 23 } }, { - "filename": "electric_memory", + "filename": "petaya_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -3885,34 +3486,13 @@ "x": 5, "y": 5, "w": 22, - "h": 22 + "h": 23 }, "frame": { - "x": 351, - "y": 88, + "x": 205, + "y": 104, "w": 22, - "h": 22 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 373, - "y": 88, - "w": 22, - "h": 22 + "h": 23 } }, { @@ -3930,35 +3510,14 @@ "h": 24 }, "frame": { - "x": 395, - "y": 88, + "x": 227, + "y": 104, "w": 16, "h": 24 } }, { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 411, - "y": 92, - "w": 17, - "h": 23 - } - }, - { - "filename": "soft_sand", + "filename": "moon_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -3967,36 +3526,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 147, - "y": 111, - "w": 24, - "h": 20 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, "y": 6, "w": 23, - "h": 20 + "h": 21 }, "frame": { - "x": 171, - "y": 111, + "x": 243, + "y": 110, "w": 23, - "h": 20 + "h": 21 } }, { @@ -4014,54 +3552,12 @@ "h": 21 }, "frame": { - "x": 194, + "x": 266, "y": 111, "w": 23, "h": 21 } }, - { - "filename": "fairy_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 147, - "y": 131, - "w": 22, - "h": 22 - } - }, - { - "filename": "fighting_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 169, - "y": 131, - "w": 22, - "h": 22 - } - }, { "filename": "n_solarizer", "rotated": false, @@ -4077,8 +3573,8 @@ "h": 21 }, "frame": { - "x": 217, - "y": 112, + "x": 289, + "y": 111, "w": 23, "h": 21 } @@ -4098,35 +3594,14 @@ "h": 21 }, "frame": { - "x": 240, - "y": 112, + "x": 312, + "y": 111, "w": 23, "h": 21 } }, { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 263, - "y": 112, - "w": 22, - "h": 21 - } - }, - { - "filename": "fire_memory", + "filename": "charcoal", "rotated": false, "trimmed": true, "sourceSize": { @@ -4140,14 +3615,14 @@ "h": 22 }, "frame": { - "x": 285, + "x": 335, "y": 111, "w": 22, "h": 22 } }, { - "filename": "flying_memory", + "filename": "mystic_ticket", "rotated": false, "trimmed": true, "sourceSize": { @@ -4155,20 +3630,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 4, + "y": 7, + "w": 23, + "h": 19 }, "frame": { - "x": 307, - "y": 111, - "w": 22, - "h": 22 + "x": 161, + "y": 127, + "w": 23, + "h": 19 } }, { - "filename": "ganlon_berry", + "filename": "poison_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -4176,545 +3651,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 329, - "y": 110, - "w": 22, - "h": 22 - } - }, - { - "filename": "ghost_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 351, - "y": 110, - "w": 22, - "h": 22 - } - }, - { - "filename": "grass_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 373, - "y": 110, - "w": 22, - "h": 22 - } - }, - { - "filename": "ground_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 149, - "y": 153, - "w": 22, - "h": 22 - } - }, - { - "filename": "hard_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 171, - "y": 153, - "w": 20, - "h": 22 - } - }, - { - "filename": "ice_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 154, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 213, - "y": 133, - "w": 22, - "h": 22 - } - }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 235, - "y": 133, - "w": 22, - "h": 22 - } - }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 133, - "w": 22, - "h": 22 - } - }, - { - "filename": "normal_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 279, - "y": 133, - "w": 22, - "h": 22 - } - }, - { - "filename": "poison_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 301, - "y": 133, - "w": 22, - "h": 22 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 213, - "y": 155, - "w": 22, - "h": 21 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 235, - "y": 155, - "w": 22, - "h": 22 - } - }, - { - "filename": "psychic_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 257, - "y": 155, - "w": 22, - "h": 22 - } - }, - { - "filename": "rock_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 279, - "y": 155, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 301, - "y": 155, - "w": 22, - "h": 22 - } - }, - { - "filename": "super_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, + "x": 6, "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 395, - "y": 112, - "w": 16, - "h": 24 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 411, - "y": 115, - "w": 17, - "h": 22 - } - }, - { - "filename": "scroll_of_waters", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, "w": 22, - "h": 22 - }, - "frame": { - "x": 155, - "y": 175, - "w": 22, - "h": 22 - } - }, - { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 156, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "starf_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 157, - "y": 219, - "w": 22, - "h": 22 - } - }, - { - "filename": "steel_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 157, - "y": 241, - "w": 22, - "h": 22 - } - }, - { - "filename": "thick_club", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 158, - "y": 263, - "w": 22, - "h": 22 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 159, - "y": 285, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "h": 23 }, "frame": { "x": 160, - "y": 307, + "y": 146, "w": 22, - "h": 22 + "h": 23 } }, { - "filename": "tm_dark", + "filename": "psychic_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -4722,20 +3672,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, + "x": 6, + "y": 4, "w": 22, - "h": 22 + "h": 23 }, "frame": { "x": 160, - "y": 329, + "y": 169, "w": 22, - "h": 22 + "h": 23 } }, { - "filename": "sweet_apple", + "filename": "pair_of_tickets", "rotated": false, "trimmed": true, "sourceSize": { @@ -4743,20 +3693,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 + "x": 4, + "y": 7, + "w": 23, + "h": 19 }, "frame": { - "x": 177, - "y": 176, - "w": 22, - "h": 21 + "x": 184, + "y": 127, + "w": 23, + "h": 19 } }, { - "filename": "tm_dragon", + "filename": "reaper_cloth", "rotated": false, "trimmed": true, "sourceSize": { @@ -4767,227 +3717,17 @@ "x": 5, "y": 5, "w": 22, - "h": 22 - }, - "frame": { - "x": 178, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "syrupy_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 199, - "y": 176, - "w": 22, - "h": 21 - } - }, - { - "filename": "tm_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 179, - "y": 219, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 179, - "y": 241, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 200, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fire", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 180, - "y": 263, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_flying", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 181, - "y": 285, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 201, - "y": 219, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 201, - "y": 241, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 202, - "y": 263, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "h": 23 }, "frame": { "x": 182, - "y": 307, + "y": 146, "w": 22, - "h": 22 + "h": 23 } }, { - "filename": "tm_normal", + "filename": "rock_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -4995,20 +3735,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, + "x": 6, + "y": 4, "w": 22, - "h": 22 + "h": 23 }, "frame": { "x": 182, - "y": 329, + "y": 169, "w": 22, - "h": 22 + "h": 23 } }, { - "filename": "tm_poison", + "filename": "blue_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -5016,20 +3756,41 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 203, - "y": 285, - "w": 22, - "h": 22 + "x": 207, + "y": 127, + "w": 20, + "h": 20 } }, { - "filename": "tm_psychic", + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 204, + "y": 147, + "w": 22, + "h": 23 + } + }, + { + "filename": "dark_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5044,28 +3805,7 @@ }, "frame": { "x": 204, - "y": 307, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 204, - "y": 329, + "y": 170, "w": 22, "h": 22 } @@ -5085,96 +3825,12 @@ "h": 20 }, "frame": { - "x": 221, - "y": 177, + "x": 160, + "y": 192, "w": 23, "h": 20 } }, - { - "filename": "tm_steel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 222, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 244, - "y": 177, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 266, - "y": 177, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 288, - "y": 177, - "w": 22, - "h": 22 - } - }, { "filename": "shell_bell", "rotated": false, @@ -5190,140 +3846,14 @@ "h": 20 }, "frame": { - "x": 244, - "y": 199, + "x": 183, + "y": 192, "w": 23, "h": 20 } }, { - "filename": "x_accuracy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 223, - "y": 219, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_attack", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 223, - "y": 241, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_defense", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 245, - "y": 219, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 267, - "y": 199, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 224, - "y": 263, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_speed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 245, - "y": 241, - "w": 22, - "h": 22 - } - }, - { - "filename": "sitrus_berry", + "filename": "dawn_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5332,13 +3862,1126 @@ }, "spriteSourceSize": { "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 206, + "y": 192, + "w": 20, + "h": 21 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 227, + "y": 128, + "w": 16, + "h": 24 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 243, + "y": 131, + "w": 22, + "h": 21 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 226, + "y": 152, + "w": 22, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 226, + "y": 175, + "w": 22, + "h": 23 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 265, + "y": 132, + "w": 22, + "h": 20 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 248, + "y": 152, + "w": 22, + "h": 23 + } + }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 248, + "y": 175, + "w": 22, + "h": 22 + } + }, + { + "filename": "dna_splicers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 287, + "y": 132, + "w": 22, + "h": 22 + } + }, + { + "filename": "dragon_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 309, + "y": 132, + "w": 22, + "h": 22 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 270, + "y": 152, + "w": 17, + "h": 24 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 287, + "y": 154, + "w": 22, + "h": 22 + } + }, + { + "filename": "electric_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 309, + "y": 154, + "w": 22, + "h": 22 + } + }, + { + "filename": "enigma_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 270, + "y": 176, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 292, + "y": 176, + "w": 22, + "h": 22 + } + }, + { + "filename": "fighting_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 331, + "y": 133, + "w": 22, + "h": 22 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 331, + "y": 155, + "w": 22, + "h": 22 + } + }, + { + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 314, + "y": 176, + "w": 17, + "h": 23 + } + }, + { + "filename": "flying_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 331, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 226, + "y": 198, + "w": 22, + "h": 19 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 248, + "y": 197, + "w": 22, + "h": 20 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 270, + "y": 198, + "w": 22, + "h": 19 + } + }, + { + "filename": "ganlon_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 292, + "y": 198, + "w": 22, + "h": 22 + } + }, + { + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 314, + "y": 199, + "w": 22, + "h": 22 + } + }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 336, + "y": 199, + "w": 18, + "h": 22 + } + }, + { + "filename": "grass_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 116, + "y": 203, + "w": 22, + "h": 22 + } + }, + { + "filename": "ground_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 115, + "y": 225, + "w": 22, + "h": 22 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 115, + "y": 247, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 115, + "y": 269, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 138, + "y": 209, + "w": 22, + "h": 22 + } + }, + { + "filename": "lansat_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 137, + "y": 231, + "w": 21, + "h": 23 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 137, + "y": 254, + "w": 21, + "h": 23 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 160, + "y": 212, + "w": 22, + "h": 21 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 182, + "y": 212, + "w": 22, + "h": 22 + } + }, + { + "filename": "mini_black_hole", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 204, + "y": 213, + "w": 22, + "h": 22 + } + }, + { + "filename": "moon_flute", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 22, + "h": 22 + }, + "frame": { + "x": 158, + "y": 233, + "w": 22, + "h": 22 + } + }, + { + "filename": "normal_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 158, + "y": 255, + "w": 22, + "h": 22 + } + }, + { + "filename": "poison_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 180, + "y": 234, + "w": 22, + "h": 22 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 180, + "y": 256, + "w": 22, + "h": 22 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 202, + "y": 235, + "w": 22, + "h": 22 + } + }, + { + "filename": "rock_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 202, + "y": 257, + "w": 22, + "h": 22 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 226, + "y": 217, + "w": 22, + "h": 20 + } + }, + { + "filename": "scroll_of_darkness", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 248, + "y": 217, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_waters", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 270, + "y": 217, + "w": 22, + "h": 22 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 224, + "y": 237, + "w": 21, + "h": 23 + } + }, + { + "filename": "shed_shell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 292, + "y": 220, + "w": 22, + "h": 22 + } + }, + { + "filename": "starf_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 314, + "y": 221, + "w": 22, + "h": 22 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 224, + "y": 260, + "w": 21, + "h": 21 + } + }, + { + "filename": "steel_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 245, + "y": 239, + "w": 22, + "h": 22 + } + }, + { + "filename": "sun_flute", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 22, + "h": 22 + }, + "frame": { + "x": 267, + "y": 239, + "w": 22, + "h": 22 + } + }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 245, + "y": 261, + "w": 22, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 267, + "y": 261, + "w": 22, + "h": 21 + } + }, + { + "filename": "thick_club", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 289, + "y": 242, + "w": 22, + "h": 22 + } + }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, "y": 5, "w": 20, "h": 22 }, "frame": { - "x": 225, - "y": 285, + "x": 336, + "y": 221, "w": 20, "h": 22 } @@ -5357,99 +5000,15 @@ "w": 22, "h": 21 }, - "frame": { - "x": 267, - "y": 221, - "w": 22, - "h": 21 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 267, - "y": 242, - "w": 22, - "h": 20 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, "frame": { "x": 289, - "y": 199, - "w": 21, - "h": 21 - } - }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 246, - "y": 263, - "w": 21, - "h": 21 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, + "y": 264, "w": 22, - "h": 20 - }, - "frame": { - "x": 267, - "y": 262, - "w": 22, - "h": 20 + "h": 21 } }, { - "filename": "shiny_stone", + "filename": "thunder_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5458,61 +5017,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 289, - "y": 220, - "w": 21, - "h": 21 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 289, - "y": 241, - "w": 21, - "h": 21 - } - }, - { - "filename": "lock_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, "y": 5, - "w": 19, + "w": 22, "h": 22 }, "frame": { - "x": 226, - "y": 307, - "w": 19, + "x": 311, + "y": 243, + "w": 22, "h": 22 } }, { - "filename": "malicious_armor", + "filename": "tm_bug", "rotated": false, "trimmed": true, "sourceSize": { @@ -5521,246 +5038,15 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 289, - "y": 262, - "w": 22, - "h": 20 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 226, - "y": 329, - "w": 19, - "h": 22 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 310, - "y": 177, - "w": 16, - "h": 24 - } - }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 310, - "y": 201, - "w": 16, - "h": 24 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 310, - "y": 225, - "w": 17, - "h": 22 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 161, - "y": 351, - "w": 23, - "h": 19 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 161, - "y": 370, - "w": 23, - "h": 18 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 184, - "y": 351, - "w": 23, - "h": 19 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 207, - "y": 351, - "w": 23, - "h": 19 - } - }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 184, - "y": 370, - "w": 23, - "h": 19 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 176, - "y": 389, - "w": 15, - "h": 22 - } - }, - { - "filename": "black_sludge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 24 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, "w": 22, - "h": 19 + "h": 22 }, "frame": { - "x": 207, - "y": 370, + "x": 333, + "y": 243, "w": 22, - "h": 19 + "h": 22 } }, { @@ -5778,14 +5064,14 @@ "h": 20 }, "frame": { - "x": 191, - "y": 389, + "x": 311, + "y": 265, "w": 22, "h": 20 } }, { - "filename": "blunder_policy", + "filename": "tm_dark", "rotated": false, "trimmed": true, "sourceSize": { @@ -5794,225 +5080,15 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 5, "w": 22, - "h": 19 + "h": 22 }, "frame": { - "x": 194, - "y": 409, + "x": 333, + "y": 265, "w": 22, - "h": 19 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 213, - "y": 389, - "w": 20, - "h": 20 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 216, - "y": 409, - "w": 22, - "h": 19 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 230, - "y": 351, - "w": 19, - "h": 19 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 229, - "y": 370, - "w": 20, - "h": 19 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 233, - "y": 389, - "w": 20, - "h": 20 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 238, - "y": 409, - "w": 22, - "h": 19 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 323, - "y": 133, - "w": 20, - "h": 21 - } - }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 323, - "y": 154, - "w": 20, - "h": 20 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 343, - "y": 132, - "w": 23, - "h": 17 - } - }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 343, - "y": 149, - "w": 20, - "h": 20 + "h": 22 } }, { @@ -6030,14 +5106,140 @@ "h": 17 }, "frame": { - "x": 366, - "y": 132, + "x": 137, + "y": 277, "w": 23, "h": 17 } }, { - "filename": "mb", + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 116, + "y": 291, + "w": 21, + "h": 23 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 116, + "y": 314, + "w": 20, + "h": 23 + } + }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 116, + "y": 337, + "w": 20, + "h": 22 + } + }, + { + "filename": "tm_dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 137, + "y": 294, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 136, + "y": 316, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 136, + "y": 338, + "w": 22, + "h": 22 + } + }, + { + "filename": "gb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6051,14 +5253,14 @@ "h": 20 }, "frame": { - "x": 363, - "y": 149, + "x": 116, + "y": 359, "w": 20, "h": 20 } }, { - "filename": "quick_claw", + "filename": "tm_fighting", "rotated": false, "trimmed": true, "sourceSize": { @@ -6066,20 +5268,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 326, - "y": 174, - "w": 19, - "h": 21 + "x": 116, + "y": 379, + "w": 22, + "h": 22 } }, { - "filename": "spell_tag", + "filename": "upgrade", "rotated": false, "trimmed": true, "sourceSize": { @@ -6087,41 +5289,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 326, - "y": 195, - "w": 19, - "h": 21 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, + "x": 5, "y": 7, - "w": 21, + "w": 22, "h": 19 }, "frame": { - "x": 345, - "y": 169, - "w": 21, + "x": 136, + "y": 360, + "w": 22, "h": 19 } }, { - "filename": "pb", + "filename": "tm_fire", "rotated": false, "trimmed": true, "sourceSize": { @@ -6129,58 +5310,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 345, - "y": 188, - "w": 20, - "h": 20 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 366, - "y": 169, - "w": 19, - "h": 20 - } - }, - { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 365, - "y": 189, - "w": 20, - "h": 20 + "x": 138, + "y": 379, + "w": 22, + "h": 22 } }, { @@ -6198,12 +5337,348 @@ "h": 17 }, "frame": { - "x": 345, - "y": 208, + "x": 160, + "y": 277, "w": 20, "h": 17 } }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 159, + "y": 294, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 158, + "y": 316, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 158, + "y": 338, + "w": 22, + "h": 22 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 158, + "y": 360, + "w": 21, + "h": 19 + } + }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 160, + "y": 379, + "w": 19, + "h": 22 + } + }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 180, + "y": 278, + "w": 17, + "h": 16 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 181, + "y": 294, + "w": 19, + "h": 22 + } + }, + { + "filename": "tm_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 180, + "y": 316, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 180, + "y": 338, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 179, + "y": 360, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 179, + "y": 382, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 117, + "y": 401, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 139, + "y": 401, + "w": 22, + "h": 22 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 161, + "y": 401, + "w": 18, + "h": 23 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 179, + "y": 404, + "w": 22, + "h": 22 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 358, + "y": 89, + "w": 15, + "h": 22 + } + }, { "filename": "razor_fang", "rotated": false, @@ -6219,14 +5694,35 @@ "h": 20 }, "frame": { - "x": 327, - "y": 216, + "x": 373, + "y": 88, "w": 18, "h": 20 } }, { - "filename": "masterpiece_teacup", + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 357, + "y": 111, + "w": 17, + "h": 22 + } + }, + { + "filename": "tm_water", "rotated": false, "trimmed": true, "sourceSize": { @@ -6235,19 +5731,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 7, - "w": 21, - "h": 18 + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 365, - "y": 209, - "w": 21, - "h": 18 + "x": 353, + "y": 133, + "w": 22, + "h": 22 } }, { - "filename": "power_herb", + "filename": "water_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -6255,20 +5751,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 345, - "y": 225, - "w": 20, - "h": 19 + "x": 353, + "y": 155, + "w": 22, + "h": 22 } }, { - "filename": "old_gateau", + "filename": "water_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -6276,20 +5772,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 365, - "y": 227, - "w": 21, - "h": 18 + "x": 353, + "y": 177, + "w": 22, + "h": 22 } }, { - "filename": "baton", + "filename": "x_accuracy", "rotated": false, "trimmed": true, "sourceSize": { @@ -6297,20 +5793,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 327, - "y": 236, - "w": 18, - "h": 18 + "x": 354, + "y": 199, + "w": 22, + "h": 22 } }, { - "filename": "razor_claw", + "filename": "x_attack", "rotated": false, "trimmed": true, "sourceSize": { @@ -6318,20 +5814,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 345, - "y": 244, - "w": 20, - "h": 19 + "x": 356, + "y": 221, + "w": 22, + "h": 22 } }, { - "filename": "sharp_meteorite", + "filename": "x_defense", "rotated": false, "trimmed": true, "sourceSize": { @@ -6339,20 +5835,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 365, - "y": 245, - "w": 21, - "h": 18 + "x": 355, + "y": 243, + "w": 22, + "h": 22 } }, { - "filename": "golden_egg", + "filename": "x_sp_atk", "rotated": false, "trimmed": true, "sourceSize": { @@ -6360,20 +5856,41 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 355, + "y": 265, + "w": 22, + "h": 22 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, "w": 17, - "h": 20 + "h": 23 }, "frame": { - "x": 383, - "y": 149, + "x": 374, + "y": 108, "w": 17, - "h": 20 + "h": 23 } }, { - "filename": "hard_stone", + "filename": "unknown", "rotated": false, "trimmed": true, "sourceSize": { @@ -6381,20 +5898,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 + "x": 8, + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 385, - "y": 169, - "w": 19, - "h": 20 + "x": 391, + "y": 91, + "w": 16, + "h": 24 } }, { - "filename": "rb", + "filename": "x_sp_def", "rotated": false, "trimmed": true, "sourceSize": { @@ -6402,20 +5919,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 385, - "y": 189, - "w": 20, - "h": 20 + "x": 407, + "y": 92, + "w": 22, + "h": 22 } }, { - "filename": "smooth_meteorite", + "filename": "zinc", "rotated": false, "trimmed": true, "sourceSize": { @@ -6423,20 +5940,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 20, - "h": 20 + "x": 8, + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 386, - "y": 209, - "w": 20, - "h": 20 + "x": 375, + "y": 131, + "w": 16, + "h": 24 } }, { - "filename": "strange_ball", + "filename": "super_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -6444,37 +5961,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 386, - "y": 229, - "w": 20, - "h": 20 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 386, - "y": 249, - "w": 20, - "h": 20 + "x": 391, + "y": 115, + "w": 17, + "h": 23 } }, { @@ -6492,14 +5988,98 @@ "h": 17 }, "frame": { - "x": 405, - "y": 137, + "x": 408, + "y": 114, "w": 23, "h": 17 } }, { - "filename": "mystery_egg", + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 375, + "y": 155, + "w": 17, + "h": 22 + } + }, + { + "filename": "x_speed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 375, + "y": 177, + "w": 22, + "h": 22 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 376, + "y": 199, + "w": 21, + "h": 21 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 378, + "y": 220, + "w": 19, + "h": 21 + } + }, + { + "filename": "absolite", "rotated": false, "trimmed": true, "sourceSize": { @@ -6510,12 +6090,75 @@ "x": 8, "y": 8, "w": 16, + "h": 16 + }, + "frame": { + "x": 391, + "y": 138, + "w": 16, + "h": 16 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 392, + "y": 154, + "w": 21, + "h": 21 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 413, + "y": 131, + "w": 18, + "h": 19 + } + }, + { + "filename": "baton", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, "h": 18 }, "frame": { - "x": 311, - "y": 247, - "w": 16, + "x": 413, + "y": 150, + "w": 18, "h": 18 } }, @@ -6534,14 +6177,14 @@ "h": 18 }, "frame": { - "x": 327, - "y": 254, + "x": 413, + "y": 168, "w": 18, "h": 18 } }, { - "filename": "absolite", + "filename": "mystery_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -6552,55 +6195,13 @@ "x": 8, "y": 8, "w": 16, - "h": 16 + "h": 18 }, "frame": { - "x": 311, - "y": 265, + "x": 397, + "y": 175, "w": 16, - "h": 16 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, "h": 18 - }, - "frame": { - "x": 345, - "y": 263, - "w": 21, - "h": 18 - } - }, - { - "filename": "white_herb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 366, - "y": 263, - "w": 20, - "h": 19 } }, { @@ -6618,96 +6219,12 @@ "h": 18 }, "frame": { - "x": 327, - "y": 272, + "x": 413, + "y": 186, "w": 18, "h": 18 } }, - { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 386, - "y": 269, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 345, - "y": 281, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_awakening", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 365, - "y": 282, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_burn_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 385, - "y": 287, - "w": 20, - "h": 18 - } - }, { "filename": "aerodactylite", "rotated": false, @@ -6723,8 +6240,8 @@ "h": 16 }, "frame": { - "x": 311, - "y": 281, + "x": 397, + "y": 193, "w": 16, "h": 16 } @@ -6744,96 +6261,12 @@ "h": 18 }, "frame": { - "x": 327, - "y": 290, + "x": 413, + "y": 204, "w": 18, "h": 18 } }, - { - "filename": "wl_custom_spliced", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 345, - "y": 299, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_thief", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 365, - "y": 300, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 385, - "y": 305, - "w": 20, - "h": 18 - } - }, - { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 404, - "y": 154, - "w": 19, - "h": 19 - } - }, { "filename": "aggronite", "rotated": false, @@ -6849,54 +6282,12 @@ "h": 16 }, "frame": { - "x": 404, - "y": 173, + "x": 397, + "y": 209, "w": 16, "h": 16 } }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 405, - "y": 189, - "w": 17, - "h": 20 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 406, - "y": 209, - "w": 18, - "h": 19 - } - }, { "filename": "light_ball", "rotated": false, @@ -6912,180 +6303,12 @@ "h": 18 }, "frame": { - "x": 406, - "y": 228, + "x": 413, + "y": 222, "w": 18, "h": 18 } }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 406, - "y": 246, - "w": 18, - "h": 18 - } - }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 406, - "y": 264, - "w": 18, - "h": 18 - } - }, - { - "filename": "wl_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 406, - "y": 282, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 405, - "y": 300, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 405, - "y": 318, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 267, - "y": 282, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 287, - "y": 282, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ice_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 307, - "y": 297, - "w": 20, - "h": 18 - } - }, { "filename": "alakazite", "rotated": false, @@ -7101,14 +6324,98 @@ "h": 16 }, "frame": { - "x": 327, - "y": 308, + "x": 397, + "y": 225, "w": 16, "h": 16 } }, { - "filename": "wl_item_drop", + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 413, + "y": 240, + "w": 18, + "h": 18 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 200, + "y": 279, + "w": 21, + "h": 21 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 221, + "y": 281, + "w": 20, + "h": 19 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 241, + "y": 282, + "w": 21, + "h": 18 + } + }, + { + "filename": "old_gateau", "rotated": false, "trimmed": true, "sourceSize": { @@ -7118,268 +6425,16 @@ "spriteSourceSize": { "x": 6, "y": 8, - "w": 20, + "w": 21, "h": 18 }, "frame": { - "x": 343, - "y": 317, - "w": 20, + "x": 262, + "y": 282, + "w": 21, "h": 18 } }, - { - "filename": "wl_item_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 363, - "y": 318, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 383, - "y": 323, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 403, - "y": 336, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 246, - "y": 284, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 245, - "y": 302, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_paralyze_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 245, - "y": 320, - "w": 20, - "h": 18 - } - }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 245, - "y": 338, - "w": 15, - "h": 11 - } - }, - { - "filename": "wl_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 249, - "y": 349, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_reset_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 249, - "y": 367, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 253, - "y": 385, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 260, - "y": 403, - "w": 20, - "h": 18 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 265, - "y": 302, - "w": 12, - "h": 17 - } - }, { "filename": "altarianite", "rotated": false, @@ -7395,12 +6450,558 @@ "h": 16 }, "frame": { - "x": 277, + "x": 200, "y": 300, "w": 16, "h": 16 } }, + { + "filename": "sharp_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 21, + "h": 18 + }, + "frame": { + "x": 216, + "y": 300, + "w": 21, + "h": 18 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 237, + "y": 300, + "w": 21, + "h": 18 + } + }, + { + "filename": "magnet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 258, + "y": 300, + "w": 20, + "h": 20 + } + }, + { + "filename": "mb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 283, + "y": 285, + "w": 20, + "h": 20 + } + }, + { + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 303, + "y": 285, + "w": 20, + "h": 20 + } + }, + { + "filename": "pb_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 278, + "y": 305, + "w": 20, + "h": 20 + } + }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 298, + "y": 305, + "w": 20, + "h": 20 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 202, + "y": 316, + "w": 12, + "h": 17 + } + }, + { + "filename": "power_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 214, + "y": 318, + "w": 20, + "h": 19 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 234, + "y": 318, + "w": 20, + "h": 19 + } + }, + { + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 254, + "y": 320, + "w": 20, + "h": 20 + } + }, + { + "filename": "strange_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 274, + "y": 325, + "w": 20, + "h": 20 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 294, + "y": 325, + "w": 20, + "h": 20 + } + }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 202, + "y": 337, + "w": 19, + "h": 21 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 221, + "y": 337, + "w": 19, + "h": 20 + } + }, + { + "filename": "white_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 323, + "y": 287, + "w": 20, + "h": 19 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 343, + "y": 287, + "w": 19, + "h": 19 + } + }, + { + "filename": "candy_jar", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 362, + "y": 287, + "w": 19, + "h": 20 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 318, + "y": 306, + "w": 19, + "h": 20 + } + }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 337, + "y": 306, + "w": 19, + "h": 19 + } + }, + { + "filename": "wl_ability_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 314, + "y": 326, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 356, + "y": 307, + "w": 20, + "h": 18 + } + }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 376, + "y": 307, + "w": 17, + "h": 20 + } + }, + { + "filename": "wl_awakening", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 393, + "y": 241, + "w": 20, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 413, + "y": 258, + "w": 18, + "h": 18 + } + }, + { + "filename": "wl_burn_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 393, + "y": 259, + "w": 20, + "h": 18 + } + }, { "filename": "ampharosite", "rotated": false, @@ -7416,8 +7017,8 @@ "h": 16 }, "frame": { - "x": 265, - "y": 319, + "x": 377, + "y": 243, "w": 16, "h": 16 } @@ -7437,12 +7038,138 @@ "h": 16 }, "frame": { - "x": 281, - "y": 316, + "x": 377, + "y": 259, "w": 16, "h": 16 } }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 377, + "y": 275, + "w": 15, + "h": 11 + } + }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 381, + "y": 286, + "w": 17, + "h": 20 + } + }, + { + "filename": "wl_custom_spliced", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 398, + "y": 277, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_custom_thief", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 398, + "y": 295, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 393, + "y": 313, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 240, + "y": 340, + "w": 20, + "h": 18 + } + }, { "filename": "banettite", "rotated": false, @@ -7458,12 +7185,96 @@ "h": 16 }, "frame": { - "x": 297, - "y": 315, + "x": 413, + "y": 313, "w": 16, "h": 16 } }, + { + "filename": "wl_full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 202, + "y": 358, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 201, + "y": 376, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 201, + "y": 394, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 201, + "y": 412, + "w": 20, + "h": 18 + } + }, { "filename": "beedrillite", "rotated": false, @@ -7479,12 +7290,33 @@ "h": 16 }, "frame": { - "x": 281, - "y": 332, + "x": 222, + "y": 357, "w": 16, "h": 16 } }, + { + "filename": "wl_ice_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 238, + "y": 358, + "w": 20, + "h": 18 + } + }, { "filename": "blastoisinite", "rotated": false, @@ -7500,12 +7332,243 @@ "h": 16 }, "frame": { - "x": 297, - "y": 331, + "x": 222, + "y": 373, "w": 16, "h": 16 } }, + { + "filename": "wl_item_drop", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 221, + "y": 389, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 221, + "y": 407, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 241, + "y": 376, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 241, + "y": 394, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 241, + "y": 412, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 258, + "y": 358, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_paralyze_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 261, + "y": 376, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 261, + "y": 394, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_reset_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 261, + "y": 412, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 278, + "y": 345, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 298, + "y": 345, + "w": 20, + "h": 18 + } + }, { "filename": "blazikenite", "rotated": false, @@ -7521,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 269, - "y": 348, + "x": 318, + "y": 344, "w": 16, "h": 16 } @@ -7542,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 269, - "y": 364, + "x": 334, + "y": 326, "w": 16, "h": 16 } @@ -7563,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 285, - "y": 348, + "x": 334, + "y": 342, "w": 16, "h": 16 } @@ -7584,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 285, - "y": 364, + "x": 350, + "y": 325, "w": 16, "h": 16 } @@ -7605,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 273, - "y": 380, + "x": 350, + "y": 341, "w": 16, "h": 16 } @@ -7626,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 289, - "y": 380, + "x": 366, + "y": 327, "w": 16, "h": 16 } @@ -7647,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 301, - "y": 347, + "x": 366, + "y": 343, "w": 16, "h": 16 } @@ -7668,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 301, - "y": 363, + "x": 382, + "y": 331, "w": 16, "h": 16 } @@ -7689,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 305, - "y": 379, + "x": 398, + "y": 331, "w": 16, "h": 16 } @@ -7710,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 280, - "y": 396, + "x": 414, + "y": 329, "w": 16, "h": 16 } @@ -7731,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 280, - "y": 412, + "x": 382, + "y": 347, "w": 16, "h": 16 } @@ -7752,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 296, - "y": 396, + "x": 398, + "y": 347, "w": 16, "h": 16 } @@ -7773,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 296, - "y": 412, + "x": 414, + "y": 345, "w": 16, "h": 16 } @@ -7794,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 312, - "y": 395, + "x": 281, + "y": 363, "w": 16, "h": 16 } @@ -7815,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 312, - "y": 411, + "x": 281, + "y": 379, "w": 16, "h": 16 } @@ -7836,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 324, + "x": 297, + "y": 363, "w": 16, "h": 16 } @@ -7857,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 317, - "y": 340, + "x": 281, + "y": 395, "w": 16, "h": 16 } @@ -7878,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 317, - "y": 356, + "x": 297, + "y": 379, "w": 16, "h": 16 } @@ -7899,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 321, - "y": 372, + "x": 281, + "y": 411, "w": 16, "h": 16 } @@ -7920,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 328, - "y": 388, + "x": 297, + "y": 395, "w": 16, "h": 16 } @@ -7941,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 328, - "y": 404, + "x": 297, + "y": 411, "w": 16, "h": 16 } @@ -7962,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 335, + "x": 313, + "y": 363, "w": 16, "h": 16 } @@ -7983,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 351, + "x": 313, + "y": 379, "w": 16, "h": 16 } @@ -8004,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 337, - "y": 367, + "x": 313, + "y": 395, "w": 16, "h": 16 } @@ -8025,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 344, - "y": 383, + "x": 313, + "y": 411, "w": 16, "h": 16 } @@ -8046,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 344, - "y": 399, + "x": 350, + "y": 357, "w": 16, "h": 16 } @@ -8067,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 336, + "x": 366, + "y": 359, "w": 16, "h": 16 } @@ -8088,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 336, + "x": 334, + "y": 358, "w": 16, "h": 16 } @@ -8109,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 341, + "x": 382, + "y": 363, "w": 16, "h": 16 } @@ -8130,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 353, - "y": 352, + "x": 398, + "y": 363, "w": 16, "h": 16 } @@ -8151,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 369, - "y": 357, + "x": 414, + "y": 361, "w": 16, "h": 16 } @@ -8172,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 385, - "y": 357, + "x": 329, + "y": 374, "w": 16, "h": 16 } @@ -8193,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 401, - "y": 354, + "x": 329, + "y": 390, "w": 16, "h": 16 } @@ -8214,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 401, - "y": 370, + "x": 329, + "y": 406, "w": 16, "h": 16 } @@ -8235,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 360, - "y": 386, + "x": 345, + "y": 374, "w": 16, "h": 16 } @@ -8256,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 360, - "y": 402, + "x": 345, + "y": 390, "w": 16, "h": 16 } @@ -8277,8 +8340,8 @@ "h": 16 }, "frame": { - "x": 376, - "y": 373, + "x": 345, + "y": 406, "w": 16, "h": 16 } @@ -8298,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 376, - "y": 389, + "x": 361, + "y": 375, "w": 16, "h": 16 } @@ -8319,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 376, - "y": 405, + "x": 361, + "y": 391, "w": 16, "h": 16 } @@ -8340,8 +8403,8 @@ "h": 16 }, "frame": { - "x": 392, - "y": 386, + "x": 361, + "y": 407, "w": 16, "h": 16 } @@ -8352,6 +8415,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2fe5215a80083d35f525901078cb1f59:c17ac8d050238e3fca0ec935f6e8d37f:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:d7c7ecb91ab6604d8ab2ddb533b23145:a897bbf637b19b6d2a3b966b9c84e765:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 4724f7b7b0ea480a301c741ba1cd67529fa9bf27..5f032b30cfb048c2d0cf71ec1e6ad3f051d832c9 100644 GIT binary patch literal 58664 zcmV*IKxe;+P)eEYJmOHfSv^xDv^OF=z7#$;!jQa|^)+x^qh z(?mh?`uBf(eqUf?_A4yn#q{8Yb-RK(_nD51kB$BN#I@t;o~yUGi*ks@@cH5J`n_Im zZE@4Una}n8yvqCJ!e+S4*KU@t<@){jSy=tT^Ppdp^wh5A&rWWR_Vwtazm+20;Po$_2u#ke!$(TBD2{$GJ|ic_wpqCBXi z2FdS$vh1K9c)RJ|Kv#uschagP*0Y zoWMI;Y32IToN^V0UugZv5pUc4eq_?1kXp^R3|BpEFlNMaoNVQ!MQmvdpo|<-Nye$A zT*ZeXMD;(~Cwj*OK^xwLo+5`&X7H_NSce}QEP=I#S z)wc1~7a}+xXBJnc<9G4$2C%3z}F!<~Kqn&?QZH1X8h4sf9ld~)>77d+IGz=p4fYlcj79vL=C{E~G`dX9GvQ7mB?p`%%0000AbW%=J0RR90 zd;kCbC7a7)pnCuS010qNS#tmY4#WTe4#WYKD-Ig~03ZNKL_t(|+U&gvd=*u;@1JvW zccpKI%+m=R2!sq^7$On~7@LqV6U@+`Kp;xO7%(8iRU(Rf@&W>y76L;01~q^X1Ohl9 zjev~^3W%Tx7g~sd3Q?clwiT83{psPq)*h<%uBwy7sqcOF^VZ35QkCJPzV%yc?X_3! z^7H$D_J6DC`VC*Zn)rJwMhKxF@RKmF*BdCFIR1qE&HPui@;bk7Vc)fu{=XmhbL7U4 z_?^E0nByKdHRFlf+-iMh{+_SDPP?Hy{(+`Vx?fX6OaCwX$5K*;6S5;E#Xr(}-@?ijGxP=JyYicdos9CvVVFmiIklQ1hUzneF|e(P)dpV#yA50y0ekwYc< zO|9VCF&y4@>;PUxMCJt_BI$de11>P*yZy+0gDYB=*!NF#c*56lzgAUP<@1EkUY70i z=T`Mz!$9ma5}$z>_J|!At5obF(L3V#N?Hi7Z!%J@&?#> z`Q6<5wZuz2(@XM84sB{GDLHhgsYPI92fzYcJN%Q93<80mDuxO^1lo8Nsldoi;C0VE z*PW2*I{usAF9lvUU~J#DdBCg6d7s`9cxC(exf8%^mGizEJ%QJ1AHVZy;N<{JKYaMZ zHETXRd{}Se9yce2784sQ=_@a6z<^++=ESS1d28d>;Qbi9>+E+nZ8~)M5ZL8I&CNGk ziUA}dg32p9+mx3VQAGywcWOvs|8*V<%_H;#n6B47G3SXV=IEBA zR|Tf)d#bXks}c9?bFDllE2y{gZuReh}cR)gt!+3NGFSD&};+Y6@a z?;);uJCwzxhcmzqmoC=*boq$++T#XDu~b*v!6sSv>oXaT1u?zp4wi4Jq-sQLn0z^N)LYfn{SR+g$SpcMu$DJ%?m zg{k@iTEJ=5lqs`U_3qP0)fdnLPOBf@UbcGC`SYs2fEIAt`}W(wD_(Vo1dj|ETUuIL z4ezB3;sW8LuI?$d>;WvHu}oTAW3dJ=kX4t7U|quUth{vn&>{4BbLQk9BIN6@x0V?% zno|RPyhRpU9W~C~@Tn`IdwhTZ4s+#-5di{S&(E6}XZ!lyw zdqJP^%FmJQ=NEw?v$93!BX26d^X+&vWcFTs{E9gF$9kT=Q`gt589R3S-5*zGWGpxl zxZCAgtjl{csF`~ZODv-m!-2&nnY<`20A}T-*VaN>v9sh5W*0ZFzqR$I@gi>|-`INN zMpIKwO$`8Re(>hkC39+PbszGQq8FDJrW|O9OXbC~c|v4)-E;l?b&wd?_4JCt_uYrU z^d3FtVAw)rb+>eB;_*Y^%EGXP$o6FY^;=~hlDhwXV1~SEJj%Wg$M(Ung~(?2`A+@0 zhaWzVVGEI!oiDqo?0frd$_kOa7ysutWnWB2#+_dOPd-@#|8B_GPu6_02K*k%$lSAF zK}N<{uepcuij83w0#8GQynt68@QPgF$ZJM^e#wyL%lSa8r1^4l+6|#QP*&X#fK^vl z$B=C-$*(PGa+cQ)CtgfpUdT5TUZg+R0x~j8me=*`>E{vGbt

?z@lBAUfj?z?JaC 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 literal 58177 zcmV*0KzYB3P)l+Do9{Q3I*=U&+1;+UJ6Pg7Fp=;y}9 z#;~!m{rc1E`1_5GjsEkfl~pjPBO!i(f%~to%CAHBTv*2L{QS#Cl)(7>_rdzn$Ca6? z)4!WyVte7l^l^{1p{B0jg>#~rR@eCao$3Cs)AMw5cgSF4smI5=mmTE7W~KFt`|RXo zXJxkN=YnY&y@C1I-}cl=NBh3x_a`a&zh8c<%{DlwjjXdo#QIH+J|JvR;HZ|M1Li)V-QlX{c_UC`#TAO2> z>*S=IcoyGxA|`W^$MJ@_kZR5*7U$AZOlxV#(&^pr^ip*7L7wsM@Mx>B#y>q{gVXkC zkNLAw=j-2yw}drNs89X$bj~g{{rutl-2j=Epuu+dBEfpmnxx=hxf((R;(f{!(zN zs>Z9?+hAQ-Rbp9S`k{)neahElPW_TLb~iZU(1fN>ic>2aV98R!^~}lR#P-|!(NTu< zn^PFM(|e$#i*ZH#`X-1e8H7tshCp|F>!=(yf8W5sWtVa2Gt~b5k=s=*{Fa+BmAE!{ K zzNDsWlOK$z^@O%RjZ)OdgGRQu3c@gHhuGZ4lE%Hg-tD1trfo)DvGXdAeZg>ZteUvY z&U|G(VEgU+ZApC5oKn!#8MJ?kk~2t)*o$e6laht07Q?IRm!NmMw)}dmAEqIr?7(Q> z`aTR7`(LsQhUr_^%D=p*AXpeSE)MxnAKQ|$AoAh3shgwSjUsTr|NmTb#|~rBhAuzV zv{F^VWGa<}`ZmdLwP(E3o`<#-p2aT47c(Lk6cyoenqL1>nfqL00000AbW%=J0RR90 z|NsB~C6YIvP7weA010qNS#tmY4`BcR4`BhQKc{H`03ZNKL_t(|+U&gxd=y32_n(=m z?tDJEL+$}X0s%E40Rl0=DpwN-L~gl zRfUB7Kl>kPfxx+7r_PB_m-+qvMxPVT8^M2&p*ap*_Emn`$hn=3{dbL=yA=E!yYvH| zGx#6#JmVv?9{3!;5pe%f;OyB2=K|gk7X(7i&Gq;@{^re_H%7}J9SyJ$6g)Cq*Wn$w zdq?5J3bVUihF0Kj?pz4lUsqn^f|26)v&+GPyJ-3} zJXnE6S)jw@_jT%QhTF(BAQ-#I>Qe9*W0tfE=L&Rtq}-MXOXR(D<<^f^C%_+#%k zcgft@d0r9gx9IuW{01 z%a<>2?AjWjC(a4(3>T~@ofex0u%=J{(u)`O1)nYiST0)p+|Dq7HQxJNAP!*7@;-Oz z48U3!v$-v(G7v;tXK9}OS=QC3!jRy+^z8e4B`0>v<&&>i01Zrm$CC*B8o?8bN2#i@bdEL6n&U355 z0)fiar&q5&?L7A}SRnBJ$7LUXT;?Y7$Eqx{sy_xov}hCTj1LISAx#Y)43C=4(PGx6 zOP78}o>2cwH2|xw?)dS!=kOI(R*JLd*nZ#ycCg^mrLzt6rjozN{BAeMQbZW@U$|g! zUeN-Y-|)yWq9iO<0kB^E5@Egi<>_q33S|HTQ~+tfRaeyvXmQ_ty0QQjKpH<~%2(sl zo_kJL7NAN5Sc!=UD^XV#paMwidiNf)?z+j7b!7o6fVBGbLzSyLpFXWC3s3>1k2h|7 z|Knejm1)XicwN}hs;a)T`}VD>x~`uA_W|t;H{}elik-tnCDb)XhedA>aE8ANXh-(% zM_0FYZTWtHa`yG@*4azv&gB<0G@L^#XgJ8&#bk+#F()h#o1bU_tCtKOt)zLtf?rUD zHT~5uQCOg_)7fc-@``b!WO*q7Ob<65>vT7mmOO%SS(SIxEW*Mum!EUbb9WYUdEs zs#O3CVbxY^=Qg*WjG+p7jhXjn{r5U|K8>LYc~zdSyri8g12sXYLSFBey&h`c}0I+SZgnqmnU~> zNGbk}Je0>$L>ONq=`vYp;ucyEzFA<~_V1R3U&+$FMP-602 z;EyFG99Zqt+S&ybv(jg+lII|;0K2X?2y5LKFqD{eF0T)Ws`Eo2tkv7MH#DHcELZaO zuQq;+xITXIvz1^dG3)OIVzWB>hkyP#zyctj6Ovm4>X~h4h7W%_CdEF3`2`Tdlsz^! z7IhWt^GYLiSjpve1Mb5`rCpy1qz;^N|=_)${>xbneamd};6ma8pW z2x7~{cg9N>j0Yb?O>tov08eMtzJ2@DR3>1tX%w+eXJ-ShFSCKw;c1)|&MBVKg4PuL_-gl*-DzoZ76tkuluPUB7bJeU_=_MtS z2oGBDvHK6Zue%N(_U^;y|x__4BV<--qSlCg24 zC9c@`jw#ijpZUXv4WENyYzo+C&cwtdB;fJtGuI83XM7?JY!*viu$j{dUPA4@`KBYW ztHYFU)TsUF3?DmgojeD+Isu>zNG%Klft@%9tfaEg5Bis<_ysYBk3`yT04!6mf-gEO z&WdQ+ZLDmBl$QPKbhrmt71LTWJ6oPHV@6F)hnkuiK-B_q1?+PWuy*g>@zqzm0aY5} zQqHYfb+WiPy|%VGaaPf)l3D4A$~h3%?%kWmjM)vSu0vePxjulZ;i1aPOMt2~;!@7N z_~M$CE6>0G{>sljF8c-IvXF#l#Z;g9oZAL~HQPQD3b0}b7SI|h&iG{39xIqRx-TxB z0X+^6=&%BH`+-(vLqlZ}uzJjjNr8qsV%0!-w^1A@Err(8JKTqtkU6@C~2{l2n$i6A4Dg3xS}G7X|AAVK!^JV)XbPMfN))< zM%=*e@jDKU{|a3q;+mqJD^5&LUsZeZQ8yF+c zhz9ZCIU>o>BUWJB2cLf)7YDSoqtlX-it8vtZ$NCvMQ;UsS6)|BTx_{z5KKeE_J;jy zkM9rgkmV;o2$cMQO^ILt>m^DDA2iJe4V@Lh0#!vOK8V`lu(G=qroH+lqI&g9l$Hw? z{PC+OA)G;p{C#@kI4}jHRnM;|k$+Ba90w9hph;Z23KMw{*DCegrQwtiu9H4d`@QLu z5cZ)&{4^^}CbncnO+S2=-FoOqBwcrpzTO~y$>bXDs0b5&RsDZpr?{^BEK8>xd%1fjzz27OY zaU-_2-VczrlzyiGOGxR63IdOkpkHDeqiXMy zX%LHs4mAw$8J8}tEU(+2EZp2V5ZRxSAYPr2!S~?VhFuN$<;fh@az=_0*itlM`3=kk zL0>PS%Jj4ymGvMhYw`vevrR61;?QQ zHZ}mc~R zh6bi~FENo2Qj(!5iyFgbw8%3w9EpiQYl9~%IuGfF=Qv3tqqhG#=YEP|`wu?&V9c1| zmjcu*R);SGwZ$h+)K8lR*eb9~sd$>**@U73V%V=y+3@;V2v`LL4QI7@ikU@f~POL1>W7BG_ z9tubY>&ge!H542~PC%^TtQv(YtLm#-mAoAbgAL2yZNvjykL-842oCLYU&Qs3hv^(-JjQ`vIj4t znxnA4hu-oc9hx#8Zqg1- zk;f;t34@!oiEZTZl8jAolU9;psDff~Tg#Pyg!SnxtPitE`Xa_+w+|6vssj{~c+vh(LF(3r*wXw}xb1SVL;g0kQNlftq|DX>6THYo)b z2+Jm=zye{}q*PdOm>eaQmnU6RtLXYjWm&McZ0V}OdQCiURn-j|tZ9ZKtk8i2na7*h zgO(A}2&;d#aad)K11zLaD{XBVkR^VfB=-+UT(IB&-Y_R;^T45`x;gb!*(#i%CiFfYXw&ScoUAEkR&a zNmzht8=x9k$Xu+zUJF9Y^Qh0OvR98yd3kwGFU7R@!_)-IC2n@U>~U~{1PgGf+1ox1G-c<8NCMG6Ef(4~zq(($Ur0RW2b@vGCC%Sr5 z>`vPhF#Tnfp{~l#b69GA0kFmu3omFZi*ZPTl?4kzmJX{ohXo-^hc$)6f{>-dYQtec z$kJhD*suT-xZMJ{61sVYet^A1@8mMdh95{fPC1-k0B%^k8{do8%MJoMy?%+1Xm z1eTlV(==wO$;k46bx)nJen^X@_+>{gc6+2Ocff+|V#woP5Qp zNCuIY85-yU z^Aan@KUF_y7^5>0);P45nVD`@rpn4AWJy@gkR@R`LzaZ)3|SIZc{#F*BUa@ieP_!$ zRaGG^_*}+*K*)law+-{bUfWiCNeI-%9H1V5{GI_CFdxw2f=ayS*I@S~M$)&riQFF= zSy@PHDKGBW*JiLyVEl&vsYltE(14CAAW=ny}dVh040W6aOR{YNwvJe)q zDn}<+E+Q0ra>SEWD6US+o+MaT9J0*Qr!i!0JAK;pqNT6`Kx@{Nm6;}9rR%S^dHE6t zaUl^apv85SD`FSGN=?n~kq6AOQhO|2y3_@$1DaqZ_=uWoy-ps|iy@Ykl?{>7LRM3! zP92vi%&=KO&Mt%ntt|8B3Rx`aB6vaM1X)J8rK~4M6pi2}U|m_rLRO2YWP6bpE%1YO z-T#mQ127LGBV0o)T9I5x04sV9!Gdpdtvtg>1zdSlu9*#}++I+Fg|t$ro1T~MYQj2C z(xOfbqGiFFI(68vVIZtbOfg#VWKblTBrIYT|1*UwOxytySJg#$Bw`l8Dk@4#E3#o- zQOE*Vi%u^x%|&qUga!ZS(W5r2va7BqRApu2%j4IV1=O%LD024HsdJ*IPMsY&2&0(K z&ews~(rm#hJD9NgF;~x&V@`vBC6$F)JpG(uv_w|JMpMkf=CPwuY{t`F{Ld4zAiGEc zPADnN+VP%x2niN;IC{dmGf2o9X1B6TE-aFk28*#@{Nfi(frYHf2ol_JSaww&C4++i z7TWAViE3-h=+OgcL9pVidZ^t&9>Q`Ctf&VbS77nx*5gAM!5TMu>QqSCd4^#a#fAzC zBt@(|L)L^KA!~e)kQEjrWNorS7Td}pU4-T^w6IWGunJ@HL!2|M+>zF#uL5kdm+(taMNci+_5B ztO>m*c!sR;Q^tFStgtp=o*`>f#wI&tfyF`8A}fbf9a_c`R?&0M6-iiI6jG?H*PLE( z7~NzmiHiwsEZo#w;C`R3aoE5f?&!1-;79@KQcyX3An&;l|DoTO7CV2wjA-$m+#!!MD<8}Z4FyTHXBWXQ_N(=11Ztjt=? zGBs9P%Xz=jRs~k4swXLN=RFw4ov-O8VGWz6+bGKwEvh78RW8!5R|jNuUN2b;ne7uFq{?Q39=_X-~KcJh06_%r$gtaMCHwUbXj9uKiRaF+yqDJu#g$1;*Y;TdK zD>f5pop<*%eSZW51s_MgchCJ#j*>lsQ7SCb7ScjhAuA3mMOZ%xiz#BV@uZ}rXsu#_ zh_Er&XmhQF%CKrVxM}4VKMSll$|=gXYS-23#${gh8%B`24#PD@p?vciHn2R09s_|_ zz6X27V?5Z`J&GU!w5aZ?vU(67`b1gTus~IU77nZ4aR*b%3~h&)!o12a8mYtZ%rzUW zC^CNH|u;3+2Qe;8N1nQV9zv z(LMb!r4Sl&cHTV*5=&YBzq>TBaaiCwyLR{mYmC?=0i=9=~-T1!;N73RCtQXS~-U@JfravKFrdt^k&e%>JUd zDE^)81g*Xczu$jZR88_ItnsRnVD)WH@K?dA9?mtLfXDEz&u5yxkft2<4pjrp4v#{I|Bz_xvrj(xq~G2kKh7Qo(;MdC zNg~QvW3Pp!?eIE$u4>o0kfsq(UY^}?XFj~x`J;IB_9bSME^6SOdeUO-;W=}3T&(Oy zu!xW0*>5b1h`8}akHOg;S@~3zP4i;$*KmuEFDxWjr%!{bSY_ok;n##~Ps2DWyqhD%C1Kr2 zsNA&hmF!5%dM-`(gt*8~r>eMCRk|niC8lG~MTv*D*kBEo&#VDyCBseqS)bVxq_qKV z%F&&rjm3>V?VXM1>YJ5fV4v$H-arsocw=LZia3VVbNG5=dD{t2%*xd<}v+ za-_0S&?-}5F-Bc{J)hf=_MGAg&z)<9R?(_cRV&pK`pjJ*trEDoX|XOUET4H-O^x}m zi`Dv`Jx?MYVJl7Lg*~&WC3MZKE+SRH8SSiZ#nJ@3!WsV5Os>=d< zs<*kerUqOfm~sJq=7F9)!3C;E18HeH8xLHuMwW`7w)v1%p zDu355aDh4j@l0Qs<{n#FzK7SY1y&D(x>RA^e&7JGx*gPIv+9<1nWE?bCk3pM15KWR z0IbqdiIpua_C}b0PC|3ILOD51ks2KDw=ALgGI?A|3|I+Rz)Eyu0<2L;YZN3H6DNYQ zCYBazu$);$ABb0dwuMItTH)fUhko&e;03Z;xNzan1^7;9#44if&MBw=&k+YK5EimZ z16nzNGgx2&K0ID5G>(Ta~pR$*an>AfEb zfDje~THE4#^jJDEo~d5YwIC&fc*U*>B?rj(mk_pR&(H+2YD6`3Xu{A1=m*)y0P9A8 z1+)m(nj@MQ+>u4FwB!QQia3I$B^Tx{WCg(TeJ)gczzeFvG9OM(21n=+mU;Vz4d4iE zVeQP$ZaiWsU4)H@$|L0iSXYxNu>8ORd|!^=pAZ)MhJ6|O!Ex|?IsN*n$JxtB>;6TH z?nhL;dWA7!6(3*9IIL|w(5#pRNaEeFLKyM^Nkw51K|c{EUwNf^C`bz^C6KCya#%p? z$enk7T=wyuQ|=&GM^splS`aHe6U5YlSas51jW9=)lz<~tg@y0K!ClZZb{VV)E4d~) zdF{id&dS`-bHj!Mx0?#9((G?`hWuD#EUv`Wh!Lm=mlY`B#e(m{Y2jgSylqv*&~fm6 za3%Y}aal?DGFa#PArEYes01t)-(%^vc*bGH_xQC9i(PX~VWAf+a($q!K6YOQhxNr! z6d1BfNLV0XmEAbyPKZ`hP7^FeSkM?ISbD$$Si1-o$b0s3=b2vQmTFY*@F6++a=)E{DMq zFwyX1Iw5{`Sq>J?u!Me8KqHS6to!j-8Oln)8ihGv=_p(vsMoeqQWj4z*fp51d%+SO zaIeyr!4h7nt{yt{6=VjmxJTqqQ&u@;%8hGI>%yY;)sCJ!9LWW?uXc5+*oDc(E{Cvo z?SeG0L}ium1(=DcMHfw2Yik}hlauu{1XID=%?%rrqh72UU$SK7ee4lU{+5q7N@LHognMk6L4ic#|V`ztcnW271!z< z4%we`2y4WyeC=AZ1%n5pe!&9*GNp}m*TZ+!xO#BS^|!C@sUHn|6R)ue>@0P&^7(M` z0nHc5)&6=BdcPvH*w`Mr_c7YX8bXKbI1iDzd%@!V~AE2;AsxIAmkSa3vvwE z+PdYITkeOvok><K^*yxLU}$5VDkr{K#YUUsDHEMdVHg9m?+umD`(0;Tif;fL4Wn+?Uu1MgZE!?lzYXE0_3u5&UAydgjcTMfgdpK+Q$V5Qpe$G&D$5e2E}% zb_va!Q+|Q#?Iq;+xf>M6F~0zVZ zLlUz9KBCq5q`n@!Vi2c*3gginn!o-WYTATCoYIc>u#D4t1G0*o=GcD$h6&*tyuSjD_k-ih=y*T-c;`j3qbaPHB`l>poQ879sPButZe4#Y_SjDHX`KZbG5So7e}R)7D!rRQ9G8Cqt{=6f@lJQ$8jFC z!tNKa?r*EGYUKJhp>*TNjDRfT=w{7s-2oxXy;K78{}z& z79%-5&-K?|@BERVtFu|B4Wmg;8BY`@435cTO?U>akYf-{>Q3%Xu&8D1`uy&)Tz*3w@U+J2n-k z`b`B|`)21e8&zp(N9JnYl&)XDzSL_gouM&#${YQ9?TcX5GQXy!sC_q#aXKv{JUSvG zJUm+2ij>_AcE=t0&OKw7jflxBEW~|e2D3(=fenn02U_!((tqnp-9@s4-9VzNr?6Kq zo7?c=pB!SWX^E7Vqhn1glJ%LbyR~lJx|_4mZgJV-#f!_7#vn*)_U!!Gfb1C#OP~T+ z4qCor>+$dlDr>o9JJK2&(9>XzmN72BW?Vj4%W>msG?B?GtzT<)=um0tp}QY>B>!dg zou064*|HIQK3JiuEcY|8dGRK}658^C>*MKQq}7X&>r1AhP8L7>QX(9q^y-nspC*FE{FGdg zn37|JhK7f?$#Kx~nMXicrEt@SSCc_nqv0lw0xR4vFf%g~Sj{F_?B<(qUK8K3qZ5|T z{QkS|fTGF@V-@(nyg*Gc;EJ*KM`XA>3Ob6Kci({v)Qgc25nQ^M>Y9Kx(8s3j>c7iD%P>GsUw3ag4&KT6 z=mo*-#gD6-g-2J1gDS!;SX@{FmXub^G8#s}m<1Vz0?XqWa9z8B+W^(PLK_y)^5qIw zh(jboSRt%e6ym~Yf~cZs$l}nU-z{7AJN$=jX)$CK+I%q3($v;|vIPrGz~aJsaM&=W zvueZIOjP?n&mTF`t<+U$H$OQUT%diF(H5ME64vag_#!`B1F%XRtU`RHD^>ujQc#yZ zibT0Zj1sP<_3!^6(NbZJ!;pn3vsBi&0=b;70sbo-d{=ZhUFmR~rgk+&EP!?O-3MQO z^`Kmli((abf*>(#GPK7tAgp-<^+gC#TFHQmx3&OPvJe(#6;XhT3?5Lffv~_nAzHHY zC`Yo2Zl0rrruG8XbvmqJNlC;?z_M7iVXCxz-Oir}R^32ds<6uD&j(gz$+BXc@%>VP z6~cNZlVD-FSx11iW{oba?~oM$Tj6tM?c@oqSDu(iv`AW(A4Fv#BJhLx@Tg#%RF=`M z9eS|ph-y?tG{4da3sDiQR|PD#4AON-FA@YR3CqaNc0U6Vcp7x|w7m!+Nh{fx%!l>i zffN=lfrqquJ^na-DHO`uENLC$JxLFpHbV!)EqXBAn&&(uI{@2Tu!IR%fT|9c_z}w< zg@?A`tN>LTWpwojvI1b|^?-$}0N8wAh$5`Vh}Av|7EKR-`svR$sjbRuaKWmL3agvht+W&zp+i_^+33;W z2(76Y2urAH-#%a^VL|Tx^coG8&wSy#7hYIVYPy_YUS3WNWP*7)GGZn6PfUEUe}4xo z>|OvtL8$r~G==MnN?{#4HFD%gbY9i)&&Vl-7At^tP{3M7kSJ*{M1|R~mcq|Do&kP- z!ZyqYpWZfsDXq+8&Wh7YmR-tRS(R@_Y|*IW`boz#m}zOW2%%k;iEfY_p@2o-Dlw~a^_y?5 z-XWDm(n4(w9{h>bNPZI3)EsUoE87V=U`^gEf1cJSt?ML*g>!N!Z>J9n7Q`w@151zS zg?13DAPpR?vdZMJ;BMbOXai+(SRGCCX@K<^;9__$6aShtnU#sn5<5)W|fORTDTNciOwe)Tdi}B2&5EH>X@PRg~dD&q2lj<`dtJJg! z6DGjDq{U%%m$16qu!vS+uN|{z@90%1SW&$fBpJgkRst8g!zWMMU2`0kViv14b(jx! zs#_!7AmGZGh_^N}9mG@+P?b6h?dB%~s?lok*VIfNui*3D%*_0J@fxv(MX)~mOwa;h zm43IvfhrJ)k*v@iieK&z@rrxFv9e27RaQaE?%mZc!ebHbBHA5mH}cf6>JS&LrB^Rq zYQahnDSHC6u+$}+=S5^kWY5dKdg(m%830x)PNzzRds|vQ3{!Ga4+b#nKZ2yaS5&VZ zJK#=Pc?56`AMEV!deU-$3M@rd7Ay0^4>4rbefS}tW7-Dy|Cq?#pp+H}tJ{(Du0p#q z2v+m;;;*UskMaCs^t)g}SRt%!NA!Z9ZA4m3w1-Q-cV`whE9`a(v0$OFrdhBoaT(aU z8i)D2)gDG&MS!x7jXc$^IwVA2hGgkdNsD{I1kOsy*@dnmKw0yyUYe~w1HqawflEuB z@fvJWkN096%yUTG(Z*6>Au5H{kPp|aSp)Zi);6RC8OFA4+XO6V4|n_Uh`Z3PZ&_c* zBu{D*qpHXkLQNb!TB4e5iT~z}h-u?S z{K9y`vSNjcRbb^kF)=kYPFNKPYZq-0I#z>a6hIc(5_okt@|B&Nj)4Iy@19X&WtB5v z4!F#{EDrWk04vAuniJB1RO*BS2ht||lVKqwGJSN#$=zL3$M0_3i6X{8a=Q;ONl+3QT=ZAT5emLRenKNP(3#E?K$%_v`Hu zW3k~tK-aa0rW z+Fn_qUC_nIe#%A4uBhy!X#=p{{>$mSQn3##s{#v=50J){HfDV$BQ=YvM%eZIY<|Mc?C1d^<4q%rl;;a;v^G zXC}6C{q)QS9>~a0=S$-XiY5#8Rs=e;6cdh635gagVL@QAX9OzAs;1_yyY4bg7cMrW zj)YY=M7mnU_4A`@Op&f*VYF_FqYxz-g%k$Q=vb>M+2jx2KI25l3;z2QvqRb;3_w)Z>I8^)6%l3_B-2}p({~2 zaIsdAksQ`cjTW%VNJ&9jDb_PY;plc$(6_CCg?oH!u(+y}RbVe3<~JJIP=uAaawX;% z3}RKm>z1&5gD%$5;^%c2-L$+aXq2#@mqTy@ft(b+YGsEG?+5fJz{Y8T{y**XHx8>} znYs|@M;{HOOC8n2!6o{E=xB3DG;_jQu%K_>OglVJoG4($r*c{vDis&&->Mad1+0{G zjAhKsh>ay!{uI%pnGzM1f}b6O>=-kbVLG(gl5v;^a3s(NS@8(l7 z=({1Q28S~T)g;|ecV+%55EHXJ1$hPf#n9Id_3y7#L9j;(O!JXP5SNnJ`5T|*UJ-A^ zTOBzcebl2P!HSR4X#uO;TsR)B(qeCfz41m^-@XfMRv8jjd}?Yo?JUnyDk|bsSaQZ8 zG_aA@%$YL*RhV7TFJNVWzC?{Vuu8$0mD16o#b|I8e8>E zPw$%!s5Wh~TwY3SMh3BZAVusSk%F|qz!M6o5vsm@bD0h+;_%@J7c50tj@`W2iMPNA zmW)}?j7C`C2A`p~ln*)GK*X97!b6niCep%vw^D{0Lk%M)rv4s{RRO|+_FX|iMTMXh z=(nw(w-c3bD%Y3s{vY9YI$ZwNfgXELp&P z6>@X!cGmIZhYyR7<9@9ZqkVf8WH&Fi60C&h7b0dMtatnOe}*@TeS?Iu?y7M$^}swk zUHp7k_kf_4m($M((Vg_P`&k5z4#Xgj7e}SQ z0#^6~KuU#0s30Ho`!g~)tm&kxjwvaX99B|d5uwVR#uR0NOA~hrEOr}?NZn>_5T)(r z#WFKVRd&qEf99D2_>6nKzi@+t=vH%sS>t3id2*`V&{J5!t1+zVFe-~MAZ`IRjaA|! z1r?8gt{$;q?VL2pGh$UNTZAw2B(OTUOwuA&!#fVAOO5`4!(w%HKx;@98!||T#bP)t zZWgRGOt{$sAZ5Xdec*vu!c}0w;=-b!!vIvura#K5xEvMfD&qml-Wl$haQZaun?TDA zJo@OP^@+K;3M{xl$5C2n@IcYkcR4XbV^-eNAz&B1nTd~76jT&ELab=HuATl#J3U!t zE;@<-7O*;e_~fEY+Y2HqcvKIh1T3K|q?J2p8eEc&- z1#@2s6LE<>hk(_e{v=^pv`%KqnAQJv(3J%X8d{vzAe|PQ{45yK(#CXF ztWa4Eg=n3Ju_h-kCnms;__RZ+txm0EDDKRSaR-tW1E#=a7MkJ{QO?@Z~dFz~GeyZ3V2D2T)rv6@-ez zii9>+-}ISGvI?_ulm~cb0kGhMp4SPhLp{LitFZ!DC@HeT3amE)7226M1*|`jS+K~# zpdXYm%K?iD5oxlQN{h2XTDG(R%C{?4d~1&qa4!hWEyD;5&5J3P$sjgZW8hkt5U=2Z zJQAE0w$CbNuUd2%oycLjU$ly(g{k02J)(F<3--5qPN0s}5v|;+L3N6*2o|vd6Qw|W z(Y|;lS#jC~D+Z-iQBYyQf|!$-j=3Nvg5U(LY{p`RxHeg^_U|7%R=@(~*XIJP`g#o( zKJNE728+ycgBB~Ro#lj8BVmO=+^Vx-9Xoc6)3RW#I5l#`ijk*Q7+Uro6X>@* z1#3+Dt*o(NVJeUAui_DF=2Kwjq@B(+bnt*N`{1fY@wwdM<5%&mw^)xJJvw%bf=ew} z@%K6?tE#FFbp>9qN@Zp8@Y&XyoQbfqX{AL>1i=Y%+A$cj6j;v)Sc&N~&AyS5lnTm- zh20kxEA9k2tg#4dtbj!W8`GwBxK^R%e=$KKPIys)wUonJO0bqWlqCj8csq+=#W`R} zX<>R{Yl}U5?6c24JEp@Lx#H9c_^=0Cd4>U*1x^+iY7aWGm}uJHrQ(qaJN*yrY`arm zL&s0w8?!TKuUdu4U_7Floq5m@wKM~xFc-u`5S$>t)aV4It_Dq0yH-oX2$s@Yimc*s ztwl-&UlFuZtf0kFi39_DAayh)hHX-XmBCp7s7;$>#$7pmEQd8#!h+m=TD<}be&fZc zD9$P>>P5S6aA{i(tL;+8ck>d;TE_dEO2`lvZz~3c#S3vHE%q#yu^=oZ!!V4Ir%sJj z$Mgb24cg)u=L!^Cuvj$K7-BP79p#3^T}dzk&_13-KX1&g%_LrE2QxDdN>~G<;?0gd zdQd9(H*u+v)sU)OB$YczXGN=DtNAFgqK>Apxl&ks&pn=+K<5-g<_%WqUw8Gb__7hL)N`ztYbv3hY?bX0g$cyxG9Of*wR zaRS@gPV&n&baqNsAqE1f%{(|e^W^N4Cubi#SRr6V@s6f}VQ)!caadK51m*%Q4HmF^ z!`ZK!%2)45O%1bI30x^wHYfsISYOeFn`kc{!DeQF7t}~`SkNloKNj1>99C{o(KLY7 z0dO%JRs@F?p~4Dbcb~Z%K19v4zMGc~%kF~#NdYXSzuAW!xpK(R$Kw{kaJEnDia z;KCPUyBnIr0Yz6)psZ+urHtZ0>fRP`A*r1^C&gGk(KuKEvOkzPd-h4JiLDT+dq;k$ zqoTqrRtT#KSxp0J)!DFE7-a13j`=X5tki6M^$w1UvO!xfZNnlH&BRD`MFI#|84vhf zV_^`pQm_XjMJ5>7!Xj85I&fNCSqRDhmZmKH(`U}ub5r%*ysXsSQ4FF_EmwzkEm{8J1u$xR_uZ2w;RCzHWq{|as6B|ZW*>xBnSd46 zBZ|WssJzz)QQH%eh`7J5HSEc`EWe;8zp+FAc{#hZJ{3VP?SL4ILiJIh$%qE(~S9x)ng z%E|HCRtk~|GHu`sXjN1koP7{opkzgtx<^!0R1fU}GO@2;o#q7F1|6gizIsQH`O@sN z1J6WDw6nN7d-U3*Bw+REwM~J=idy^(qqoM2Zy|Gs-2K}XhO3~Z$#oT;Yv>pTK&s%V zjK(iDr{&mXgI)1B^N$?7=G)&&=k@5di0RsE@e8v;)?2&|?JY;pVlD3b=fi>q@weY1 zEV%#nCol5y+y^j(u^+Ul*3VpPz#f&fIy4H4e&@{Hjk!VZMO}i|A2fY+TvOlwKPfRf z2GU&{B?8hR9U=&08#THlm6q-h0Vyew5ZDHeloS{#pmZuB(kU$<@Z0E z?!9OCoY%9C{b z_2T;R+=nS-R0P$GIVE_Lb6+qeXyy+yueP4$a_UP)ZrS6}N`>It3x?Uiz7ps6R#6)w z_VDF{!hnV9fZJ0+qudSp_Ya$*bVyQ%hJHHwRKPbA^@ZE3YW@y{eO8-0?Bx&MiM1D3 ze<5!T>%c>_xYVL4wd1LcjNX81W&V!42d1Pa$#pQYpHlr!%QfjKx@nnz4||3hK;O+b zN3}}z!~G<`ow63>$V-EGc-)IO9?&qJg^G={ea-gYU+TWQEEGlBUwt+zDi-KUFoHh4 zUBFL%+x(V)ic9n+Crl7mY1LK~5x@tmQ_N@c5ZhvKFbLqn&dy6T2&`XO;RK^xd^rmrsuFr|7!}T)YZZrIL)ARA|p{J>o{^_uE=QMbMfIIX{ za8><}3ayp#gh>DNUB0!L>v}1tNjt00=uOO05VBA+`Q}GwD37g@?Kl0GGnDs&>Rn?G zI1X!;zXsjQi8d=H(PaV$P`>H*DSXfl#joD9YG7`>AVRAcC6vqf);ldoTetaFZ(arW zlDqzjUKF!LJ2)k_me3Wqen>+2>3(*t-P=27gJ?jqi;3%61L&Bma1#Z6{eKD+q?LkG zEgfc6J0)Y|A z+YK^;8)QQHZ>&cm6Esb0Yehu;eX5xrJK(q&`L5n~_%*}0>qg+*kH^a_Lbmvz`LAEI z!7Ud{BP02P^h*sIU3LNf{P4r}XtYBgN!^v~%jlzGlpwnFptYMbv!t$U*<(X?>4yVg zcU$+ZLn^l|V=nOsKU&+fP4s(xoZy^|qTkNc32$N+33v&6*YQs(LWEyHt784DL~mz} z?83p)ov=Z4-@Q>qxxZz;)f-eTAwU1W7GP8mZq@n{-*iUPLpjYwQ*}hoFe`-K*wg3G zkfFgdk7$(+lLl$4C~~`CC~m#lkszL-=R(pNt%!l0a|0H+gaVhmH_juej4HkSe<4|8 zk`r*>vLmBmMCNzbcZ`h3BI=osab@14)9B|-Ry|T}wc7#}5#v>xv{}H$y|{=W5g8c) zCoEB6w(MgS=f-Q5kPCnPWKpFcUyK;I%q*+OI*Y1uDa7kTL~O%?vt#2ZfhlKbulO0# ztjjfvGP#Tx9RX>pnW7oc?SEC4QGX@t-oy6l9`*a4ro%;4&vD){@1yy*$%TH=yxJUZ zY4tJKV^S)>O-*s1^3_&l3bdCT@hwAIaVACNOW1pvpuD3gf(A{r7ThYcbF=@?_(POQ zCG7b~jLO}-TC$X78$`(s{aCB5&F?Y1gMGqoH15j@ng%G&p$$1fZA@y09xCAja3k`Z za9fBFo8fEQZ@NZFkML~T zCT>{DJpX96M-l1wf)^lJh(x8tzu^jOclV?C?PvCI#MZZhMBYgPV2usTg#ihIVngs> zt(=T@db_Qi@R~t7%}2xx5yFx>?&<~xEqck!H64M*<&ICA;qe&0>P1M!uZ*#PB{C(s zT=hi+0K)i@@i}*ziESgNP7aF>8I-x!GuVF`shdmn#EuQPo1_IJCVXmZuA<*3Z3(sO zDUfpRjg#|u{(iE5;k)mlH#-)E>VsbJ+{M@mc|S5EG+uc1W&w~)TAOEEfP zx^<}l;>8Nw*(n?wl{>t5!%uaJ_!nU|4l3_o`Kle7AKU+29f}C-aMR-`la< zcZyQ^=3$jyA`Bfx!)TDz|9Rt8jA?luY>iSYzwf}jMb`FiK~@@LqSicBp@UQ@+R z?7?>{ZFZfp1wXW zk2hi=&QS(GTN=o}$i+Bfko&Z(Yt^X_{EH002X>#d@YEa0lXf31%48q|oy!1bJZg_y zr@v!$vGqnu;d<4l$oxKiL}&wqQ<5W{Qv*`iBbFae#d*j5%( zPi`yw)BCZRSum3T>?m1pSkpmM;%gFT7N*ilk<67FZ24+Kc!XHkP63m)1e=UwwXQeuCs@bWA$h;8>em6 zoczpx{8F1e>oMZAh-u|d8-Ri=gP(;BCMFW^RcTuq$|W?Q0%^yrae!>Z*{+6gMao!T%6MlS4->W#!sgdoZ8NIdz$P1zTrUy zo+KJ68_SLyMKm(m3Qw$J`rpdg3eR(OmGnIkfMVqR8N!}6)#oCJF`3GO#xTOLu_Tx< z8zjj)x_0J@^F=Q~cCQ=c=iWlPTeYS=Hlsnv*b6uuCH3$TxSlnhn9@NLTHELbf@|U-ET`QSSiybN)E8$0`0VuzNH1&1M5ms1sr?Wq8gn? zv9WZ(jVOW{Z>JuDr?j*h`sNUavWFsqp>e-OxD^2`u-og?)y;#`wf+qOUw{H;nlsvj4xmJsU(7dn>I{nt7| zlaEiM86i9b-*}qM%=K#@U7>mKUDt3LaReCsf%6y*R4NJ231pLL?G?zqu-oiSA|gbL zzn;+_8}NPiJd>n+8qDvcPT`*Np_Vn)F|UmnYz9rxV_!mSzoP$fdWyN&lNS&O_O7qP zzJ&0J84wE^)&<||abP+KE^m&D{k1~s2N3b&^3Y@Qg#tXFX_O*rfUVws0ltJc(9W4e zS|&k&prv25BIk$c0gVRsc}X1v(j7rPz%z*cBaSYuu2 zoh$2kFTK-0diXc`?j(^$+x^A-P^%^pQ4=7a{_2y+_1&1ftu??Ansv`*e$wE+pu@Aq z1pY-t;^KDdJXaIHgA5cJXz}o_xf(O(@{;JRj`tAEKeIcV_6xpCG`7&es^FXT-Tr{c zDmpIE7~eeSrW2@M(w$!+CZE+4>-_6eNIWj~1G<|O=2 zkL#cE^yNVZrnZ(eIFjujx)$8G2VTf2I@LaR?}kfrrtrY}OdeEXc9vBh(D_^{?%vbf zIS`ASLcprp;6453KA3x)m;S;Fal$H>nD+XlkK1`SYSZ*8TbfND3^`0p^!U+1*g7*P zSuK{10h)fp`}Iouss`;jb`sjha&7dQ3l()^nX_$EKKJqU^mm@k*kl?yWYEc!GKC6K zLEC^Ixf|2eAY~Yk{&k_xscSViI1 z497;C?H6GwF00OVnzt9KlZ92>J0PREych4B)*kieaXmKr*vWk@`DAQ2SJLS?@~fwq zR@mM6P4r6Ldkw#6f9ig!kfBkkHZM%LAQkFa`1^Xq#Cnt1v!{Xcga@2k3uaxxxRqcs zko93g4}php1KzaNwTlzwiZ25fyHZ|WR{1P=DX?_6zvTGja#ks5&u?Qak5tz8v2Q-`%mV;K~E z`0&$xFUS%=bUEa(W45)d{!&9Bgm#M5b|!N0okRMu(&_#;hvf(PX0tU!0Cxj4&)abz z8fUN+Z+b6!EY3DFa{4k0sKDYyP+gjD6PzeqIoL2vUHMlU-%=jw^v#7&ZLuq%mYPX? z!(+Yr{F?ZYRhNLw%EVJcj>k?fepOy=zO{1I)5P#RLX$E=61*5zc2tIZqxzRUmGEU< z!`r4Y^1=t5;mB1kaU%yCS4o`+rxtH@ zwRa+%5NYAXs2%^B7v3y0@g;O;LFe;{t|_b%oM-W=#KgM_%>eJx!;(`r>XprX;sa|g zKJOvfmB|$tzluQI=c@YpR?q8bIzo(!yo+V!)T$(6q{GAR2DC;61%()Aw)6(g@rIob zPJ}U@)3(#BA}GU=jO-Z4S~wAUHQlUyzeNWI8KHB+J+%Hai-IibC`Jxq69Qn*O;rD) z^b?D`cxVR^#-!GT7U3ZP4I&e%0g7h4WsQw($cwC0$2ZHDvD-!|q|eyVFd{?x$dwOB zGsP^siv94RIF~Vb^#xJtPDBK8<=BQwzwv7-0(}PWpjh-#JC#Q}ugm4R5;MchGAXc4 z#gpEdxU!cVU$?RT^7V!OJht^?UB;otob%M9*4I0{I26t6^7WmTIoQ%=6a9+IHhtL^ z&+S+BtCxugTrX{Ky~IaPq5u9xmsZgzdU+tE01Dj>5!>y~NMg0L z&k7=(Gc{Iie(t+s26e02AckVs41*MWfRksM5>e8lL0hzYU_N0)*r4C||T7g%} z-FYhEUsTtH(d)zS%xh>JhTeEF$ka{M00IVipchU~CQDB^M^M;5)A2Z#Dgm~aW$x8N z?ApBv8u=|-$wR8rFce>H@mb9C^?&H}=b_T@%VC>?R=}(ljvm5rebUi{Moly0Dyo}x zah>F+)z67$5SYrRUk((ZFW_8&3I9PcoyCVA_L#-NKQK>l>W#!)P0L4MVn&q_TVn0l z$I;H&yX+5#MWNQu!n`$XcAbtXU|aX_%{Mv%e`stMw_!1K;G#_?hWfc8u@Fx+pN^}c zB6GzsLWR6yrS`C4VD&LR%un)jjg@{?u_AfpdAYrqj{eCjZW_-g#E_#j3p`Y*I6M0Z z-E!}no?tMy7yk!03WzB~+5QKCw`eR{cErx~GotTJ#>rz#P91TfmXu!@HYH{)<#@(d z`YDv!IZ}=%WEy=e?~Z?4o-8Ri#9|Crhz~n*+SD?#+pvG~+;wnF)50Ww2|$)i|C(~9 zv2f4D1jGsd?D;LfB)P}4V_NuAaFsp>4#d%B{V59%7&@$O#{vkiZDyVSs8rdN+9WTC|-6x600;RB9V^25py8Br`45M4#w~`Ve z#^+*7M1#oWmcZQ^i5hU&sk#Kjd|}tKTfRP0=-moc&UIgSuqLKm9jK_ix&H%y=6qkg z6Wt{ba586xV>ECHB!5RmFfv~Etb6#;5>;q__{iF#I@juxs58O=Hi;fQ=oXdL_Vs$e zO=chB-i=RZ1I54xON@H=9VqUB#Tkdx-0`^)5DaQ}VJ8!e08GgAfgbwVmf z(HSOIvSfoz%(<|i`e#CPDXhy)%AXsWziO=9oI#hu>L|lp)|Ti4adL6V?bCbq`5QT+ z8X$n?lxp~v{Wz@U=i*fBo|p=JP~K;kjJA%;?=a<@e{MKmrZ1?*z@^s24*2dPSOPGU zWvaZgprfj1!%Bu=*Ysm=+;oFCS61~I*RHU)fWeBHJ>;`fqM7AYtS(k7y4SIQ94pJ7 z7ZKpWwCnqVU?PS$?~hg^H^o$%aDSX{Y_b*Z5 zE8B3ChE|i?wi&wq=V1UgX_@A5K!9E8&(iw9SbW`s2M&YS13-jk<$+@ni2m63X^h|N z41~}Sc6o)YzmD%b`c)iikXL#aH*jIv9TBBRA`oU)$WX2q4At1kay_Y@|tm!Z7 z+IjT$??0^>{1f>DY4ja0!2c1-aTpBWbHd-1m0f;5xr$bWM~mH+Eny09*AjH|Lwz2S zq|J#PLSe_$`3E?zPv?2_U?pu|k63dqHu~-eA(T9jW&|jV|KhfgA508%zwer-;coiO z)@MZoTqB~;O-hjbyVV@^$s59)G-WlvHHWhS7j=GUCwN1dp`MidM)YAycKZE73JaF7f`tm4FEVw&(EgXk#6M(oXGPG$D{W_};%hTz>n23M zo%AF51-1`+t99Po#qv!RxBIbIpst(qI+KoDoyjEs@Z8C_FP=L|^jCPyc?~W{^*yo; z4RBUy_JJ>_H$aCW=@ZnczSjK;gG+v0QOj=RPRa0 zN;b{u%P0{*R91tF^kc{);i%977_MPCM5Aw)x@l%*$8H?sQ8x*#7?gXjGk^MYJ7VQi zcoqi85xwR#T4aCbC5-uNpg}cU(wDTsgDm4~o~%)moAU_}n{Dl*$$K$f9=kL4LZ72p z%R9&N4d53_=GC;agY*iDtRqApDwWVZ>)2^UhRLO{BHe9N5QToi2j%t4BOOtYf-EZB zG#?RbD1YRmX2bjWh4UK`=N!Ry%Vuv=W|_P%RU{t+QnetH_`nLYHyLnJ%=y%;cqYar zNjyHb$DHTM$BI$I_X@JE`wL|hS-@J~Uv{GK22WAMd;`?;z?5ou?>Hhq`&01N)98=* z6wH6jye8Kg;J9?PXhi6ZbeA3XTPk*Voa?=)mhC6Q)`ay4A9p#u$UZ)#!jfN0H{eyl zNz_Mh6Z?<0AN!c;U*mm9C6T&-FN;0+8(HmRi?)t^lQwq?FRXZGJ`lr5cDqhH{SOp7 zd}Ca(OvPFQ$@nuCArTD3qEyL-A1~*a>+!NI^8}TYT=y+aW`4HZ*PNlsecl;i_T`x9 z84L$|4=p6q&4v|;WSw;p8U#dii7Y$QpzjkpZDDd_G|^P-NwgTd2%zFxrFENdTn}9X z9El+UC7A2zTi9-3iQP3eqDnwqjRE36VfTNP&iXfJL!R@8oWhsD0;aC?0?n?M7PbNQ zsGcPZa~rh*>8~3gb}6Tg#FU_#ws1aS8<)Lc{!o^toZpta+SEJZ2zD-_Q(RTXQ=C;) zlrAaDt802#_j};tg{7`;gF|~CxvQ;I=pYTs&J`*)&SRxS^U)~pWIehj?vjF|E@ITY z!vg{Yce~L!$NnJh>os^N*iR#j@69mgCJcqm7ng(RvZ(-*-GDL_Wl{~zw90K{b1p-+ z;ZRf`DMKD0+lLv!4T=R`H=={%!qbKSS6ASq4QI34EB7i+&N5YvLzWg!X4G}0mTERV zX=GFLekwP1d?BYJ1tq@JoD|y>c-@5Xu^iK@tX+6X0KvtkwNV%&8REICGsLX)S`{Pw zo<xJ;?YtU#o7TFll=&qx(23s^E$Am$Y(yD#JVmdfv~rNr{r{O9GPZmG%td>d_?f zXfqBh0hANkC`XPC#}jGjxTC?ibVG<|lnAm%q6-@EAfRy68cyfjNX~U*Zf@nrNRNqu zVRXz@Q@FwTjC{;q9e#V&_K!}Qtg!@;D-j)L3|A*!5H~u7?+M_?ix_~#OKD%a>A zxIDq^Sqpy)Br%@~q%tK4i^Y&-Oq&lPosAs#D{z^t1mMdW7w3<~b);r(iT?)fky(n_ zR*S&bfk3}?la>Kuj~q@}w7VZvH?Dt(Z1@oc2F_2d3O}!Vm(s%n;Rd2<1Z;K12SpNR zY}9N_%=?&Y#)t_-6QB$Yy#zep&C+NfCc(5%hg2c;E^#zlI~sJW>IO{>xrp^j6AdVT z%S#3wVGQN~6b=nT+Zv`Gx>`jQMeLx8^d9m-{e=kN!ovH50z=;b=|K1}gavITB+7)M zxeGYYe1FIQos>gwFJU-52+%!UNr>)egpa5|4>HIgGT`jfFp@C+xGk-f-jYLIMn5?tg@+BD?JMCz#eqHWa>X$vp$HT#FnQtm*AWtkg_%hsveHIlkO8Xki__U(-g zSBsrysn(Av)$`ezs^aIjGHAK}iIs>o+ZvmD)mSjd>qEL!-4&Ihja=?*+o3Xou>BvY zkCm1Z0bLCFXDi^skW!#(`nz3`WJBmrJ@Mltc_jrV-yW>#XQF>*Me~7m2!7eOQtrwvz;!UbNa;#?XcT66hv*qdW~a>#1V%|EK587TL0OWBU}v*7%T~hbs(m$ z#>8@y(@;iGKUCshJ1j?mAqPWh3D80ELPR;`Fb{F%S|Cep$-UY-aylIlp@eOFNkpGi zz<9{7IO#I|7_z|z5lsijJpN}D$hOg=Fu?m!Z-bv_I&5KV)d61*gnUPN)DGhlWA79W zs5?Ryadn|?a*sNM?EICUfv7=*W-}WaBln7N0|-g;gHT14HCL|1$)3{fNHWDdq zgikGsA?Ec@B2Eb4xfJTVfiHh!xDYtq1-Dxk&z0)Zc-evSz;!OgET8+EUbWq_wx7Kq zbDJMHr6v<&OUMRGbRW;m59~2HjHhP>O=mD^t?=E8jUz&gMu(Dl1)-_Lw4+F7?I0EY z#mb>4pbZ~pXnrkFt4(8O_DK;2MMjj1e(Tv#$0K4&5JivI>7u*z>JX6)fAtJ--fgp_ z0>*9==;bSGv?4u;F8TXDNqh@2J$D=DP!=!D0feLO_WSPG?ExwL`As&L_0t&eKW^~4 zQ`%=K`pm52J<8mI=LreYTrj?aQvmK;_`bTTaVC2jiuRgiNvcj{BNO-}JVr9v%>7J!ie4Ne!cl0poETa*lBAcPvGsZLD{&cmQ|<&s2gduG>uN$@a|Yqg`*{X>l5 zK4mZ|yJ^L%It%_lY)L1@*Vz4NQ=C2^jX#_r@Ew)M{WQxiRP1cB8o>3EAKVCWs20*H zU3b|8^|@GkRok5k_vKW3uEvkw=rUEV&?P`8^yWo8S+&+3YvcvGrX7*NQ#sE({^ord zi|N+&A+%%x|-9&9Qo#XXif%aBEgZvAf_GG1C;W zh;!n?2fAJ{kkd8+hX@&o&L))rY?Guk-8r+sTw@}l|d|*oWiQ5yP}+BR9dn?BTu6yTMO>?z2A817EOZkZJ!OBo*#U07+V~{v+TS*`?OzxsU1@LDpJ0% znbV+5IrW-7lf13~`aF_%p0dYA}aeLg?YY1ljavRSL zedjdOpTGG{KV_`}`sB$Ahdx`;S)3CwoC8hsI?JqSJcg%jB`X?;A_gFdQC$@{gR9EJ z%V5lv5upsScGiZoxYS*^|QK)pkH@dE>Fj0MWgNHKzT=V)fT5K-Q#$u1yRva`iQu%|6dCrtdgpi z)4y}?OpN-RurTxwxe_{1=j(+T07~kxclJ0wDrrTnaD}e;kN`jI;k+iuOFD01&tUlb zhWl8V)q&7~Rc#sT=b~i^QT)%#`7$8*#LvK&~ za504FXWPhfnrZ=q%U=;Q=*t|TXXpQ0$T2|7t=<=m*y_T&c96TjTvXZ4O8kaJn=o_v zUT`Q5GtiD?e46w|5TX>I1O2;XlCK|?g|n&z5>nXWBTK0bFwAFaK5Y8v zET^+Q=(l+I{rhCS8d3N$-o)PDlMu1~yZ)3D1kevpptK)o!x+FyG??4)oh9N{CO8QzsdxQ=bSz>zz4PP2fw7NuM3`=AL*BF#YO*M#FRpO~c+#j93g{1azPGA)^ zc%4>_#dX{y$jlgDTKNyj#kt;YN8bRZ$)5sOF3Qc?e`>r?7F65o=)6WLdN0 zX@UoDytlRZEtSC7o|B>`g2>rB#YrYR2Xm!p7^yQDFWc@t0Vx$CJ`5zc)P7LYu0(V! zO+-aH>HsE0GPb$$Q!S6xl<&9K3%{^2GxOLY(w9SZ42n>IWpIS5(^hK$iFH$4l8aTi zf_(Rn_d!~W)bwZzFEg|byt2BXfoeb6?WMITk_PQ zv(NY;&R@S5D(L?NJ=V-hmKUG+7_G!eO#qB=rGc+vwpL$LNl@*cWpn!j>fG)hU)>M% zFQS@QJ!if2l9;IqQO;6&@EZx4?ypb&)VZW@zzB9m>S2)rkdZ9%fJ4u=(S&b%ge!Vmzn%DP_X(vCNj`N+BwSR1>CQ^yhHzjC7Cr9gVY3WS@RrSrBXcP-4uj;UP3yTv&*0A zp19gFi9%^b8S7JdMgAJyJWT$?ERSg=g?3&V62ZINPBs{=A^yTTy9_^H!jsI>pB<&m z*j5=IsR{=Nx4w*i%a1lnq_xA6Q2Roi;~Ko-T}eCT_m!o1RoAW_La+Yo2>`_DLJN}q zJ^}gIjClpqO!(#TO)lPIj0bXbq@mwEq$Bo#*{VK_`((PJv0du0ON^elXrum5 z^dJcY=qDzU(SUd*eQsR3icd$ehzI0ney{vjm~3Z~shn?&o}{XT{fvy= z)+=GUTvz}FmXa8il}#NK~H@TJG#hm zS%%-;XoI`ICnt#{i^zfV?0svKlIA7n5!0F!Ns%)ZuYPfy_QjsbyOLY}dMD+~W$CeG zsqs~TeIYjz#`#E17`%_Po)$ptpE;K!%&xCg`#A*dYea?c1Dw(4{sUZ&uQ`<9uf|FG zAnvGan?QA7{26OMtWb_{PO*sDcAUzt5J&{ZB^e!@VF)+}9is3%GjbTm=?HD&8TIsw zS8;g0b@&ZCpWnua!eM(rT;VT5(cX;luW^cLlXP?@=C6@5V(5-E8&%(L(l@+<&s|wZKRJ#;E+4 zjZcg-CMA(dI_#!H>N{vR)zmwWU{KYcn{Ul>dh{F=%502}Uiw&Li5r&H@bwSGm3u)E z?p+a{-w&-t_KTMSW5M4`tEu=<p^i`KW2h1H4SmAVUKIGAl)2k2`(D;#6*G>)lBf(EQ z&evIXEL&%hV&dzgLrwhEImDt4jz26dGJqgF8@Q)<(@n3mxQWgXl;Yzmj&${WZ zr-Vgm9kS4Mb#+p4pe#}?>w!0kM-~j{ojXjeA^mpRSc=2Q7Y8V`X*qCzx1yvIKaX{- zfk3SWy~5bFWB+75^<~q)6w{%+x9^TL`srUhkg9IrcAYN?bJjbkv<= z6E;tXB8r;s@b6+n)DH2eI@Mj}%;+_IE>7I6hS#!o8?^>;<<39^we6 zyXmJBrGWm|U?%;`ZUPP7LQxgo^_R~a*9%7ERG-f=471kVL#6T8KUr~{lBsRuWI$V= z8<2m@Da&bfde?QKW@mh<(!WEVecB_Qbk*(K`YR?rc9j5bKky`vVXPkT9VrS8`Avos z)iY^7fK6^Va0$5U^-B!X*WIh2&gRzd7z)qxi{3lPDQ~gO%KVvskmsQ-IH+n3Z+9DL z^W$e^xJ&X>3&YTvo$&a-{<_0L1)Af4%A+1pqXVfx)>w6MofplJeu*SlD(2o~b@#J6 zhZ)K`PVVZqn;2q3yB|`ssUTie^x&q|m+OPJ#XhQk;@*o@&%#2eYV4mwE1wAk&0Qo9 zivtDt^en-&F8l%lzNX?f(H46IeT0?yBZ}SRn~L+v0w^ZjUkC#V19FYW z>PE`ZJ@FmV`c8{nhYGzaPe0NdeD09rpoV8zTS-0{GGqIm?=^PZR=C_z9leWZcI;A= zMSW751zb%18QG|xUkS#R@5l3*yi##k`4ENQ9Yvt1=?U%<5pZ0bg~Ro(`?t5&aLuk- zV#cm*?P!%Ut{9im+60!A?p4+*CB={@9yt@JcZ)vSefoR`z9kE zGAe#0TnDDQbGLAJp{zb#o=m1MGnGOLFu52Rk-PuyMch|ghyvoBU-Xyvy{gT1fIFQR zpLsMtF5Pj^WgDyg3h`#g&|&0b)l0SW9m8+lX7m~vNSOGSM>|tC*Nef@bp**ah??{Kou3D zrFB8!Y`pZS`G8mgr(@ucSO3bbj6d{=0GXM&_VMGw?fA{J5kj&EGfy#0@U=&a?g}3% zIjm4Y7C%Kr?Fi4dZ=o|qzx|+fm+rTz_I=!QQPl@l?g+Y6ovgi_R6C6kHyKLa33&#TPs?e%_03 z1E*#xp~U~`gEbpI4t|>95qTM{D{Odkt$=|Z{Gb=y0QT5)vp==ZVC<3)=#Swy=#E17 zKIu9y^zi{>|BBHF4SayKv}j<5MN$r!*|IA7C%uN>ybRrEw~Z0!aPWT|OD&4l{LyNL z+nwc4HMPpCUC~?5<4*xzs*uH2ADqvl6tZ3t6~)m;T@#YQF*&{Ol4*v~Jk6~Um=|WQ z+vA%uH+dPp-3IfK977fky1k%;Mr>KWJbfoc1x|or89;-g5fF8COH0;krXMYTnZqhq zo^5fciP%K8yl-LiKp#@T`(7(I&@krxrdZl}N80ez5)48A;}+dhk8SApr^h@sXor+& z2QbV7YNB_;266HA(+tV#F&?x@&)KYSxrLx+{Z>$Hx#n)GI^1hBigm=p&IG#o=W%tn z-7LfCFWHti55%ZUG9Hy`@7)3VTV-CIolY9D4$H+L6{RL017Ok*|BjJQ(W8>}EcU9Q zPm<4w-ZmU8aUot?$@`TD)vhE?=d!S~wjVu6)>OGNNwfc*94Fvv| z#831sB2x^BOfBIH;_VF2F3OV_vDmW!jhRp_YHslUO6xQ(?-<9Cmp(3hK1ir7&eCK> z3P7>C?ZcVvBhe+?Qd61IK6a8g*nFi|AgkHvQNVYH^=%s>s+i2!@P-_!vSU3Y5*Ziz zC-NudRhoSZHSAs$E+^SsfcfSDqJc4>I^bx$ZC#LtOCx9F)np0QO1+HIGjDOzpul_|JXNPkTy*ANRnW&+qG=e%SEGG)xpyeJ zzkP7D^@=UaqM<9?=kQtb3nj{ox#LeH87GJAMBuAwICa_0jl@eUe)|%o?a{T0=AgdE zsSUqyEqz^`gA-U(7mIBZ!N40)gFBCpqrbm>sz*xJ?xx4<&YzY&Iu21CZedwnW>tqH zYk2rs`iS4JJ?t+jL^3&;DI9t5o%z?a>S4bBX%Brj`Fuzbl%BKMzg;Es8;N9zlNA&F zJ``E*;sg1_=Zf(T!<6-E0%&g@3SU(qPP-zdxuh9o%RYXj@=i6=G%jdZ{4vI13h#z)M0=6n4Er7ne)m!NK^P^ae>R$>1L|4 zaXCSd8p})a33Go4>DRaeQTY8RMLrS4SW%+Xr57ltyzzj(d+JRc*h2&;1n2I(~z& zxJBVkc9Pj&W?j?5YprmL;li-${gDoQbmD(ldM&>G+=ERET42#1;Fn=?CSX8x4+A>h zx7wmmxGnw>*qy(Yt|8D>pVK%7AJc$g#K+lW;pD(wa^Y)pipPxSPyajPg-A@WD9mi1 zktY(90(K>J;TKi#hGZr&>-P3(e`sIWU)7re>F542clROhIVhzk()BUM z7x(Bd?3obwDTfvx#P;AE|BU3xO=S_t2*}$8{Twhoa3Z*Gf-u|t(zpvtT@RQMipav~ zL~EkGUuoLJHpJZWg90BxqWyR^z%h)k+8d`MiEGIxx{{d+B!RZL)Ckd;jfvZ7@$Kts z?=@eLe*uDl{rWWs)^C#Sb;py#1pZ22i9{;X3?=a}1#VC9A8BIpFb|5}@<4?|{i~Cp z0expaAa|lKe`xQaS1PZaN3Am@Le6ifz#OH2hwUicfYDhm1a;5_t7>tr$eMfbK-n_0 zE-WrD$7;%b9Pu)?BxxO^{LdzjaHV0v_(AkdvgMGS!LVL)okU|L_EV2CO-KhRZmSPCIPXa_nK1-YlMb-EFG} zr9unDoIMr8)>(5y3vlcvTlU>?X#}H+t4TXxCc?DDFZ}7p19UsSPdaYzNP>adXBv_1 zi_cTy8d|+&=a4_SQsO^n+jvixsI{gd)uD-;0{#8Cxp~3*c}t!8M^MXx4EO?;*yZNv zslq-Zk=`7>LYh43)@s&Ghs7o2K#iX>V2DKjM9$`6aJtwDzN5`BrEX@4oiGeOAp^RG zl5(~i%DmsY`$a^^Ta*}2ydLL`>^M{&1a-AO;s#;-cGrCaL|HIu=A^xL+>!<{=&sKu zhn2KV4~E^{pGhs^1)R%=G|hg;P3ue>Zuxa5MOn?hj^Sw$y6(&yk(p#+#qxaILI?N6 z7k9b{E762=PqFa& zhC`ao2g%5-3hPt)v}dtl3_`oOz$^kq2>}xA*DTU_&XNSiRA~NQ@-Ga5h|7oUL~tT~ zdoyc}k6pqtbV9EVc(vaQ77Br-nAb3F((t{j%>W#5^!e-oZg)(_VZ~jhF1HKMlbz0i zJxrHJ8$9q=ZS8QCe?@uGCF6*MgX4v)>m_g++LF_}j+{?6xAv*$aZN{FZCw((?pE-j zu7&TLqFae{%&WSP$)+!xs6b*=vB-f2&2$-pmPz zo-opZ(;%BomPp4${HO&Jd3>D~C>fk+7d~qzsh9LTg9^kz1Ki;$C&ujfJfjQ?YU;Xs zEuBw=Wew$}iicS=x)>W9+Zuf*dJ+)9uEc|=rR7ZkQar~ua}&t{wp|35_??4mO(qB? z==12)7*n1XX7Kl)ALywSOc6* zbkrA8TfbiM2wt1?CI_?nn;nj}#*kC5T#IrzXcHq#|AevgLwnsc+L_(DSd&=%7M}hyUp&nRKkLdHMH!=OZ*c z(Bi|DHU)GKeQXQ!5@nreoLU{qYVRAlKK@{4WAHk@mIKCkr!GKxF#KNMZ;Xk!?D zcpG|DX-qu?l-}N^PGxD#bg5k*BtPaslp~IG3rHS9Zzp(6ts=})*9{eG=6>T9>K+l1 z755p@VMx;n^()SlzEk|Y(3GmFJAGgmTiFHR!NpzpicB<;xnH#o{eR(UM0+@mhR9UrWsOYBnZ zxDTU=_Pz>gzYfku)CRNuL<9{V)3QO7y5V=KR4-~XiZCitezD4!k`lWQoFFpLpM60G zDlzw-wnGj=ch`Bu_WywsRwFmIe9$?#2=fTrdU=-18M5CCec;F+j4(X;z!+G?!Q^MT zK)xqWOtc&F2er3Vbb6|Uf>dMC>`-<_Gotk>ST5k6R2HU$Ss>zv1QU_q7Ac^xcxpQ4 zbq1rnS{16}IHf<={EhM@_|pda*;+m6u31bhY{j=5SpWcJX65GAD~~IvEWe)_bZ8$^ zgQZiyRL}0#>muiSb<966NQVCv$^T`2?wjoLzXQp_8OClq|1{2sy$_CO1O^@cw^y?Y zsNW%%Y-+t9TM)#1x5aLtesLiLCSoC)p@y8~^rZI>?q{FNyU!z5%-1YE8>1b2~4gD)(g(R|jrC^#H zE({&6$dL=ppqm}w=kGf^S~am9Hc=j<&HkFyL(Vqmo8EJE++y@M-?jsA7$gZFt_2QL zz}^P3FYqxoaJ}5Z^gac`jvo6hV!*1g`Cdd~%LglyFQNDfo)dg+Uwd|{#jLnCceqdc z&-XamDxU8ZDa9lK06dI;Rr6f*h|}Ms@$1j>g7VrU&^N(BSuw=AD-Vhtu?x6g&*Jsd zvg=`EE)7hPCRE$zMn97f;CtaK=;NFinsJ4PRQ7R|0Z7Tib4yYij>(7jb}V{Xoii61f(R+wQAF z%DJkeslb1tN9Fx9+qs&%wK;;;=C#LUXH||9SRA-T3mD$$>yzhemsBn95$NTL;k807`+35UaFJ-5$5*4E4+ZfRx=O#Nxtll0m`XH%uSA!j@Jcc}Q z>=*T?Ki8VHl~%e2W84V*wz0^=MONr^bgM&DtsA3)@0w6Wxs#9ma36yw(s+=s!aKmN zBcaxxV3}Jdr*H}o2Wv|=6aLY5QLNl=*6?SbLnM%px0zs&qbdN(f5b>Z1F_7#FOUSa zdDmKE9_@sY|FfPgO46)!@pC|sfCwP;|CoB~u%`Y$Y@8b1umJ)BN;6VWLRwV1#~3xb zrIGHE66pqM*uarelF|qQf=D;gg3|Sz&-eK~*Y*2n7k`ZFoNed4&;7dJcQm$Nzlmdn zHS^1w!n=hq=nKU7MstYKEYvz-X9h=e2xe!47*v!dK2QPuGDiZmxgsYk)O@A<__B0U9kQh!XrHp04RP4oN! zQpiCHKYfezT`1H(Jj_!Q8eTBOFs`FH)p4A5OSu#t`V^5Xz!u*HtW1;iOG%-`;OMe- zL6@qD&-cGhQ+D?Xoa@wK-tPsZ{r=T_ZnLwrfY@u4n5bS+C59f$IFB*z%KtwtfEwW3 z@GQLuKwQc3+C4_Sz;;|r6irD7^khksy~a%oXJ_a8I7Qh*GlTPE6Fk)B z;#zvnBGJnY`!+cThprEFJr-YyUm}WM@*q|~{%+cv%V~nhK1cp5m)%(^yTy&0ChY%G zO=lR{0!LS1fi~dC59=+wOBSssPqG}IA&1_s&u7awHUcUa z*$eum-b!6XvE?-*Vg`RVw{||S_gH-ND;OMk=QD-6u;}7;jFw@*czqa1;7>;9{)K8o zPG$-*PL-br1GTQa+;lJb&Hbv@6J%Nxnx2N}rP_T%o2O>;cbAKzZg-iMdxFugXOZF-Kw1D<+j*W>MSyYpBXz~6quca*d6A&%46Nxf)A>KUO?g+-xOAVtH+?v!yRFJ04n*ag zj3$)MznO3PcIv#DtpBXKJ@&ln`_g%)m()!4HF-2We!i5Ju1D*$k}#H$oiZU+_7mHJ zD5`(UCYZ2*5zVgC2`tl>WHe=mR+l&A)TCTq1H{Dm>rizCA=b0HI&-=Gk>Ss$)NOZu z*p7@h&%I8&LgT1s(&K7&%W|1Icgr+oglllB7~kN+k4N86=S%wodbNR&22#X~pc zAY2$2|H#oGXj%`>onEd~76lLEU8WZlwt=xqAU1)lAbw=u;>ws=I0kyDQ?A|{xt`<6 zMZZm^wt}~OLS}GRoncq{0jb>r(naH;HP#1Qep$eteYxb+8X9ubf0n>VU?6+>LVv=k z?Es$w8a=(zE%m7LuK=QeY-nxb z4JjGhTtfHITH|Y$dU{lbdi1gt{_=l9i^I;>1(L7Bi*0ka~n~#l<8d`NI6~=QUiHU_P+t)tx7%MPq?)cs` zUJ&fD>T9?tdYB>~-hazG-n2?yF~LP_QWydLwEJx0ng`b6->USyM9OBMmHE*KE9}-s zySfOJtpK}z-mn1EOHED6%@t}LBpz1**7t6ar<^Y;D1O-Sz}Tx%^Wp|skAsK z!!xur6YTSeG(sUWd)K)=w!ufEqF$$=fB&&zcgAd><)c+z6_rPD<>HiTAv7!|sn4G5 zbzhHWFzoP34)xP8(b4wwmnq`YI*Q3(vN~fjBsC(k9Q7f0_AkOd9tnDX@s<03bAkJk zab`+=lEE`K6Siv2{!m7ySL$|6i-kxcOT3YMvAC%@Y%^Nu*(NL`ZTA(4xpw>RHZPo| z-o*@PMY%rv#zgbfh({%iGDR&q+}})lwhBV8Se7!fq$W2%{fwOw_BPvp;sgrMzL@-b8_YwLJ z3LVbnR(!a>=U;VUKujllJDTm4&VEP(}B} z3C+}>zTn%w$=Qpn`A$-2MpdmTXJ%}$0lGE+mOPAukjf>yE=2$MA@~JTWM}aqQsHAz z%@vkit2NL^s(5VGd}B(o@M_C4CyG+{G-KSV8_$hx6~p>&MG(O#*d{ zU#sd%gxq(~2Wj2olC<{Js@O(8pB&*+<43 z@PAx3tM($hxqW{TJAXtYE?r<2G2F`RYGSQaVf2E)nNM30eWKVZeOck zFy7V391VE^O-N&$vA1gM&BS|mkER8KFuWa)pavh;Em&?J{OY z^*>kM{tj*4YQeSye-QX@=W!-UZ0YkL@PAl8hh$SKK|^cDA-8=ubb8eM*wb~KTu4c^ z2k=5$RMDAxX+&HH;iEyVY>`u1dX#uya0DEPWNgG|lLbfR>+ zMe|Ybb&yCeeYgXHRRPj9_X=~S3a4y5(`17W6-x*N!PAKxLA4GPQ0?C)tB1MS(Gna)|X6o1Bq}?n`%S4aYCE{?)XQ8R4OKob=8^bM)R=hR5$Xt){0! zy&fiaF#%Bh0iH7JjdoAihyeWC=pSMyp@|~W@Wp$MD72s#Tv+&`pVyeRa_n`?DUlb9 zsDCsoBqq8#>q#jFR-N6w$l8@H0R07tLB zY^3@WbPP)Aaeu80e;ua`)8>Q{0{UO&b>l|6ue>o8fGNKGR7bNoQJEW+p}iOp_ZUwV z^~R5eZ<0>HcyKAe;=&^PgoT@sNo`att zoryO5AV(ShtB>DDq?@^$?CvF~+M}57lRVC&DMzKHR$0oraxY}Snk9@L8il4L7rC|Pz9Zp1K zzk&OzoP+&02LA|Yf`3goLPDZ2y&8!wYIPJ7@jsn5==|PZNaXmQV@7vM$W)jZ8HI5G z+7}o%26jJ2w+5OyXN&V|dePJpdxY7~&Wz5Pu|ji~4WAfv#lBaqOA$x2b2$ljzVIRS zl@nvtSm@+^DlANeJRpES@hxymg@E`oFvyB+3ovA6HMRx}IA6p9K)48VBpDFaXGr@| zkOL}ZzaZ`!QHEhht-aau+?j^%m}z@Wf#X##1e`d~R`XlKvF|mN-@P-=wT6DEps^|2 zU+$FEe)t*dmlqB%UpG96wn_v(5uzW>;kej+?`7h1(fG4f;6(_+ul5&c?@apeww9C6 z-LR}3J=e&`fO}!il7VHdfC0ecVq!`7iGR((R%m+UtxNqR$>i4@ z8^hH&XN!;zqxiZI4ig4w0gX*hpd&r(ZrND-_5nSXKbi5zC$lF}XzBE)Om_@hke72Z z75G{S^|*&r5KIs3;;!dJk3E28Q@vw}ck80yE`o>c%MNT`jqmA9odq3Sd$q}apro*5 zP(fLFl5FzX_EmI`a5>eG!E1%GBT=a?pS zuOLiZF?fKpPIwY=_XtvljE+QlARdX&9^dRYSAcs~GQS9~+w2d||Zf z6M$3ZL!R{!OQ{=aw-o(sxEz<%jT^M8{j=@S6aR@(5A$eJN2~?RjjCZq_nPoQM6!?( z6oyHk$|V?nj9aM|E-JS+8+ZQ_z@M#G(JADhGkx&rBqhVAzpIvC*ca=oQssmo0NR4lsz zdZ?@%?(Gk^{zh@~*sw>UJB@Eo5J*(f3%E`mWs_xtM;emz|0yZ(fHxW%zHJ@Oi6Z+e z9S{buRQ#T3`INw(pPi)~ zBmXXj>@IB|eL1HH#xi~YCFfm3^k<3#{CFttKEfF&u+|o~=L;B|L{?TB8`B@x#ABYq zv7rm&oJ?$hFeW4ot`&-Us{(}XmG(hhu2yi7VosTi=|j9*u4m@*RjpUzw{TjR3w_78 z1u_ZSbdeZxO&gO@4S`H{C0I|ubPkE z1+O2E`o&fd{Q~PIeaOBLdD8`L6t-hMRb6h2arE@z;*t($47|M-H0E;MadVXxC#Vc} z8lo=Jhrq!NJ%tu`Al~WB~d(|}>Qwj#Zal7rk6NyPk?#_Ilp}nD7i3~I` zDJkmFd=LRVofVQc*t(T~BK+mxT)?%Bb1Fx)fp`L+&EhR;44$N9{0R@10W+N&pz(@i&C6~~Rn_WyZ_Ghe6-AUmmUTWSiv9u=NDd5=ld5rKlaqnoKpk6ceFYD$njY< zR$|k7MBN~{2OT_gswKc=nQF$Sb*C6AvpUwWAx&wsC;v4A8x4EJvx7GgR2Na(!zRlR z)?f7E=%>`S{6qNlW&3!y&v%RWGQ zmju~c3hb^iArVU1S&|+d*n{ogS4gUxxkqpW6h4ObyDB~%&*6X$@|HAYK!!Ee;<^N?uiQz7^-&reOu7Gi->zoDpIaM787ghxulkfL5ee zhF->L_75jPdJed!6cnpcrh>cj;Ml>i&-hoTQ(O=1!nDSXtLvnr(y~0%4T2+5Sx_8+ zT!!sm=5Ws8i}k!TneqW92$q6QA#W504^=-J4TyF~bFtD}vc_<pkfU2F%8Au{-C?mdMmu zL+?=C8C^vS{CG=UvBGzXnjBUBo0|3}w`S>5f*I3=5_)L;p1RsxpXE8P7Z9L;=C)y$ zt?5bg!`6F(%{Jmo#IV@*sV@$TPjRgM45g-qhUzr4A|>+51nsFDKYT=Sd$0ZT;EIr@ zbMErXr&hp)u>vYwRxxphRNcvk7su~$GZ9)d_5gKDBCUF5Kptmeb-=IXQI8`*#&D8S zUT@;-l) z0DD_gy%ek88H9&2(=ICg?_`+GKh~(hxHN3Jao?!L8IHG^gZ@N7=VD8-T>xQf;3w{&83$Vn&ls^5*V>?J3Jg-^4c_^9ySZLMr@@#S7 zT&dlPHa7Hc%zeqti0vx+ZZCAOyhLD23DDBfaqX&9U#X_n=EzeTg6EP5 z##oYhB0(4gqRzp25Z6eCVyO}!#wGR06m_b=GSOZ+8PjgdJMM9U8)LMJP-PNVes~UB zF6E?@fU3aNHY4(G^p`CYE|M%Pow_~`u&D-zWj0M}ebii`7D^qQk83Pf?! zujg-cs(<74fXNj3^=9oML8Y_je>epA^}qp_!ui`(qQWu7a~*-hsV|Cyb-jPOtZ?$T zq4IlXJ>(Hat1nIPwAJ@upPDc3uH{Dh9Ii*RK8lyieM9&S5kMd!*fl*+OW(j_&oLn zn<7F0{)-%#pazLUn3Fn0qmk9Fy&g9AuANP`iKmWc9gm+el7) zB)w!^&S)i-yk5X!p&4RM?iYQCkaX`+7SOWiUZNyFLX~c%1Q_L&GOtdq|BPj^@d`lO zf9AgTzR;|Hclnver4$E>6>Nd!2%WwCR76cD1} z=CYX=}0h9I!&Dr z7*EgWTY|Ji7^D`#Me+j@4Y_{B2V^v98M)(RZf>7%V%Gki{1EIND+mtlP6IPya?{hY4VIf@Ou*X$<*oE;*e>BtgyaWYx62?;;t&4vTk>B zGhVX3fmbDwSyDYX6fxx>N+?9aDirfz`=RSkk4KLsM{tio)pFbofo?uPa9$u81eFY6 z=Unv!ixGBU+VE@qtDN`DWglMH=v)67O>M1!fO05BD=|CJ4=U?I4wlQgxPLX0WaI){ zsu7W;cKlQrIgRYPlaq^RJnrLCj<0?9!oVA0+$Fth+m|;2OSo}a>$FjiEwK4wdy4{u zoCd>=UDw~W9GdhJ+DB`FX(owhg;*22b_uMHI`8kYrDkH*$C6PokoL9bOlq)q>tpFu z{J94`q+6iNp}^SQY_4Fc2ynStc~6s!{<&<_rz=d{JgDV^L&`TS7cQ40|-WdN&(U*&z-rGYM?x z^xU;acbrHWlqt>;9ZcIrBtSmpsER>^qn8YT*y`o>_6}c$fFC_Tw8%6ouSMh4^UkXu z&+(L=p78_`ZItk!BEEJ{>P!k4Q?}y3awO36QDp1r-=^I-_8*(Z@=|*0pprDr^59cX zHDzkA0yj4v<_uT3FAq;Hc+mrH?NQ2@YgC4e)X3ie{wcbT!t5%Kli!c-*(mlrW|g^_ z2SHm`#?%w~n0POVZswWB;D6s;Q?Jvh?G=xNImIC@`a5<_%X*?nzBzI{a-*sviJ;%( z-mElH%BabY!7@@19fa+~urA>GaH8nGpBMgw9mPNm+1N8`GG^_SA)BR(kanBLXxY&l z>Q7_l^Ie}i60KbIej!IiMHvlZ(cMRlwf{~*Wi-juZJ&6C_>Kz;p!tU*8fL$LA99}8 zNEUlmKuTsUVBS&!s_0tE>dgt3Z17o=iL6)Iz{Dq=s{eGc8pPr9d880*VQHy6`vgV> zR^qd2d>O730XKV&!?7%p^G1x?LNNE$xILtds0;twwT{$8+7LWzW0H&E5viX*6`si~?4g8~4brQypBBdef^zd6x z+A}!WpP9vz4a%>jC8Z2;#JEYJxuVwZ`u+F&=rmOjTxL!L&=@_B*zJ^dtU0F6q3~Cw zbWl-sK(sgg_7)#*?Kn(}I_F`q;x6m(ji?q>kJk33iQS2G>NyLO%t>@Jq^c^<_fwg? zivM)>?a{Sb5T$_~=cm&d=sx$1Lo+D#l>Peyk*^<1T_sZ3ABGS*)>w&sR`XI0(0)>O z$-N~V8L1?(dV&ryg2I_qe+f%F}0n|`Pt|p&$Zv4l>G#oC#_oi5h(#eZ4`5Q zkV7}l&Ubjks#0y5XEMl+f`jX}62LWDm)+wsIRf_T_xn$5U8}V0!(AeIZ{l&gT0zn) zDVpS2<;Y77*;Z@|+uT&zvDm{j0^N#CltK@UIK6nMMEtj9ECEXRx2*NgX+o<>vxvKI zIc1F$5X;lkIJzTqs#r&QpgKdGwd`X|uEk!?hv*j8{|tqQA3)NCJD_YI`{h|uRlD2y zv(Nuumd*Zf#_NT?9l|~3jnj>GHqEE-g92F_YomW9mZ}VKt;u~t40T%=i+K17sbMV( z6v<)WF-I^WCSr3MmvQ(Dx4E6*ZQ{5NMjUl6+}9;RO2qeAaOtI0;9pd-wI-L9zMbO3 z=BvoRBR_t5{?(h4fkcYI0^Pw?d_e7?8ovD{xo8N%3%AgQxsXj?0hdX)(oa$SFxHw& ztm;horTQB)<<-JA2$^;oGs2@{iEL!-K|xxYn9NF7(Xr5^&J^7Wu6+>^zTu^QUD7-F z>IUeKWT#r%=z@f%Dn1y^ce&vgIpwKHVZiPF8VH?<;58BBW^CwR`;4wmU{_q^GG+giIJXy<*d%!0qNZgW40o{zOKdd&QHS}XP%_b)IHx+ z7mpeAo*oTpiUD_7I0w3K?yGn#cif-3Eav270i`8r5|ce_!U?f`h4cW8R!+g39pC(Q z$VTqn`7Z@yK;98LDJ=4JlgE{~Y}cfWfhg{{eKErNbbPPGDBrXcfwjeDJdb0~(WTCc z#q}ESr>HhofH8t*&6v}opch=H@a<2RD^bMAl^y<}S^}eVX+_Jvyp;zR#Ba2s8&6NHkzzsjK~mqNjyl3nGQG?` zjKqTtngY|G#%9d1`B~tsTB>8i8iw1UWjPuV3zos>lwan^D@lKDdI*b zL44~2B-q!*3UwzAYe-HMV89+i2;WIS$vu6CM zZt1b%JCK!Ei%-CDXM+_!9K63>Fn0?Ig9wUo!qF`fJdYm}A#ZcuH&DXDt)>f+Eg7$| zAjBl?tgnGA8guC~wUl&d{A9!?)Yz{yO%j<(9#l;oAU-x{LNxYnk zNOF+u?TT-744o#`qO)zJuRjx`#GJXBS7!cSZ@_U+1(Z_T=`Px`yf_gatrlO$qa3H~^Z2M$|vGB1*(HD9bA1@U!VA4pvmMl^Q6^K%eX!NXp8{PNzV}It7lgwLN+c$b%Cb*r7=&W$1y2kKqulwH)=8 zP!5QIm-R$XDNI}(>)e*?`&eNd_3)Z5-2;9)^m778Z^ymUv@RO!;SR=T_6aq07ZpN; z&X~A?yAAH~Tk8wCV}Sim<+0qTEs+zFYu;4md!DA8UF~0y1%o!&ymw=+F_K3~Nr?w4 zz@zb;8Y5n9`IZr5;{jLxW^9BtvK?~d>OpQJL-06_`1{Ov&+qysX<=R(b&_02!x%sX zcf^nF7-1#W6QYE+8+dOhKDb4~RWS~e8x%1oljMIDf`UndE|t1~gQTK_hvZ-Y(! zd&#Cbg;$hXLQ4P}NW7L(vF=txxEDwpbt~9^Xu7(~aXCDc+U}Z7I)B-*J$gwdquI>6 zO96Wc-jE}wx%Lg)>0h&nWtriX-FfWFvi#kVdE&aloPdW)c^NmpV-y6MNYjzX%zW&d;r&{#pVgcAYWRJ`cFRoN!*tAPX zuN$|7!`vKbM5Y$ScRHTzBeIUG1=A#c21c>lW!?Mh0+|ViLZIF-UC@>sP?`7p`Hp5a zu46*mNb7lgetbo9B9sO+ zGH}Fa#z48hgf6#Q?W%jtEXnP7uh=*+80KK4oEbd$2qxZ9^hp7s0)K*Tv;mqC*3ey` z-Ja~L+2Cu8q)3uo_XVRNk$tUULs_ISie{!DCYC|Fk)DOcEao61qJdftwu0U5^6pFo z#7so@K!%qR^9Q+-W35EHqCzYS+T$6a#e}3k<`)V4bz;;HRUQG_ME;vFEFVYf2dGU- z!uBJT1U%%7Fg+2_*S~z@*ItpJdB5v)cR#^5Iz)&P>iVY(^w~B3Ft^qW+!yY&v`S>H z?%y0?qypb40KE4w7QyU0hY3=6WaO{N=~P5q1&7YFLJloj&mZxo{Of3XNB>7Z-!J~C zRDJp0G>oBTi!dvqG=ImajA0xU`u#R}`W6S`HK^BbJVh4}oG!e+Aw@vXX;mAgcj}jK zag`}9WZ6I0y|h7Y7+OY|ZgIMNe_*tksQML`k&R;Cli)`3?SdP@IywZxYT<2G4pGO1 zJr^>KH@qa^j^v9&64`_IGb+yL2;ulue9X<*P|SG@tmJaQ1uP)^fduow!(E)OHRCc{ z!Ma8nc~7!XU_E95*JqnT6SASq0abr6nPxSjlCG_Or;5{&9v5I-oX_E8z9aOpAMfjk)IjD?CW5feL^ zYEFNRUg*!=cQVbt`CG6py46$*iDGQ98-L#+%{NTkr{ArP;2y(8bw04hM(bajL*tu* zJ8?;JS5{n4LuxXp%bKHJ0YY<8coAW57Q&V!PjYx7R7e15K8Q>gjv* zZ_MMTCi@{v?Q-Y08fhiLQ0vh`ltMkec7zHx@_wi%((EBO`LG5HRW2o(TnDSX}ZShlOu= z3RS;DiigZ7d_xcJIfr&1TZ~X>(J0w3kYr=131M7Q8miWdJ=$WTl<2cYW*5ygY{uC^ zn(mkXxj$#)xE_C^*$NAksLrQ`d9eYZn!i)cIIK%ooN#-1Ee_(9(XHPBx``U{{p4*# zh~p4t^mM|`PIYxPf=1piXmnr^i$8K?65+2wYx9F&H;pTL^M}75GEyAvR!+vq#fATi zS4Y1Wz)jx%S4BY0_)rwoRbqmgLv?Vt30wc+1hv5j{q}^xx-?8gosXrRiD8gfU>4bD z(F*gL5KzNc-?lVu?KCXM7xb?Po1-drIFZwH*&3WVggt$4gO5oDCDcRw)()OCXsxBR z#f(JsJ>w*OxZf3)WZe_{7=AmDwKcltj`$5ar^9&v*ocT$YP8ekK!=WOzL;VL4BjGC zd=Dsfz1eCMy4Gmarz-$r_^T*<_uIc3+WN}B+n+i%W&6b6=^MO-Lib}f1prwNsHwoN zw#h4N$QvEDAk{SxJi}wG7UT*_GLP z`W))N>qCgOUfOUG>M`;mUAHdPTnf{0!fEy1350#It}PT-TMR!S7LxMnb+qS^RVDcQ(eQ2+_B`DY-5>*C$6EhWvdG+p<2< zYUW8=+}%*YPZTCCyuD6UFHEtaMh~g)@s#(nn#xNs?+VMHpgp?bm5&vRuT#Y;H0anu z#I&;x2^tfK!l(Q3?vuR07>%dlwmAq}g1Im-Ml&^iZXJv|T6LA&Wx_@4&C}DSpD}F5 zy~iSnS4k~tcx|-J_u?txq=NIoaTjHUYMA;=p8--abE8ZU%_b{R>yYa9q8`^x(#XvKrxGBjctG$0V<#&h z;Ezjefljgx5*q5e=_3Yl%q2=h;W-ay&q9JY>&YE=`xCkxcq>#f!?u@Ac@!9jlc)#X zd_qePgLi4g72acNhQS&i%8=HjC4Zj99A3Kh=qekLk$pTv1C`veT`VD|EO(P@>Ub?I zPS%oLW=T)l4gKUBhphA03CuP%;*Qt?rfs*RSGdr;t@dmqMPeLeGujii0rO3ar0|j4 zCOd);V66EH9GFZG4#M~BdjJ`179rX%Q$rkC71cWRZiBpOk?mKY7nV0aLt%|ZR#;KT zp1_4B)OInqlrH7?oa~xGF8M=cZES@GE9hy0-K9z#IxU_7tA%Cbe_UuCz=j)iCN*^U zG^)b|rWDeLb`$#zIM9qe-PsPB)hOIoK3XFJC!zW>p${CkH^~x=?%6y zGIC#VWj+#Mp8lHF@Rz{V4Mq(PYKe;!Ma;5iHBhD@bAK^wpKQ?9NpU_&RgMfo@bCzxN zZto8nOrIOq1m^`_tbY0c>5?3o(=TVkcG$$l;@c~J4}g)k=?}rYKUIWX*UU=V(N$Jc z|9};{HN4locG6rP9VUu7EKDKV+WaL)2nW;y9OenpNd0Y79Nhm}&8v3DY59Q8V*=X; z_90>V@Md?8=+fe~wii9lNRQ56<*~2CM|PdGgM!?S*OcNiQz7<_*`1g<13OFRkt=S& zqsMh-cPGVYOK0c@EG}e3;0%t#V`V&eei8?;j?N5Or>lUl(-N_eZrcQyD2wb5vU*J6 z-WE4RE;hn%7Q{=YD|NXXm__vd;l{=(A_im0k7x$+$XF32d_t*^CtAPUzi-rse!K0+ zN9f5|e2vnzFb1K!Si~E&fEB`iYRt4xLvc^^i2R>w-IVkA^N>O-zHzxs>^I_qglwuk z?$JPT3@;uk!G`An=79>i5Q{un^#@G<`%hA<{59P~>+i3l6>jBWc6Giq-&Jt5y;fFV z<*O5P_I>T?c^AodX+dec_o=up`t#dTdibxVm#VIgJPBHmGNwa-dzxf;_$hK8Zbpli&-ppo9=GX5i=aW&MMn!AzEU zQD+0e;u@#8Jttl^(aGE(9pGbU68aWO`>#1^*A87#0Lm!!ERpsvM%ArHN41zC2KrRPS zeHwWW>g^`zbEjB=`Z&z$i?~Q#DpmL*n?OylN#0*(*}M7j;3*W9fqG@GMGXy~UgEt< zs$%(zzdz{r6Qp=!WGE@VtBCRDK3^(YWK;F&4k5#}SiY4Kf5Zv9TpQ|TT2Ss;Qy-6- zw8RP7o*m#gu7%#}c&1@hZ|H{*L%dgiB85ALdW0}toC%bwkFZc0lL*?Uqtn$<^i>lU zD8GLf|E2~Es*{Pn4`ki)@o5I%xPA4qP<2^x%sS?cA+RIE(ku2cuv|CEyX!|APL*p? zalJP-2Uze6^$i`-ZDtY=SFTulZb^x!iM>U!9JIO>xH7RM65n#T+X{Efu_WaRhAJ=b=8x zu*>w?>}RcSgDtN-+jGViFo_Wi*3y4M)D}9Ubwsty?(aTo0Cg@Fp{!}CKe}y__0bg} z`Op#q^!H8{57>J`#&}H<6;b=Wd0(T;rD19ve;m$nHZ^R9i$TMe5$}lHr#t z=75YAfT<|7?!rM(Avvbg7qpaK}H2D$IP4O1wy{d)V9^ z>UCObmvpBe`Jbwy|2URo^j;DvK&bKEehF`9d063p3Jcq*W4!Q_xV9+W(PZ?aDapRZ z#sa{3{jn*Eg2lOn!cf)4gqL6#iv&$DQB-uVuj>B~PK=S^un*0Fr)9Me|IA^w_Z`3V zc=pGOrBDgna_9p>+k8Yjl#OSLSrhY)P|Z-aO0exc<>76ZerTGs;t=BgN|*gtL%O zdzQQEPkr%U?wFz}7cy0H$s{%WoTX~$kUITPuZa)4Hs7ab(me9wh3>RgA;(^3@&_0+ckkF9sMVPS^6q}brcA9Bj<WLILvA@)TL(u>Cep`UonYguB8MsZie>0vE#ejjUS$KNJ2fK}` zkxmln6$c8;qVHvyEW!}eNU|&XLE@4nk`V6T~^{cRh=c5U@^)4>+Q|HO> zp3l>=$NWEFDzU#?+hQH}TndKq!l$xJBKiRC6BjnL^$mbdMl}}a8QP{#6h8)%L*os) zs{CK}Gfvq~k7k33X6Px<>WNiw?X}X929}En;&{_{CWstSXTuqqYE61=lr8jW3CnJ! zC5|yunj6>^Jmy`Xe$L!)cwp=n#Jq1`#399@m`ue5RCZ|@1z#Ig!$sB`IMu0pcsn<5 zE{$AuGdTHCnnPQgBhOOEn3`Kk-siWy-Jy;RW{_SPz4$Jp92dH`e#~1exIv$*e<7iG zZk?cSVPWB{ZDG-=DlF53Af0pw%kdC6c9Xmtbd4}DTKrl@nsIiU|B3+9@u8v4sz*zQ zI%6&175@t2%CbAQpDEKyjavU97Kzj2iOCW#bBX1o5u;JY9zO}0yUh%@5HSy%fE%^i zKX)(Rs^OK77Ht%5B|Iw&9$2O}H0hZ-ExNw#Vs6Iqo?h$o{@7i0N)%+Qk2($H-`RWo zhsOZF_pLh03-AYv=zp%S3yNsKO8?dq5bS*LK4GU!%Wj(e@@Qn_p4*-QBjA+Y@YL+P zImmPivqIJV2+>8nrccI6x5(CValp9P`2<~Fkf?!!3=A%S>p8~qA(}elsg?1S(S;~*l0?;H@s3`zqz^dngqGy zaXth3re=QGP0jMvFq7yJA2Y0Znx0V}vzz%F zNOH3O3%0CVc9c$RPGoTj96yud&-oR^Vm>lF+HfPVz3rbq#HC4omwU7$r)LcJ8TW+C zjR1rE?*b@X=rYHJbN#ilgo2NfCgU5A^{{ME&;WDPM^N*d%GueDzAZuwed)ns_rDvQ zh|Q!)^V*Sw(L9;~(I2L*o+?k`R_XK7w5)h;y&~^AQpc7DE>ZU_)8EQS~rv7 zM8UsAm2~;>Bs8)@6z=4HmACU}ds~*`E_m76pM_BwGpj1Nc;1D3zWR?JxI+rB z{+Wya)RLbFP2>aMILx`d&({=F(ZcS(ke}zuKqh3*u`6(F158{5dm{ zidUMhVQo!^6n;yK7E74rI4pmgvB)nqG$3jfUbjNQ%zSx0E@RXV?+*J~sN8C(bp>NvqDglNMMnOGaiSl+ zGE4~BE%!l(?%UAUdmjIuXxt$3=RCvLBZicPg;XgUDagZ{@@{n;9r=>|hC(7M$eDhx zM}aEBvKBd8fE??s;P~h3T^1?98kk9{8LJ&oaJ5?Z)yqk0%!~>G&v7mcR1Mq~>T!4^ zcESm1&aa9#!(ALcpS&>;Ww#1+i|=~|-?J}Og%d+EV1|a4mc<@+_M>YP886@C8~9Xi zAIa{8quJ34gfQv&X#qY)tY1$FBF}%Nf2`6PM@tWGE_+tP3|a@g!t;RFY04kkegAHD8U$$%7I5j^-KS=_C%t?_3} zN`f!!G}G#oK00#pk#jZ6V;a($>c*-6%R2BIim2-!lS_YA%r63zKoClP{pHNurA9}| zuB&Q%p`NasRY)RX0}l4KEEprF>)DZd*{}r6A=TZ*Zd$N}3^8~_oZT(CSEEmNcc211 zQo8DSBLn101`od>wFV0uOZ-`$5b>rZg!VXVg1~IMNcQ)9UaUb&n2upy9sWTW_;ANzVloR57}_Yu`oDkwhz#Fe5*YvL2$8;3=(c z_8)PXF5la<$79C+K_)F;^De%FyIOCI9RSu=uK8B4>#+}NYRYoSwQmB`r=}^Bo19pDxcdc8m-rrn~Ti(@4S2xRTACJ+T(arYPChiW%*r3q=O{6AGYC+r00w795RyPc?Jj$Ig6v|@ z2SMSh3NzUw8Sh{Ww}y&e^2MBQAEumz6X^5O*CgWi@4rwj=u?14|MW8ZOuo2+txp>r zu?B`--liIT<%6dWFARYmp&AS#8pxUF1niw__^(Kq894Yj$Hx2es;)I2=K09Y!*hYf+n2TU) zDm-kOuNcff&@unxVHb|ntA>q-g0DrMI{YvCJo^C~T5K=qU$Ga~-Z(q|Q#-8;1Jj)_ zMX6-S9;+QNImlq-wA!ydtCo7EUN~W4vAk1$A+PuN=N0cZ=8XibB&jct^@hg?dqvB3 zD_LjXw%~Mu?(gE35k+{#jQkrakv)~xcd1`;y3@-KGRbxqy*PD)n}>4sQ`~)tr@@D~ zZb<&*hA5#%yt;|pHx|rT23H1RMX!mGq0&mguZB^7q53962_bzG0j{}jNb^`Ua7{_~ z$RmK+a#@L)nm!)8>=hPPgw>b{bJ{Gw&0`{f@3FFY8aR19VJ-}_mXy2uKP6pvIGf+! zCWP9fc5R|9Vy~J-?b&{bASI~Pn6=g3d$o2^HEIMATa8$)t+rCTwo=rn)%WS|%^%Od zxvuBA&N=tz9_OZ0?uz58ERE6IoHrZ0JZ@jds@^4|U>2hTfUM!%gjmJKg|@ylJ{qB= zgY(w`s6$ydGX;OoUy&QLfh-ZH=|S6kU1BP*t+%86FRXgg?)TOppPGmrv2L6UwcK)e z_#BFxl@b_bQV>7LSAO5^FP4~I<8s^jyQ{=MOw?~629lI~2sxlKN zMs8%gLOcXR!#yDS8!R(C=PV~h*IzhVW#u?zR*096Rn>yNdSsUvN9A$x@`Z85;+^nfVL4F8Cf$n;miSn@;4q6+qw+*dU_UAiziUp3~d zB?ch=aV&9ti+bmbst4qdOV)n^MOqTI+l_Zwu5oXmUD;acZz}NVy;yMFYA!ZOQB+_NHTd8$v3FOjs&4 z<9S5}St1ud5|g_jl>u%0xduk|TwJe9#W1Vos=-n({uiE%TA8u=Pv}A!xF!0h zp7i4Hga#Z|Fe}Y@tCciJ3yqR zh0VRiu6gAM5K3Z1OAQT{&Mz&qzHCk^?>e9x3IH7<2Ggv1S)Hoc?|5K!;X%U$+V6#iPOA-fa=Zu|N7quT@aZSy~kf4a1xYfJ0VU<;K@A z?5Xv~JsorizF1v>-9a(K^Y8EHp0OqX-BeA}u3x1a=@@&Y>3Psv;87)H3lkbg?Bf43 zxg}TX)G#UKA&gQmAhS0}?Mz^kc(`GngKe?Sa%c=T8We4ASC6fl zG<4wc5Wppn2XGkL$0wctj{0IK{BeAs$@x3^#sH@*!lL+XI`-b2b4{*2Ik@|uTM*Lt zF@{f%p8;bL{-O=Jfv1epQ^E}kwkmVa}ifL1eFsQN3%LY@FELg>WIYauJY*?P>H(w|S`)&o>8 z(lZTy|D6pL`tYC3bejgL>2eo3?6|fM47M2}OM$u9Cb+kJQ;=%+*7H8#8y1!-ClBAD z87kEu$BVupMY=n5S_{Dwrl**6(qhMNWP|SjcN~h$zwo+B<f(@}{T9V}r zQ?!z=W*uBmy{%H_H~epGyCAZ!+JS&&U~4I(<7)+)uNm`8j5?MJj|I7iNC# z0hAyZ{Yy&$ZvYJbU_<~MWI(lyH4oPiG2-uuiFhShyxh=W5~3MtHYqDlBN+T;7>mtj zyDj4c5X;CEQdu`4!j`U}k;?S<5mM}U^^EhA(q>kx-PT5)`=>?wnJNM}!i+Kyot;lv zJi&zs?aud8_X&Rzp8yZVP%}Ju$?`n}6;i^QQG*9_cjj|^l*S#c-nNuLlL9NI)Ul`M z7)#c$DgV5z343Pht4)=bunzX`%fUa6NTXjKx}CMMvnz2Vf(Gi5AtPBHYK)-U-M7{T zv4hz&2(d!H*=jokS8XaRLXeuh5JqZZl_zv>Xf5Sgbrhs5g8ALEGE9lpg(T6*1TX5H#9bSTW@UiU?R?Q)W^S_M^%4I zvvGESObf#j7Kx3Eet%jWA_;xw5RX+Ua-BH>Nmj8ll?CwpU ze=&P&XzYe~5gLP2kO2?0%6a(6_A?yDA*0py?M<^Mv*8D=zpB&h}fF0HI7r1UX zqfh_HyNNkbyO6VFUqziS*|ecUE`FD$1D$R;M1v}hwX~G+hBt*OSzOR)arW+MO?BAk z{(zdvy#!u(e++_CR8^xa^JPRK1ONU#h9H&^)920gzDJPnwJyN-_PTI$uu4y7)BOgX z;II5`j=ae%wxt>}i&&*rRsb_(9q zDoYH+McC#OSVJ`9Lr;q0di&$_b3h-X61Tx58A4STn)coWv-gyg2oQyn**`~;c;Wm4 z>K^u2pwT_9W`t89^pXcQdA%w>xBX8GoK$$p=DKNOT^X za*8(Z6w0%kIun{f=!->a=Q#@Kc34;0sf{GX)_y0s!4FB{$itaC@HQi!^YGQKXaAj& zF}i4*F}{_o>M6A6{V)i#Xltg0vqcE@>=J94N2~ZL-$mC@<_xRDr7&jwWNY^dJc9ID z?7^mBZjhGpk3mUn*Fo_7eTR|B=w220Of*_vO=Q&x`jq`SqmX#Vu5{=Jonw+ zlvO$nT1;FJVM^o-RJio=S|tYCHsZk-nuvu|^OTe{2%$jVBhQ_bS8_+1hN~%+Os@A2YSHc?V0EY6<=wjP0C5U6%89$iSY<} z_Cg9=b-@y5)T3t^mx4h%WZdlRD3xn{p4AdaeCD%XKW1Y1>rK${56~0!tf4aYA%*_xz-;h`2=5ulPW@->YwQ+dT}77(kZ(KwN)AdEqt ztLrjHL(PU)o;=mrK5MCt1c{doi(#@3M+rOS;`JH&V`7?NbE_0xOX z=d&g?jHV{=-Z4qBlUYkt`cn15yG*b;1!{hl$!KvwhV#!U28aL1TwAl~9@YJ4$?(o{ zh}3@IP)h9MMO>sdU-6Fl^v>%JP}A`@Kb1idnMz(gaY=D|DEYB+#58Sl6J&PP?eBhc zM0jc<;*&R2#C*?U?LrYdf(&ZD>(s%oBSUP|Xk*I(^3Y5*Td98I= z8&0nFf?{2rA80K;*v7%X+&09e5*HTx#v-*DrZ37|SIX{uUIk z^vhdnvA9aZ-nJ@k(?lq-ua8+A{(!3AWZfzJY5&#SAqjm$O<3+T0Faaz2u}`e6gD29 z>ArFPZ(qiYUFKlxd?d78==T~?u4 z&|S21MvkynTqBb&j>J@SK{cW9jIo~ObH;c8nZX=b9}t22KYw88C>`o0%Cg(mIv5(vJ+k46Ph%RnT&XXMNNW7YneP)XnlmdE1ZN z*Pa+eq^Ad|z6ZhmD+xuI-Z4|(F?M{2xZu&{3b(gGB?!Cfl6R>fNCmsJySqO|@UDL> z@&96Vp{^gigK9|57@Kv?yCQ()oK@(@A0=M+dM14596EG;C~rImYKy4P60mg-xCV_M zCFaThfuZ)y@%EMoC$MsA)}b4uA(D}(p%BSXsu#iajwUCE_x*9zd-KQUkk9hs5-RB) zx&gSkO=qt4k)>_XU7WVu8gr};#UaaVMll#|9q|#{OFJar29ipX`xd10zq-Suw^9* zt|4-ivgL}@$d1g^Lk)(FLu1UbUb;Z&x$a>V zk10(RiJg1M^!akr%@J_}#bSH6N|lCHWDMREogWEiZg=64_^Tu~Ilc;6Dd{oUB)*c3 z&PdE-V+)v>nZ?1ZhiI2}WMumf38e9J1wJcC{-d6S)A7@yt#^0GoQTKQ#xzZMG3m&xB{psYOS1W2 z)sR_7>LpEfg{7<0u(}!EUTdB-7>*;=>uwcxbO#8qDVXbF12q@fx&F|9yhN2+5$IpY zKyCCCufD(&7~X!I+3`Gx%%0VrRj$#$v$&5zij9MV!*%V=Db14k_Vu7nsBsHNgz-V# zieH_ApeA%81y&f5{#yNmtWA~6Fg)mN-br$74)$j`Jt`wkY;SkZr{BMv6Bx&m#yM}g zzLn}lX#f7)qbLY)8nNrDvv{-SmJ!x{Urg8NVpA#gS+TA6A1(4vlDUO$@}X!H%&5-R z_Mb-fT~0qy-8}f>au2ie@JvEdGB!G{IjPKTG+gL74K`-!?lZW{yKG$-uX;+=`VZo5pjQ(1LSHvoUaycRCv z2%yIV%goLB}9AiV15=?n3pwl%8JD3;Dz{;P(#ZivynBlZ1>HhH@ z6R-7E(^9Ljq^6ogCE)p1cN@{%fC(*)px%dRl8qQMCl#2_%KJEH`Hoat$>zqkqjub& z7;nJ)W)T+3;x&t()24WHMTXr0#tPLIg#A}DE|Huz9v@d?|x_@AfO3;E!Zw& zTJOC}r==4K1{xWFjA?NRz~!%iTnhyvgewFy`W;L7(JLLbwW2EE9>MpLPmgm7f*sEf zbbO-}EhUtGZT|30Y~%(6$_R&Vne6h%qj^h9)jS$u9RGn3(%rcqHX}o3QmEd7L&>cg zz8XC42f_O`*Dam8K#kBxj|8{`9{sT?Wys)!9hx`cP9I}ht*f7R>*qbQI!f6XP!?|X zSDK*hyMMm#IL{N#KpuA!gapqY`>&RUG<+U$U)8iv%sQ=BH!H3QX1`aNPbertHBO7c z@t-zwtEmyB!BU;yDjp}5nmR-(%`|4~CdTua#LUuwW?bqXa>cs~!;Ob4DyD=d!kibd zfYm+!M+7=q3C7vPu}5=7d-n)fgPFNVu=F^+DILKek+QGDq-XB z+*=Tro|7!S8!+{fFoq|U-7n=}GvM{>>&3K;5HIx!Zn&tLn#@g7k_aE2;QNyM)Xce) zQc6qK22b=52n2<!8wdu-%4d_vaG zEH4X-B}kt>Ot^`0{2SE94Ik0d!|5zcqNAa@gghe1^1ChNr7Rf}t9I|ZPIS}7dp>Yan=sP?2_eYbZwjqsP=-nN7oZi~{~yFG)da5ZDK zCpvNQ5%g@%sW1`P`2jd%J`92B{A*P2)k5v~w3n6(wR(Zx+}t!>-=+Dh@jO5RPE)EM zG*S%k7=i4yXvuTu37G8$B9NGcmsv49T>!Fy3%z0apO!%aEbZ0CS)m#VV#eCF zh^YnTF-jkk4X-UPMw3*IeY-`!KEEeAvdT$16V`{Fu08y4V~MDdcBe2B;g0HLKBc}t zrAG$ApCf~2T7H=B5EVS1D9?0?<}E5Qu$;*uYi?WM-(qR8)J<^hW%^MH;DGoNj@5Y( zd}mu-T&!aeyI~%Z&R5)b)?k6?xOTnjesDxf2s7LhiYkzgGhLL4#ow*i&9I<;O-C!V zLySLjb+{lzZ6G1a@)DX~Tj28_5vjoQCP*t_`hv21eV6b#XdHZBLJa;Vh^Wo8WONT+ zFzhSEFw`W?R5)5q0L>`^Li`7tBt#-%A=4CG2^P|R%ArGV1S{giuTuOnqiEyD=`-cw;@X-Wu^^eVadUik=Iuri}5Gzfx^VWM9P{;2XQ>HLuL1Zm| z#+QmRcQ??`vD1>En;$ky#%3VM4;G8hP||jJO5mLfZaOe7A$|4iZF>Igof>AVP%j!N zA3Hs=Y6Xq!vwwk50bD2kR)-5F^Ydn;n2hN4JK-~4j3_Y%cm#(wmq=i&k@{)Nya)d#rR207 zRX_(8TM(cm8aQARQ@lZn&8Mem?pPc#)w7a5|B2E7(1#tooo1gjyzYrquB&g|^*TQ} z+*mCjhtAX;P7VSjvWo4zn{cV4k=kEjKR`c&)8jSB{V3@8nvpnwP!xdp`+Ya1yB+vvJL2hF;eGy|E zNHGCo59xv2B*#v_A+4;lpOsUwGXc??%yflMFq0Y~OzG*nnQ76p3lTdQ78XJ%CK^Xt z4?drnbzRI!!PrxkeNteChc@1sL4~Kyte|RQZ3l)@;_d-bhplT`24Jr&29{UBDUq$M zSNuOL=IqSWZOu_q;=C&5si3rczd-f~NBRMhM`u&SJ&P7hN{= z6`?UqRaN!If02Dg2Y&j~=rW8jgc- zwQ;uZC#=}O2%?Ij3aqCc2xfCLn%7+77L%pGx{1k|H#dKJNf2iG8so$%Eo}kMW?X6glCKQJzyHcHub6gwdcW6M}?<6v=et&#li^g^Uq8 zbWF%MJ#re5^cPRO*nX7Bpo@G+zCKTQu92LBB>D8lcPlAmdTtJGc^^sf6V1V1>VzpT zFIP~;u{bz))?{W=ULZC%HrK2nvfX|XGz(w9ay|P=P6H%1+LMLQzpNC#K2;D#Hh946 z+>gUTu@Afz_@S|=U7%?LWTnP}(ba2ZB_@HHm}EZgt5enhceTDguYSB?_}}@gr3S+1 zw>!*cy(b!I(7>dvqf1MFyr8UPgGb6lXAL!YRm1q05ata-YX1v{oSxmj><+shcpLf{ zf_!8flh@tO^ldgG7C^(cr8(s2#&Bp^y#Glh8@Y|sBe z>;dvC5K)rNo~6NypX#$RwG&~bXUz}`cRziZYhBu+>=xD2(=(&R;}&(UTEuMz&>WZF zCFg!{)z-E%abJl?o|6Y1Cc6`#jac15a%aBe&eY{0{?^~0e~WK~d($#wxu_Cj@qnL}n*Nh&6=c}|0np9O AuK)l5 From e32d1612d9d71e72a05ed3ae7c2b7c44f11ca1f9 Mon Sep 17 00:00:00 2001 From: Madmadness65 Date: Sat, 14 Sep 2024 21:08:38 -0500 Subject: [PATCH 17/17] Resize Sun & Moon Flute item sprites They will no longer appear weirdly offset on the reward selection screen. --- public/images/items.json | 18 +++++++++--------- public/images/items/moon_flute.png | Bin 555 -> 336 bytes public/images/items/sun_flute.png | Bin 582 -> 347 bytes 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/public/images/items.json b/public/images/items.json index 509b4458a9f..779823d1293 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4592,12 +4592,12 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 24, - "h": 24 + "w": 32, + "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 1, + "x": 5, + "y": 5, "w": 22, "h": 22 }, @@ -4886,12 +4886,12 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 24, - "h": 24 + "w": 32, + "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 1, + "x": 5, + "y": 5, "w": 22, "h": 22 }, @@ -8415,6 +8415,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d7c7ecb91ab6604d8ab2ddb533b23145:a897bbf637b19b6d2a3b966b9c84e765:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:934ea4080bad980d4fea720cc771f133:ed564bc47b79b15a763de57045178e88:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items/moon_flute.png b/public/images/items/moon_flute.png index 4237a9b29adbe7adf206fa1cab2104f4a55d99f5..893cb6a75796b92a2a6aa9429e199a4afbda4736 100644 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijS1AIbU4Gj(7z590b=)EOJzkPdF9TYStsClnfRPmH0N3**30#(h(xePLz zyCldj_&*#lc=c1AO)L!_0&+KEA{BJm|4Ju)kI-GsapjrHhxd;fneIO0 z+RxAaX7XXBki&L15?8Kv^_hp{3|Lh%M&)oD4-R~-ybh2zy9;_5^FtqcZrW_V$ SIHLsUSO!m5KbLh*2~7Y2S%;ti literal 555 zcmV+`0@VG9P)pFAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-u}MThRCwCdmLX5WP!xr~M=JOU%uzX9=Ll}{$$}!d;riU_7UbOOTE`rjTjd;e z%iQL8^5NE>P*=p(hC*2vRs=U`(&W9IlXLGqrxkgg^OtqTAD30U^m;vj&vL{m!0Yw8 zN&w`quS>K}F($%z&5B;M(I>NInw?6Z<6z z(2A0;TT~%wLrLA5wyNYOAGD^#I&daT?B@X!GMxc%-d!;am&FPnGqg?t2*Y_}%ML0ifW}dTlrHzuLF<%p6fyEV zg2c2Fc9)JU!HXJ45kTYMk0QA0oLAIrb;8K=$n>IdyAHN!W40_7F#vCl8#F+t+ebf*ZA3qXG9 z$OPFK#~C>GuRoch<|)sV tx-G#?>{lFa(N2kdTljIv|MsuqV*px@<{k~r6czvg002ovPDHLkV1hC*`4j*E diff --git a/public/images/items/sun_flute.png b/public/images/items/sun_flute.png index b7cbcdf5569e04fed086f61bb561ea7c6ea104e6..7010c9fefbd98c22b1d7b641db3e292afc03717f 100644 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCijS1AIbU4Gj&yy<78tOVHV7!z@e7vq_q3ij%%w&1w$v`oAR!s7hpw&N?8) zT@vIM{2vY&y!;tI0fjjWJR*x382Ao>Fr%o3R|8ORji-xah=u>vN!~(76gXTQC-#50 z|1crM$07NwRnC!bp^Iak{s+%zVlaE5$~^6tAI}1Xt>H-wcg*CRnQv9xxpeMv;2q}- z)h31*mrAuqax(&6i+J2(hi8b{VQ@IN&6*l}L{Kz&@Cc*0tK chQ0q8{w`9UqhxT19q4WbPgg&ebxsLQ0Oj_A_W%F@ literal 582 zcmV-M0=fN(P)pFAY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-%t=H+RCwCdmLYW7P!xv0*E5kg<`UP)$oJfs0@*omJyV>zNpKm8#kFz{D(i|{ zTvJuz@?>P@z^#tBR0KE#80ly#cGWxQo^${F_ul`%5qX~To^i%I$A|SpDFv`iN4%wQ z9LIYM@}~!nc;qndunSgCi_F;_%jPAMz+f!1T0lww_m2&d!I0};eN@M-g~>L6@I%cc zY1GPOcZ)=nWwkOnw5DYyj#V%@5#(<=*f25E1=nLqpl!Ui{AZA3LKA+dxqoahxYG2; zJ(6^>%_Ofw$-)mc?WPO!5ZAE?v`xo(J)0_k{OQ4?+X6Gqxab+UjzxcTzRTuxFEVEV zvDU;|7a-mR!EFXW`YhknqQW|~MoEd1l6V@yJS0gM%;$gTww^0loK=1Oq3Dm!vF(p6 z9SbFod)HBbAGZrgv;BnK=6lcLX85~OCt`hYR(8GDrg*e!4WK%oR-VPCO+P)GW%Ckq zc1NsJuBJuZLw0>ImW~0AQ7RtJ5~k^#jTpDQYj=Gsb@2IX#3V3?wdR|j&}~7KW$S|^ z{7?fh_;OR|<%E+dqAWv6NxSKyhI%irhUupG3Q)Xu2BmpaoYGQ$Jp=LI|5dyU0HuxT UXL3}E?f?J)07*qoM6N<$f