From 7b7edbb474ef36505bb6229aaa0eead31efda019 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Fri, 25 Jul 2025 16:22:52 -0700 Subject: [PATCH 001/106] [Test] `MoveHelper#changeMoveset` disables moveset overrides (#5915) Also fix Assist tests and add `expect` for max moveset length --- test/moves/assist.test.ts | 5 ++--- test/test-utils/helpers/move-helper.ts | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/test/moves/assist.test.ts b/test/moves/assist.test.ts index 08112d911b1..52467c2ba98 100644 --- a/test/moves/assist.test.ts +++ b/test/moves/assist.test.ts @@ -86,12 +86,11 @@ describe("Moves - Assist", () => { }); it("should apply secondary effects of a move", async () => { - game.override.moveset([MoveId.ASSIST, MoveId.WOOD_HAMMER, MoveId.WOOD_HAMMER, MoveId.WOOD_HAMMER]); await game.classicMode.startBattle([SpeciesId.FEEBAS, SpeciesId.SHUCKLE]); const [feebas, shuckle] = game.scene.getPlayerField(); - game.move.changeMoveset(feebas, [MoveId.ASSIST, MoveId.SKETCH, MoveId.PROTECT, MoveId.DRAGON_TAIL]); - game.move.changeMoveset(shuckle, [MoveId.ASSIST, MoveId.SKETCH, MoveId.PROTECT, MoveId.DRAGON_TAIL]); + game.move.changeMoveset(feebas, [MoveId.ASSIST, MoveId.WOOD_HAMMER]); + game.move.changeMoveset(shuckle, [MoveId.ASSIST, MoveId.WOOD_HAMMER]); game.move.select(MoveId.ASSIST, 0); game.move.select(MoveId.ASSIST, 1); diff --git a/test/test-utils/helpers/move-helper.ts b/test/test-utils/helpers/move-helper.ts index fd6a123a5bb..4fa14b573ab 100644 --- a/test/test-utils/helpers/move-helper.ts +++ b/test/test-utils/helpers/move-helper.ts @@ -209,12 +209,27 @@ export class MoveHelper extends GameManagerHelper { /** * Changes a pokemon's moveset to the given move(s). + * * Used when the normal moveset override can't be used (such as when it's necessary to check or update properties of the moveset). + * + * **Note**: Will disable the moveset override matching the pokemon's party. * @param pokemon - The {@linkcode Pokemon} being modified * @param moveset - The {@linkcode MoveId} (single or array) to change the Pokemon's moveset to. */ public changeMoveset(pokemon: Pokemon, moveset: MoveId | MoveId[]): void { + if (pokemon.isPlayer()) { + if (coerceArray(Overrides.MOVESET_OVERRIDE).length > 0) { + vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue([]); + console.warn("Player moveset override disabled due to use of `game.move.changeMoveset`!"); + } + } else { + if (coerceArray(Overrides.OPP_MOVESET_OVERRIDE).length > 0) { + vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue([]); + console.warn("Enemy moveset override disabled due to use of `game.move.changeMoveset`!"); + } + } moveset = coerceArray(moveset); + expect(moveset.length, "Cannot assign more than 4 moves to a moveset!").toBeLessThanOrEqual(4); pokemon.moveset = []; moveset.forEach(move => { pokemon.moveset.push(new PokemonMove(move)); From ab394db9cf57455b1034694cb285bf80dbce3900 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Fri, 25 Jul 2025 19:39:25 -0400 Subject: [PATCH 002/106] [Refactor] Minor cleanup of `initExpKeys` (#6127) --- src/battle-scene.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 62351c4a833..4c846a019a1 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -699,16 +699,16 @@ export class BattleScene extends SceneBase { if (expSpriteKeys.size > 0) { return; } - this.cachedFetch("./exp-sprites.json") - .then(res => res.json()) - .then(keys => { - if (Array.isArray(keys)) { - for (const key of keys) { - expSpriteKeys.add(key); - } - } - Promise.resolve(); - }); + const res = await this.cachedFetch("./exp-sprites.json"); + const keys = await res.json(); + if (!Array.isArray(keys)) { + throw new Error("EXP Sprites were not array when fetched!"); + } + + // TODO: Optimize this + for (const k of keys) { + expSpriteKeys.add(k); + } } /** From 2e3a7d47e0a5f17c303fd762c7740a589e8fac17 Mon Sep 17 00:00:00 2001 From: Acelynn Zhang <102631387+acelynnzhang@users.noreply.github.com> Date: Fri, 25 Jul 2025 19:55:13 -0400 Subject: [PATCH 003/106] [Bug] Fix Thrash continuing on caught Pokemon (#6144) Fix Thrash continuing on caught Pokemon --- src/phases/attempt-capture-phase.ts | 1 + test/phases/capture-phase.test.ts | 37 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 test/phases/capture-phase.test.ts diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index 604d4fd8384..fcddd23dd20 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -279,6 +279,7 @@ export class AttemptCapturePhase extends PokemonPhase { globalScene.updateModifiers(true); removePokemon(); if (newPokemon) { + newPokemon.leaveField(true, true, false); newPokemon.loadAssets().then(end); } else { end(); diff --git a/test/phases/capture-phase.test.ts b/test/phases/capture-phase.test.ts new file mode 100644 index 00000000000..45a915ebb55 --- /dev/null +++ b/test/phases/capture-phase.test.ts @@ -0,0 +1,37 @@ +import { AbilityId } from "#enums/ability-id"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it } from "vitest"; + +describe("Capture Phase", () => { + 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 + .ability(AbilityId.BALL_FETCH) + .battleStyle("single") + .criticalHits(false) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH) + .startingLevel(100) + .enemyLevel(100); + }); + + // TODO: write test and enable once the phase's logic has been refactored + it.todo("should reset the captured Pokemon's temporary data"); +}); From 556d588d67618d87d755d081d718cc4e90ef3173 Mon Sep 17 00:00:00 2001 From: damocleas Date: Fri, 25 Jul 2025 21:20:48 -0400 Subject: [PATCH 004/106] [UI/UX] Replace 'Neutral' in the Arena Flyout with 'Field' (#6139) Update arena-flyout.ts for Field > Neutral --- src/ui/arena-flyout.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 43cc553d936..970c65c8978 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -86,14 +86,14 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { private flyoutTextHeaderPlayer: Phaser.GameObjects.Text; /** The {@linkcode Phaser.GameObjects.Text} header used to indicate the enemy's effects */ private flyoutTextHeaderEnemy: Phaser.GameObjects.Text; - /** The {@linkcode Phaser.GameObjects.Text} header used to indicate neutral effects */ + /** The {@linkcode Phaser.GameObjects.Text} header used to indicate field effects */ private flyoutTextHeaderField: Phaser.GameObjects.Text; /** The {@linkcode Phaser.GameObjects.Text} used to indicate the player's effects */ private flyoutTextPlayer: Phaser.GameObjects.Text; /** The {@linkcode Phaser.GameObjects.Text} used to indicate the enemy's effects */ private flyoutTextEnemy: Phaser.GameObjects.Text; - /** The {@linkcode Phaser.GameObjects.Text} used to indicate neutral effects */ + /** The {@linkcode Phaser.GameObjects.Text} used to indicate field effects */ private flyoutTextField: Phaser.GameObjects.Text; /** Container for all field effects observed by this object */ @@ -163,7 +163,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.flyoutTextHeaderField = addTextObject( this.flyoutWidth / 2, 5, - i18next.t("arenaFlyout:neutral"), + i18next.t("arenaFlyout:field"), TextStyle.SUMMARY_GREEN, ); this.flyoutTextHeaderField.setFontSize(54); From bb46ba9f6049c2c6a5f3e56807dfeb0e8f21afb4 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sat, 26 Jul 2025 00:58:15 -0400 Subject: [PATCH 005/106] [Dev] Added typedoc deployments for Beta (#6147) --- .github/workflows/github-pages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index fff90047df2..1588a15afeb 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - beta pull_request: branches: - main From 4f259e2c2f4870a2962fe4608c19d6a521236183 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 25 Jul 2025 23:30:58 -0600 Subject: [PATCH 006/106] [Misc] Fix import in decrypt-save.js (#6149) --- scripts/decrypt-save.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/decrypt-save.js b/scripts/decrypt-save.js index 219cdb47bed..e50f152f159 100644 --- a/scripts/decrypt-save.js +++ b/scripts/decrypt-save.js @@ -2,7 +2,9 @@ // biome-ignore lint/performance/noNamespaceImport: This is how you import fs from node import * as fs from "node:fs"; -import { AES, enc } from "crypto-js"; +import crypto_js from "crypto-js"; + +const { AES, enc } = crypto_js; const SAVE_KEY = "x0i2O7WRiANTqPmZ"; @@ -144,7 +146,7 @@ function main() { process.exit(0); } - writeToFile(destPath, decrypt); + writeToFile(args[1], decrypt); } main(); From 0ef1a34030289b44b8fe1d705769c9f203756ecf Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 26 Jul 2025 16:07:16 -0600 Subject: [PATCH 007/106] [Refactor][Bug] Illusion no longer overwrites data of original Pokemon https://github.com/pagefaultgames/pokerogue/pull/6140 --- src/@types/illusion-data.ts | 26 ++-- src/data/abilities/ability.ts | 10 +- src/field/pokemon.ts | 251 ++++++++++++++++---------------- src/phases/evolution-phase.ts | 2 +- src/system/pokemon-data.ts | 10 +- src/ui/party-ui-handler.ts | 13 +- src/ui/summary-ui-handler.ts | 23 +-- test/abilities/illusion.test.ts | 4 +- 8 files changed, 164 insertions(+), 175 deletions(-) diff --git a/src/@types/illusion-data.ts b/src/@types/illusion-data.ts index 854c98c8cc9..b152e3fdf59 100644 --- a/src/@types/illusion-data.ts +++ b/src/@types/illusion-data.ts @@ -8,20 +8,14 @@ import type { Variant } from "#sprites/variant"; * Data pertaining to a Pokemon's Illusion. */ export interface IllusionData { - basePokemon: { - /** The actual name of the Pokemon */ - name: string; - /** The actual nickname of the Pokemon */ - nickname: string; - /** Whether the base pokemon is shiny or not */ - shiny: boolean; - /** The shiny variant of the base pokemon */ - variant: Variant; - /** Whether the fusion species of the base pokemon is shiny or not */ - fusionShiny: boolean; - /** The variant of the fusion species of the base pokemon */ - fusionVariant: Variant; - }; + /** The name of pokemon featured in the illusion */ + name: string; + /** The nickname of the pokemon featured in the illusion */ + nickname: string; + /** Whether the pokemon featured in the illusion is shiny or not */ + shiny: boolean; + /** The variant of the pokemon featured in the illusion */ + variant: Variant; /** The species of the illusion */ species: SpeciesId; /** The formIndex of the illusion */ @@ -34,6 +28,10 @@ export interface IllusionData { fusionSpecies?: PokemonSpecies; /** The fusionFormIndex of the illusion */ fusionFormIndex?: number; + /** Whether the fusion species of the pokemon featured in the illusion is shiny or not */ + fusionShiny?: boolean; + /** The variant of the fusion species of the pokemon featured in the illusion */ + fusionVariant?: Variant; /** The fusionGender of the illusion if it's a fusion */ fusionGender?: Gender; /** The level of the illusion (not used currently) */ diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index 62d6974d3a2..0ee1a51a78e 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -15,6 +15,7 @@ import { SpeciesFormChangeAbilityTrigger, SpeciesFormChangeWeatherTrigger } from import { Gender } from "#data/gender"; import { getPokeballName } from "#data/pokeball"; import { pokemonFormChanges } from "#data/pokemon-forms"; +import type { PokemonSpecies } from "#data/pokemon-species"; import { getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffectHealText } from "#data/status-effect"; import { TerrainType } from "#data/terrain"; import type { Weather } from "#data/weather"; @@ -6001,8 +6002,13 @@ export class IllusionPreSummonAbAttr extends PreSummonAbAttr { const party: Pokemon[] = (pokemon.isPlayer() ? globalScene.getPlayerParty() : globalScene.getEnemyParty()).filter( p => p.isAllowedInBattle(), ); - const lastPokemon: Pokemon = party.filter(p => p !== pokemon).at(-1) || pokemon; - pokemon.setIllusion(lastPokemon); + let illusionPokemon: Pokemon | PokemonSpecies; + if (pokemon.hasTrainer()) { + illusionPokemon = party.filter(p => p !== pokemon).at(-1) || pokemon; + } else { + illusionPokemon = globalScene.arena.randomSpecies(globalScene.currentBattle.waveIndex, pokemon.level); + } + pokemon.setIllusion(illusionPokemon); } /** @returns Whether the illusion can be applied. */ diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 32edd721cd9..70bc98cb02e 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -442,10 +442,9 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @returns The name to render for this {@linkcode Pokemon}. */ getNameToRender(useIllusion = true) { - const name: string = - !useIllusion && this.summonData.illusion ? this.summonData.illusion.basePokemon.name : this.name; - const nickname: string = - !useIllusion && this.summonData.illusion ? this.summonData.illusion.basePokemon.nickname : this.nickname; + const illusion = this.summonData.illusion; + const name = useIllusion ? (illusion?.name ?? this.name) : this.name; + const nickname: string = useIllusion ? (illusion?.nickname ?? this.nickname) : this.nickname; try { if (nickname) { return decodeURIComponent(escape(atob(nickname))); // TODO: Remove `atob` and `escape`... eventually... @@ -463,7 +462,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @returns The {@linkcode PokeballType} that will be shown when this Pokemon is sent out into battle. */ getPokeball(useIllusion = false): PokeballType { - return useIllusion && this.summonData.illusion ? this.summonData.illusion.pokeball : this.pokeball; + return useIllusion ? (this.summonData.illusion?.pokeball ?? this.pokeball) : this.pokeball; } init(): void { @@ -609,24 +608,33 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Generate an illusion of the last pokemon in the party, as other wild pokemon in the area. + * Set this pokemon's illusion to the data of the given pokemon. + * + * @remarks + * When setting the illusion of a wild pokemon, a {@linkcode PokemonSpecies} is generally passed. + * When setting the illusion of a pokemon in this way, the fields required by illusion data + * but missing from `PokemonSpecies` are set as follows + * - `pokeball` and `nickname` are both inherited from this pokemon + * - `shiny` will always be set if this pokemon OR its fusion is shiny + * - `variant` will always be 0 + * - Fields related to fusion will be set to `undefined` or `0` as appropriate + * - The gender is set to be the same as this pokemon, if it is compatible with the provided pokemon. + * - If the provided pokemon can only ever exist as one gender, it is always that gender + * - If this pokemon is genderless but the provided pokemon isn't, then a gender roll is done based on this + * pokemon's ID */ - setIllusion(pokemon: Pokemon): boolean { - if (this.summonData.illusion) { - this.breakIllusion(); - } - if (this.hasTrainer()) { + setIllusion(pokemon: Pokemon | PokemonSpecies): boolean { + this.breakIllusion(); + if (pokemon instanceof Pokemon) { const speciesId = pokemon.species.speciesId; this.summonData.illusion = { - basePokemon: { - name: this.name, - nickname: this.nickname, - shiny: this.shiny, - variant: this.variant, - fusionShiny: this.fusionShiny, - fusionVariant: this.fusionVariant, - }, + name: pokemon.name, + nickname: pokemon.nickname, + shiny: pokemon.shiny, + variant: pokemon.variant, + fusionShiny: pokemon.fusionShiny, + fusionVariant: pokemon.fusionVariant, species: speciesId, formIndex: pokemon.formIndex, gender: pokemon.gender, @@ -636,54 +644,61 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { fusionGender: pokemon.fusionGender, }; - this.name = pokemon.name; - this.nickname = pokemon.nickname; - this.shiny = pokemon.shiny; - this.variant = pokemon.variant; - this.fusionVariant = pokemon.fusionVariant; - this.fusionShiny = pokemon.fusionShiny; - if (this.shiny) { + if (pokemon.shiny || pokemon.fusionShiny) { this.initShinySparkle(); } - this.loadAssets(false, true).then(() => this.playAnim()); - this.updateInfo(); } else { - const randomIllusion: PokemonSpecies = globalScene.arena.randomSpecies( - globalScene.currentBattle.waveIndex, - this.level, - ); - + // Correct the gender in case the illusioned species has a gender incompatible with this pokemon + let gender = this.gender; + switch (pokemon.malePercent) { + case null: + gender = Gender.GENDERLESS; + break; + case 0: + gender = Gender.FEMALE; + break; + case 100: + gender = Gender.MALE; + break; + default: + gender = (this.id % 256) * 0.390625 < pokemon.malePercent ? Gender.MALE : Gender.FEMALE; + } + /* + TODO: Allow setting `variant` to something other than 0, which would require first loading the + assets for the provided species, as its entry would otherwise not + be guaranteed to exist in the `variantData` map. But this would prevent `summonData` from being populated + until the assets are loaded, which would cause issues as this method cannot be easily promisified. + */ this.summonData.illusion = { - basePokemon: { - name: this.name, - nickname: this.nickname, - shiny: this.shiny, - variant: this.variant, - fusionShiny: this.fusionShiny, - fusionVariant: this.fusionVariant, - }, - species: randomIllusion.speciesId, - formIndex: randomIllusion.formIndex, - gender: this.gender, + fusionShiny: false, + fusionVariant: 0, + shiny: this.shiny || this.fusionShiny, + variant: 0, + nickname: this.nickname, + name: pokemon.name, + species: pokemon.speciesId, + formIndex: pokemon.formIndex, + gender, pokeball: this.pokeball, }; - this.name = randomIllusion.name; - this.loadAssets(false, true).then(() => this.playAnim()); + if (this.shiny || this.fusionShiny) { + this.initShinySparkle(); + } } + this.loadAssets(false, true).then(() => this.playAnim()); + this.updateInfo(); return true; } + /** + * Break the illusion of this pokemon, if it has an active illusion. + * @returns Whether an illusion was broken. + */ breakIllusion(): boolean { if (!this.summonData.illusion) { return false; } - this.name = this.summonData.illusion.basePokemon.name; - this.nickname = this.summonData.illusion.basePokemon.nickname; - this.shiny = this.summonData.illusion.basePokemon.shiny; - this.variant = this.summonData.illusion.basePokemon.variant; - this.fusionVariant = this.summonData.illusion.basePokemon.fusionVariant; - this.fusionShiny = this.summonData.illusion.basePokemon.fusionShiny; this.summonData.illusion = null; if (this.isOnField()) { globalScene.playSound("PRSFX- Transform"); @@ -718,8 +733,12 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { // Assets for moves loadPromises.push(loadMoveAnimations(this.getMoveset().map(m => m.getMove().id))); + /** alias for `this.summonData.illusion`; bangs on this are safe when guarded with `useIllusion` being true */ + const illusion = this.summonData.illusion; + useIllusion = useIllusion && !!illusion; + // Load the assets for the species form - const formIndex = useIllusion && this.summonData.illusion ? this.summonData.illusion.formIndex : this.formIndex; + const formIndex = useIllusion ? illusion!.formIndex : this.formIndex; loadPromises.push( this.getSpeciesForm(false, useIllusion).loadAssets( this.getGender(useIllusion) === Gender.FEMALE, @@ -736,16 +755,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { ); } if (this.getFusionSpeciesForm()) { - const fusionFormIndex = - useIllusion && this.summonData.illusion ? this.summonData.illusion.fusionFormIndex : this.fusionFormIndex; - const fusionShiny = - !useIllusion && this.summonData.illusion?.basePokemon - ? this.summonData.illusion.basePokemon.fusionShiny - : this.fusionShiny; - const fusionVariant = - !useIllusion && this.summonData.illusion?.basePokemon - ? this.summonData.illusion.basePokemon.fusionVariant - : this.fusionVariant; + const { fusionFormIndex, fusionShiny, fusionVariant } = useIllusion ? illusion! : this; loadPromises.push( this.getFusionSpeciesForm(false, useIllusion).loadAssets( this.getFusionGender(false, useIllusion) === Gender.FEMALE, @@ -933,8 +943,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { return this.getSpeciesForm(ignoreOverride, false).getSpriteKey( this.getGender(ignoreOverride) === Gender.FEMALE, this.formIndex, - this.summonData.illusion?.basePokemon.shiny ?? this.shiny, - this.summonData.illusion?.basePokemon.variant ?? this.variant, + this.isShiny(false), + this.getVariant(false), ); } @@ -977,11 +987,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } getIconAtlasKey(ignoreOverride = false, useIllusion = true): string { - // TODO: confirm the correct behavior here (is it intentional that the check fails if `illusion.formIndex` is `0`?) - const formIndex = - useIllusion && this.summonData.illusion?.formIndex ? this.summonData.illusion.formIndex : this.formIndex; - const variant = - !useIllusion && this.summonData.illusion ? this.summonData.illusion.basePokemon.variant : this.variant; + const illusion = this.summonData.illusion; + const { formIndex, variant } = useIllusion && illusion ? illusion : this; return this.getSpeciesForm(ignoreOverride, useIllusion).getIconAtlasKey( formIndex, this.isBaseShiny(useIllusion), @@ -990,15 +997,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } getFusionIconAtlasKey(ignoreOverride = false, useIllusion = true): string { - // TODO: confirm the correct behavior here (is it intentional that the check fails if `illusion.fusionFormIndex` is `0`?) - const fusionFormIndex = - useIllusion && this.summonData.illusion?.fusionFormIndex - ? this.summonData.illusion.fusionFormIndex - : this.fusionFormIndex; - const fusionVariant = - !useIllusion && this.summonData.illusion - ? this.summonData.illusion.basePokemon.fusionVariant - : this.fusionVariant; + const illusion = this.summonData.illusion; + const { fusionFormIndex, fusionVariant } = useIllusion && illusion ? illusion : this; return this.getFusionSpeciesForm(ignoreOverride, useIllusion).getIconAtlasKey( fusionFormIndex, this.isFusionShiny(), @@ -1006,11 +1006,9 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { ); } - getIconId(ignoreOverride?: boolean, useIllusion = true): string { - const formIndex = - useIllusion && this.summonData.illusion?.formIndex ? this.summonData.illusion?.formIndex : this.formIndex; - const variant = - !useIllusion && !!this.summonData.illusion ? this.summonData.illusion?.basePokemon.variant : this.variant; + getIconId(ignoreOverride?: boolean, useIllusion = false): string { + const illusion = this.summonData.illusion; + const { formIndex, variant } = useIllusion && illusion ? illusion : this; return this.getSpeciesForm(ignoreOverride, useIllusion).getIconId( this.getGender(ignoreOverride, useIllusion) === Gender.FEMALE, formIndex, @@ -1020,14 +1018,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } getFusionIconId(ignoreOverride?: boolean, useIllusion = true): string { - const fusionFormIndex = - useIllusion && this.summonData.illusion?.fusionFormIndex - ? this.summonData.illusion?.fusionFormIndex - : this.fusionFormIndex; - const fusionVariant = - !useIllusion && !!this.summonData.illusion - ? this.summonData.illusion?.basePokemon.fusionVariant - : this.fusionVariant; + const illusion = this.summonData.illusion; + const { fusionFormIndex, fusionVariant } = useIllusion && illusion ? illusion : this; return this.getFusionSpeciesForm(ignoreOverride, useIllusion).getIconId( this.getFusionGender(ignoreOverride, useIllusion) === Gender.FEMALE, fusionFormIndex, @@ -1702,29 +1694,23 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @returns Whether this Pokemon is shiny */ isShiny(useIllusion = false): boolean { - if (!useIllusion && this.summonData.illusion) { - return ( - this.summonData.illusion.basePokemon?.shiny || - (this.summonData.illusion.fusionSpecies && this.summonData.illusion.basePokemon?.fusionShiny) || - false - ); + if (useIllusion) { + const illusion = this.summonData.illusion; + return illusion?.shiny || (!!illusion?.fusionSpecies && !!illusion.fusionShiny); } return this.shiny || (this.isFusion(useIllusion) && this.fusionShiny); } isBaseShiny(useIllusion = false) { - if (!useIllusion && this.summonData.illusion) { - return !!this.summonData.illusion.basePokemon?.shiny; - } - return this.shiny; + return useIllusion ? (this.summonData.illusion?.shiny ?? this.shiny) : this.shiny; } isFusionShiny(useIllusion = false) { - if (!useIllusion && this.summonData.illusion) { - return !!this.summonData.illusion.basePokemon?.fusionShiny; + if (!this.isFusion(useIllusion)) { + return false; } - return this.isFusion(useIllusion) && this.fusionShiny; + return useIllusion ? (this.summonData.illusion?.fusionShiny ?? this.fusionShiny) : this.fusionShiny; } /** @@ -1733,39 +1719,48 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @returns Whether this pokemon's base and fusion counterparts are both shiny. */ isDoubleShiny(useIllusion = false): boolean { - if (!useIllusion && this.summonData.illusion?.basePokemon) { - return ( - this.isFusion(false) && - this.summonData.illusion.basePokemon.shiny && - this.summonData.illusion.basePokemon.fusionShiny - ); - } - - return this.isFusion(useIllusion) && this.shiny && this.fusionShiny; + return this.isFusion(useIllusion) && this.isBaseShiny(useIllusion) && this.isFusionShiny(useIllusion); } /** * Return this Pokemon's {@linkcode Variant | shiny variant}. + * If a fusion, returns the maximum of the two variants. * Only meaningful if this pokemon is actually shiny. * @param useIllusion - Whether to consider this pokemon's illusion if present; default `false` * @returns The shiny variant of this Pokemon. */ getVariant(useIllusion = false): Variant { - if (!useIllusion && this.summonData.illusion) { - return !this.isFusion(false) - ? this.summonData.illusion.basePokemon!.variant - : (Math.max(this.variant, this.fusionVariant) as Variant); + const illusion = this.summonData.illusion; + const baseVariant = useIllusion ? (illusion?.variant ?? this.variant) : this.variant; + if (!this.isFusion(useIllusion)) { + return baseVariant; } - - return !this.isFusion(true) ? this.variant : (Math.max(this.variant, this.fusionVariant) as Variant); + const fusionVariant = useIllusion ? (illusion?.fusionVariant ?? this.fusionVariant) : this.fusionVariant; + return Math.max(baseVariant, fusionVariant) as Variant; } - // TODO: Clarify how this differs from `getVariant` - getBaseVariant(doubleShiny: boolean): Variant { - if (doubleShiny) { - return this.summonData.illusion?.basePokemon?.variant ?? this.variant; + /** + * Return the base pokemon's variant. Equivalent to {@linkcode getVariant} if this pokemon is not a fusion. + * @returns The shiny variant of this Pokemon's base species. + */ + getBaseVariant(useIllusion = false): Variant { + const illusion = this.summonData.illusion; + return useIllusion && illusion ? (illusion.variant ?? this.variant) : this.variant; + } + + /** + * Return the fused pokemon's variant. + * + * @remarks + * Always returns `0` if the pokemon is not a fusion. + * @returns The shiny variant of this pokemon's fusion species. + */ + getFusionVariant(useIllusion = false): Variant { + if (!this.isFusion(useIllusion)) { + return 0; } - return this.getVariant(); + const illusion = this.summonData.illusion; + return illusion ? (illusion.fusionVariant ?? this.fusionVariant) : this.fusionVariant; } /** @@ -1782,7 +1777,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @returns Whether this Pokemon is currently fused with another species. */ isFusion(useIllusion = false): boolean { - return useIllusion && this.summonData.illusion ? !!this.summonData.illusion.fusionSpecies : !!this.fusionSpecies; + return useIllusion ? !!this.summonData.illusion?.fusionSpecies : !!this.fusionSpecies; } /** @@ -1792,9 +1787,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @see {@linkcode getNameToRender} - gets this Pokemon's display name. */ getName(useIllusion = false): string { - return !useIllusion && this.summonData.illusion?.basePokemon - ? this.summonData.illusion.basePokemon.name - : this.name; + return useIllusion ? (this.summonData.illusion?.name ?? this.name) : this.name; } /** diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index f8bee8371f2..cad79455af3 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -135,7 +135,7 @@ export class EvolutionPhase extends Phase { sprite .setPipelineData("ignoreTimeTint", true) - .setPipelineData("spriteKey", pokemon.getSpriteKey()) + .setPipelineData("spriteKey", spriteKey) .setPipelineData("shiny", pokemon.shiny) .setPipelineData("variant", pokemon.variant); diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 9cea08bfb13..69c1539d944 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -88,12 +88,12 @@ export class PokemonData { this.id = source.id; this.player = sourcePokemon?.isPlayer() ?? source.player; this.species = sourcePokemon?.species.speciesId ?? source.species; - this.nickname = sourcePokemon?.summonData.illusion?.basePokemon.nickname ?? source.nickname; + this.nickname = source.nickname; this.formIndex = Math.max(Math.min(source.formIndex, getPokemonSpecies(this.species).forms.length - 1), 0); this.abilityIndex = source.abilityIndex; this.passive = source.passive; - this.shiny = sourcePokemon?.summonData.illusion?.basePokemon.shiny ?? source.shiny; - this.variant = sourcePokemon?.summonData.illusion?.basePokemon.variant ?? source.variant; + this.shiny = source.shiny; + this.variant = source.variant; this.pokeball = source.pokeball ?? PokeballType.POKEBALL; this.level = source.level; this.exp = source.exp; @@ -134,8 +134,8 @@ export class PokemonData { this.fusionSpecies = sourcePokemon?.fusionSpecies?.speciesId ?? source.fusionSpecies; this.fusionFormIndex = source.fusionFormIndex; this.fusionAbilityIndex = source.fusionAbilityIndex; - this.fusionShiny = sourcePokemon?.summonData.illusion?.basePokemon.fusionShiny ?? source.fusionShiny; - this.fusionVariant = sourcePokemon?.summonData.illusion?.basePokemon.fusionVariant ?? source.fusionVariant; + this.fusionShiny = source.fusionShiny; + this.fusionVariant = source.fusionVariant; this.fusionGender = source.fusionGender; this.fusionLuck = source.fusionLuck ?? (source.fusionShiny ? source.fusionVariant + 1 : 0); this.fusionTeraType = (source.fusionTeraType ?? 0) as PokemonType; diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index ce5f60813c7..956e4c52e39 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1791,17 +1791,16 @@ class PartySlot extends Phaser.GameObjects.Container { const shinyStar = globalScene.add.image(0, 0, `shiny_star_small${doubleShiny ? "_1" : ""}`); shinyStar.setOrigin(0, 0); shinyStar.setPositionRelative(this.slotName, -9, 3); - shinyStar.setTint(getVariantTint(this.pokemon.getBaseVariant(doubleShiny))); + shinyStar.setTint(getVariantTint(this.pokemon.getBaseVariant())); slotInfoContainer.add(shinyStar); if (doubleShiny) { - const fusionShinyStar = globalScene.add.image(0, 0, "shiny_star_small_2"); - fusionShinyStar.setOrigin(0, 0); - fusionShinyStar.setPosition(shinyStar.x, shinyStar.y); - fusionShinyStar.setTint( - getVariantTint(this.pokemon.summonData.illusion?.basePokemon.fusionVariant ?? this.pokemon.fusionVariant), - ); + const fusionShinyStar = globalScene.add + .image(0, 0, "shiny_star_small_2") + .setOrigin(0) + .setPosition(shinyStar.x, shinyStar.y) + .setTint(getVariantTint(this.pokemon.fusionVariant)); slotInfoContainer.add(fusionShinyStar); } diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index b4df4612546..770bb1d9d29 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -354,18 +354,13 @@ export class SummaryUiHandler extends UiHandler { } catch (err: unknown) { console.error(`Failed to play animation for ${spriteKey}`, err); } - this.pokemonSprite.setPipelineData("teraColor", getTypeRgb(this.pokemon.getTeraType())); - this.pokemonSprite.setPipelineData("isTerastallized", this.pokemon.isTerastallized); - this.pokemonSprite.setPipelineData("ignoreTimeTint", true); - this.pokemonSprite.setPipelineData("spriteKey", this.pokemon.getSpriteKey()); - this.pokemonSprite.setPipelineData( - "shiny", - this.pokemon.summonData.illusion?.basePokemon.shiny ?? this.pokemon.shiny, - ); - this.pokemonSprite.setPipelineData( - "variant", - this.pokemon.summonData.illusion?.basePokemon.variant ?? this.pokemon.variant, - ); + this.pokemonSprite + .setPipelineData("teraColor", getTypeRgb(this.pokemon.getTeraType())) + .setPipelineData("isTerastallized", this.pokemon.isTerastallized) + .setPipelineData("ignoreTimeTint", true) + .setPipelineData("spriteKey", this.pokemon.getSpriteKey()) + .setPipelineData("shiny", this.pokemon.shiny) + .setPipelineData("variant", this.pokemon.variant); ["spriteColors", "fusionSpriteColors"].map(k => { delete this.pokemonSprite.pipelineData[`${k}Base`]; if (this.pokemon?.summonData.speciesForm) { @@ -463,9 +458,7 @@ export class SummaryUiHandler extends UiHandler { this.fusionShinyIcon.setPosition(this.shinyIcon.x, this.shinyIcon.y); this.fusionShinyIcon.setVisible(doubleShiny); if (isFusion) { - this.fusionShinyIcon.setTint( - getVariantTint(this.pokemon.summonData.illusion?.basePokemon.fusionVariant ?? this.pokemon.fusionVariant), - ); + this.fusionShinyIcon.setTint(getVariantTint(this.pokemon.fusionVariant)); } this.pokeball.setFrame(getPokeballAtlasKey(this.pokemon.pokeball)); diff --git a/test/abilities/illusion.test.ts b/test/abilities/illusion.test.ts index 17a1fa8dd3d..e48cd9e9b78 100644 --- a/test/abilities/illusion.test.ts +++ b/test/abilities/illusion.test.ts @@ -145,8 +145,8 @@ describe("Abilities - Illusion", () => { const zoroark = game.scene.getPlayerPokemon()!; - expect(zoroark.name).equals("Axew"); - expect(zoroark.getNameToRender()).equals("axew nickname"); + expect(zoroark.summonData.illusion?.name).equals("Axew"); + expect(zoroark.getNameToRender(true)).equals("axew nickname"); expect(zoroark.getGender(false, true)).equals(Gender.FEMALE); expect(zoroark.isShiny(true)).equals(true); expect(zoroark.getPokeball(true)).equals(PokeballType.GREAT_BALL); From 08d721642457d47bf9f4d325b44900caf608ca8c Mon Sep 17 00:00:00 2001 From: SmhMyHead <191356399+SmhMyHead@users.noreply.github.com> Date: Sun, 27 Jul 2025 00:34:21 +0200 Subject: [PATCH 008/106] [UI/UX] Added "Hide Username" Setting (#6105) * [UI/UX] Added "Hide Username" Setting * Mask tid with asterisk instead of hiding completely --------- Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> --- src/battle-scene.ts | 1 + src/system/settings/settings.ts | 11 +++++++++++ src/ui/summary-ui-handler.ts | 22 ++++++++++++++++------ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 4c846a019a1..7e9360270ad 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -236,6 +236,7 @@ export class BattleScene extends SceneBase { public enableTouchControls = false; public enableVibration = false; public showBgmBar = true; + public hideUsername = false; /** Determines the selected battle style. */ public battleStyle: BattleStyle = BattleStyle.SWITCH; /** diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index 19d10baedfd..33087f2509e 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -171,6 +171,7 @@ export const SettingKeys = { UI_Volume: "UI_SOUND_EFFECTS", Battle_Music: "BATTLE_MUSIC", Show_BGM_Bar: "SHOW_BGM_BAR", + Hide_Username: "HIDE_USERNAME", Move_Touch_Controls: "MOVE_TOUCH_CONTROLS", Shop_Overlay_Opacity: "SHOP_OVERLAY_OPACITY", }; @@ -625,6 +626,13 @@ export const Setting: Array = [ default: 1, type: SettingType.DISPLAY, }, + { + key: SettingKeys.Hide_Username, + label: i18next.t("settings:hideUsername"), + options: OFF_ON, + default: 0, + type: SettingType.DISPLAY, + }, { key: SettingKeys.Master_Volume, label: i18next.t("settings:masterVolume"), @@ -792,6 +800,9 @@ export function setSetting(setting: string, value: number): boolean { case SettingKeys.Show_BGM_Bar: globalScene.showBgmBar = Setting[index].options[value].value === "On"; break; + case SettingKeys.Hide_Username: + globalScene.hideUsername = Setting[index].options[value].value === "On"; + break; case SettingKeys.Candy_Upgrade_Notification: if (globalScene.candyUpgradeNotification === value) { break; diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 770bb1d9d29..7661dab068e 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -803,24 +803,34 @@ export class SummaryUiHandler extends UiHandler { case Page.PROFILE: { const profileContainer = globalScene.add.container(0, -pageBg.height); pageContainer.add(profileContainer); + const otColor = + globalScene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE; + const usernameReplacement = + globalScene.gameData.gender === PlayerGender.FEMALE + ? i18next.t("trainerNames:player_f") + : i18next.t("trainerNames:player_m"); // TODO: should add field for original trainer name to Pokemon object, to support gift/traded Pokemon from MEs const trainerText = addBBCodeTextObject( 7, 12, - `${i18next.t("pokemonSummary:ot")}/${getBBCodeFrag(loggedInUser?.username || i18next.t("pokemonSummary:unknown"), globalScene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE)}`, + `${i18next.t("pokemonSummary:ot")}/${getBBCodeFrag( + !globalScene.hideUsername + ? loggedInUser?.username || i18next.t("pokemonSummary:unknown") + : usernameReplacement, + otColor, + )}`, TextStyle.SUMMARY_ALT, - ); - trainerText.setOrigin(0, 0); + ).setOrigin(0); profileContainer.add(trainerText); + const idToDisplay = globalScene.hideUsername ? "*****" : globalScene.gameData.trainerId.toString(); const trainerIdText = addTextObject( 141, 12, - `${i18next.t("pokemonSummary:idNo")}${globalScene.gameData.trainerId.toString()}`, + `${i18next.t("pokemonSummary:idNo")}${idToDisplay}`, TextStyle.SUMMARY_ALT, - ); - trainerIdText.setOrigin(0, 0); + ).setOrigin(0); profileContainer.add(trainerIdText); const typeLabel = addTextObject(7, 28, `${i18next.t("pokemonSummary:type")}/`, TextStyle.WINDOW_ALT); From 30a6f4708105cf025474b6ff2a7215d91352953b Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:23:18 -0700 Subject: [PATCH 009/106] [Dev] Add `dist/` to `ls-lint` ignore list --- .ls-lint.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.ls-lint.yml b/.ls-lint.yml index 09d626af624..610218f8ed2 100644 --- a/.ls-lint.yml +++ b/.ls-lint.yml @@ -25,3 +25,4 @@ ignore: - .github - .git - public + - dist From a117ff9bc843fd2aae63b68f54f626059bec091f Mon Sep 17 00:00:00 2001 From: damocleas Date: Sat, 26 Jul 2025 22:31:55 -0400 Subject: [PATCH 010/106] [i18n] Update Locales --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 362b2c4fcc2..e2fbba17ea7 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 362b2c4fcc20b31a7be6c2dab537055fbaeb247f +Subproject commit e2fbba17ea7a96068970ea98a8a84ed3e25b6f07 From 2f1cf2fc13c9b9108a04c8bcadb9667e8db8c0e6 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 26 Jul 2025 20:35:39 -0600 Subject: [PATCH 011/106] [Beta] [Bug] Fix shiny display issues (#6154) Fix shininess check --- src/field/pokemon.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 70bc98cb02e..32229d80f37 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1694,12 +1694,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @returns Whether this Pokemon is shiny */ isShiny(useIllusion = false): boolean { - if (useIllusion) { - const illusion = this.summonData.illusion; - return illusion?.shiny || (!!illusion?.fusionSpecies && !!illusion.fusionShiny); - } - - return this.shiny || (this.isFusion(useIllusion) && this.fusionShiny); + return this.isBaseShiny(useIllusion) || this.isFusionShiny(useIllusion); } isBaseShiny(useIllusion = false) { From ed8858e07ddb9b23618f52032c3025777d179d77 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sat, 26 Jul 2025 20:58:06 -0600 Subject: [PATCH 012/106] [Bug][Beta] Make bounce delay use fixed int (#6156) Make bounce delay use fixed int --- src/ui/starter-select-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 18a3fbc30a3..fcd8167a519 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1476,7 +1476,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { loop: -1, // Make the initial bounce a little randomly delayed delay: randIntRange(0, 50) * 5, - loopDelay: 1000, + loopDelay: fixedInt(1000), tweens: [ { targets: icon, From 1b8082a177d6cef98a4f9afefbb8d15f3d5859d0 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 27 Jul 2025 11:46:56 -0600 Subject: [PATCH 013/106] [Refactor] Refactor UI text ts (#5946) * Add destroy method to pokemon-sprite-sparkle-handler * Move TextStyle to enums, convert into const object * Cleanup text.ts file * Add necessary explicit types for TextStyle let vars * Fix locales submodule commit * Fix merge issue --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/@types/ui.ts | 10 +++ src/battle-scene.ts | 3 +- .../mystery-encounter-dialogue.ts | 2 +- .../utils/encounter-dialogue-utils.ts | 2 +- src/data/nature.ts | 3 +- src/enums/text-style.ts | 59 +++++++++++++ src/field/damage-number-handler.ts | 3 +- src/field/pokemon-sprite-sparkle-handler.ts | 13 ++- src/modifier/modifier.ts | 3 +- src/phases/end-card-phase.ts | 3 +- src/phases/scan-ivs-phase.ts | 3 +- src/timed-event-manager.ts | 3 +- src/ui/ability-bar.ts | 3 +- src/ui/abstact-option-select-ui-handler.ts | 3 +- src/ui/achv-bar.ts | 3 +- src/ui/achvs-ui-handler.ts | 3 +- src/ui/admin-ui-handler.ts | 2 +- src/ui/arena-flyout.ts | 3 +- src/ui/ball-ui-handler.ts | 3 +- src/ui/base-stats-overlay.ts | 3 +- src/ui/battle-flyout.ts | 3 +- src/ui/battle-info/battle-info.ts | 3 +- src/ui/battle-info/enemy-battle-info.ts | 3 +- src/ui/battle-message-ui-handler.ts | 3 +- src/ui/bgm-bar.ts | 3 +- src/ui/candy-bar.ts | 3 +- src/ui/challenges-select-ui-handler.ts | 3 +- src/ui/command-ui-handler.ts | 3 +- src/ui/daily-run-scoreboard.ts | 3 +- src/ui/dropdown.ts | 3 +- src/ui/egg-counter-container.ts | 3 +- src/ui/egg-gacha-ui-handler.ts | 5 +- src/ui/egg-list-ui-handler.ts | 3 +- src/ui/evolution-scene-handler.ts | 3 +- src/ui/fight-ui-handler.ts | 5 +- src/ui/filter-bar.ts | 3 +- src/ui/filter-text.ts | 3 +- src/ui/form-modal-ui-handler.ts | 3 +- src/ui/game-stats-ui-handler.ts | 3 +- src/ui/loading-modal-ui-handler.ts | 3 +- src/ui/login-form-ui-handler.ts | 3 +- src/ui/menu-ui-handler.ts | 3 +- src/ui/modal-ui-handler.ts | 3 +- src/ui/modifier-select-ui-handler.ts | 3 +- src/ui/move-info-overlay.ts | 3 +- src/ui/mystery-encounter-ui-handler.ts | 3 +- src/ui/party-exp-bar.ts | 3 +- src/ui/party-ui-handler.ts | 3 +- src/ui/pokedex-info-overlay.ts | 3 +- src/ui/pokedex-mon-container.ts | 3 +- src/ui/pokedex-page-ui-handler.ts | 3 +- src/ui/pokedex-ui-handler.ts | 3 +- src/ui/pokemon-hatch-info-container.ts | 3 +- src/ui/pokemon-info-container.ts | 3 +- src/ui/registration-form-ui-handler.ts | 3 +- src/ui/run-history-ui-handler.ts | 3 +- src/ui/run-info-ui-handler.ts | 3 +- src/ui/save-slot-select-ui-handler.ts | 3 +- src/ui/session-reload-modal-ui-handler.ts | 3 +- .../settings/abstract-binding-ui-handler.ts | 3 +- .../abstract-control-settings-ui-handler.ts | 3 +- .../settings/abstract-settings-ui-handler.ts | 3 +- src/ui/settings/gamepad-binding-ui-handler.ts | 3 +- .../settings/keyboard-binding-ui-handler.ts | 3 +- src/ui/settings/navigation-menu.ts | 3 +- .../settings/settings-gamepad-ui-handler.ts | 3 +- .../settings/settings-keyboard-ui-handler.ts | 3 +- src/ui/starter-container.ts | 3 +- src/ui/starter-select-ui-handler.ts | 3 +- src/ui/stats-container.ts | 3 +- src/ui/summary-ui-handler.ts | 3 +- src/ui/text.ts | 82 ++----------------- src/ui/title-ui-handler.ts | 3 +- src/ui/ui-handler.ts | 2 +- src/ui/ui.ts | 3 +- src/ui/unavailable-modal-ui-handler.ts | 3 +- 76 files changed, 230 insertions(+), 150 deletions(-) create mode 100644 src/@types/ui.ts create mode 100644 src/enums/text-style.ts diff --git a/src/@types/ui.ts b/src/@types/ui.ts new file mode 100644 index 00000000000..10dab01c616 --- /dev/null +++ b/src/@types/ui.ts @@ -0,0 +1,10 @@ +import type Phaser from "phaser"; +import type InputText from "phaser3-rex-plugins/plugins/gameobjects/dom/inputtext/InputText"; + +export interface TextStyleOptions { + scale: number; + styleOptions: Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig; + shadowColor: string; + shadowXpos: number; + shadowYpos: number; +} diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 7e9360270ad..275f129a63a 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -67,6 +67,7 @@ import { PokemonType } from "#enums/pokemon-type"; import { ShopCursorTarget } from "#enums/shop-cursor-target"; import { SpeciesId } from "#enums/species-id"; import { StatusEffect } from "#enums/status-effect"; +import { TextStyle } from "#enums/text-style"; import type { TrainerSlot } from "#enums/trainer-slot"; import { TrainerType } from "#enums/trainer-type"; import { TrainerVariant } from "#enums/trainer-variant"; @@ -132,7 +133,7 @@ import { CharSprite } from "#ui/char-sprite"; import { PartyExpBar } from "#ui/party-exp-bar"; import { PokeballTray } from "#ui/pokeball-tray"; import { PokemonInfoContainer } from "#ui/pokemon-info-container"; -import { addTextObject, getTextColor, TextStyle } from "#ui/text"; +import { addTextObject, getTextColor } from "#ui/text"; import { UI } from "#ui/ui"; import { addUiThemeOverrides } from "#ui/ui-theme"; import { diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 42383940755..385ccb5c246 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,4 +1,4 @@ -import type { TextStyle } from "#ui/text"; +import type { TextStyle } from "#enums/text-style"; export class TextDisplay { speaker?: string; diff --git a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts index 4f4af94a88d..1ae0659b29e 100644 --- a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts @@ -1,6 +1,6 @@ import { globalScene } from "#app/global-scene"; +import type { TextStyle } from "#enums/text-style"; import { UiTheme } from "#enums/ui-theme"; -import type { TextStyle } from "#ui/text"; import { getTextWithColors } from "#ui/text"; import { isNullOrUndefined } from "#utils/common"; import i18next from "i18next"; diff --git a/src/data/nature.ts b/src/data/nature.ts index 4f4e627daf3..41764ec4276 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -1,7 +1,8 @@ import { Nature } from "#enums/nature"; import { EFFECTIVE_STATS, getShortenedStatKey, Stat } from "#enums/stat"; +import { TextStyle } from "#enums/text-style"; import { UiTheme } from "#enums/ui-theme"; -import { getBBCodeFrag, TextStyle } from "#ui/text"; +import { getBBCodeFrag } from "#ui/text"; import { toReadableString } from "#utils/common"; import i18next from "i18next"; diff --git a/src/enums/text-style.ts b/src/enums/text-style.ts new file mode 100644 index 00000000000..964a985cdd6 --- /dev/null +++ b/src/enums/text-style.ts @@ -0,0 +1,59 @@ +export const TextStyle = Object.freeze({ + MESSAGE: 1, + WINDOW: 2, + WINDOW_ALT: 3, + WINDOW_BATTLE_COMMAND: 4, + BATTLE_INFO: 5, + PARTY: 6, + PARTY_RED: 7, + PARTY_CANCEL_BUTTON: 8, + INSTRUCTIONS_TEXT: 9, + MOVE_LABEL: 10, + SUMMARY: 11, + SUMMARY_DEX_NUM: 12, + SUMMARY_DEX_NUM_GOLD: 13, + SUMMARY_ALT: 14, + SUMMARY_HEADER: 15, + SUMMARY_RED: 16, + SUMMARY_BLUE: 17, + SUMMARY_PINK: 18, + SUMMARY_GOLD: 19, + SUMMARY_GRAY: 20, + SUMMARY_GREEN: 21, + SUMMARY_STATS: 22, + SUMMARY_STATS_BLUE: 23, + SUMMARY_STATS_PINK: 24, + SUMMARY_STATS_GOLD: 25, + LUCK_VALUE: 26, + STATS_HEXAGON: 27, + GROWTH_RATE_TYPE: 28, + MONEY: 29, // Money default styling (pale yellow) + MONEY_WINDOW: 30, // Money displayed in Windows (needs different colors based on theme) + HEADER_LABEL: 31, + STATS_LABEL: 32, + STATS_VALUE: 33, + SETTINGS_VALUE: 34, + SETTINGS_LABEL: 35, + SETTINGS_LABEL_NAVBAR: 36, + SETTINGS_SELECTED: 37, + SETTINGS_LOCKED: 38, + EGG_LIST: 39, + EGG_SUMMARY_NAME: 40, + EGG_SUMMARY_DEX: 41, + STARTER_VALUE_LIMIT: 42, + TOOLTIP_TITLE: 43, + TOOLTIP_CONTENT: 44, + FILTER_BAR_MAIN: 45, + MOVE_INFO_CONTENT: 46, + MOVE_PP_FULL: 47, + MOVE_PP_HALF_FULL: 48, + MOVE_PP_NEAR_EMPTY: 49, + MOVE_PP_EMPTY: 50, + SMALLER_WINDOW_ALT: 51, + BGM_BAR: 52, + PERFECT_IV: 53, + ME_OPTION_DEFAULT: 54, // Default style for choices in ME + ME_OPTION_SPECIAL: 55, // Style for choices with special requirements in ME + SHADOW_TEXT: 56 // to obscure unavailable options +}) +export type TextStyle = typeof TextStyle[keyof typeof TextStyle]; \ No newline at end of file diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index acb279a17a0..1bbacc19566 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -1,9 +1,10 @@ import { globalScene } from "#app/global-scene"; import type { BattlerIndex } from "#enums/battler-index"; import { HitResult } from "#enums/hit-result"; +import { TextStyle } from "#enums/text-style"; import type { Pokemon } from "#field/pokemon"; import type { DamageResult } from "#types/damage-result"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { fixedInt, formatStat } from "#utils/common"; type TextAndShadowArr = [string | null, string | null]; diff --git a/src/field/pokemon-sprite-sparkle-handler.ts b/src/field/pokemon-sprite-sparkle-handler.ts index 725229ce723..bd44dc03330 100644 --- a/src/field/pokemon-sprite-sparkle-handler.ts +++ b/src/field/pokemon-sprite-sparkle-handler.ts @@ -5,10 +5,11 @@ import { coerceArray, fixedInt, randInt } from "#utils/common"; export class PokemonSpriteSparkleHandler { private sprites: Set; + private counterTween?: Phaser.Tweens.Tween; + setup(): void { this.sprites = new Set(); - - globalScene.tweens.addCounter({ + this.counterTween = globalScene.tweens.addCounter({ duration: fixedInt(200), from: 0, to: 1, @@ -78,4 +79,12 @@ export class PokemonSpriteSparkleHandler { this.sprites.delete(s); } } + + destroy(): void { + this.removeAll(); + if (this.counterTween) { + this.counterTween.destroy(); + this.counterTween = undefined; + } + } } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index f8c35b3e8f9..f6a9ed48847 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -23,6 +23,7 @@ import type { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; import { BATTLE_STATS, type PermanentStat, Stat, TEMP_BATTLE_STATS, type TempBattleStat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; +import { TextStyle } from "#enums/text-style"; import type { PlayerPokemon, Pokemon } from "#field/pokemon"; import type { DoubleBattleChanceBoosterModifierType, @@ -40,7 +41,7 @@ import type { } from "#modifiers/modifier-type"; import type { VoucherType } from "#system/voucher"; import type { ModifierInstanceMap, ModifierString } from "#types/modifier-types"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { BooleanHolder, hslToHex, isNullOrUndefined, NumberHolder, randSeedFloat, toDmgValue } from "#utils/common"; import { getModifierType } from "#utils/modifier-utils"; import i18next from "i18next"; diff --git a/src/phases/end-card-phase.ts b/src/phases/end-card-phase.ts index 5c3f6e1bf9b..b9b383db13d 100644 --- a/src/phases/end-card-phase.ts +++ b/src/phases/end-card-phase.ts @@ -1,7 +1,8 @@ import { globalScene } from "#app/global-scene"; import { Phase } from "#app/phase"; import { PlayerGender } from "#enums/player-gender"; -import { addTextObject, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addTextObject } from "#ui/text"; import i18next from "i18next"; export class EndCardPhase extends Phase { diff --git a/src/phases/scan-ivs-phase.ts b/src/phases/scan-ivs-phase.ts index e0865feb7ca..eebee28bfbb 100644 --- a/src/phases/scan-ivs-phase.ts +++ b/src/phases/scan-ivs-phase.ts @@ -2,9 +2,10 @@ import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import type { BattlerIndex } from "#enums/battler-index"; import { PERMANENT_STATS, Stat } from "#enums/stat"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { PokemonPhase } from "#phases/pokemon-phase"; -import { getTextColor, TextStyle } from "#ui/text"; +import { getTextColor } from "#ui/text"; import i18next from "i18next"; export class ScanIvsPhase extends PokemonPhase { diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 02cb7fe8e0d..9877f298404 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -5,8 +5,9 @@ import { Challenges } from "#enums/challenges"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { SpeciesId } from "#enums/species-id"; +import { TextStyle } from "#enums/text-style"; import { WeatherType } from "#enums/weather-type"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import type { nil } from "#utils/common"; import { isNullOrUndefined } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/ability-bar.ts b/src/ui/ability-bar.ts index 79a68e9dce7..4b868d4e66c 100644 --- a/src/ui/ability-bar.ts +++ b/src/ui/ability-bar.ts @@ -1,5 +1,6 @@ import { globalScene } from "#app/global-scene"; -import { addTextObject, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addTextObject } from "#ui/text"; import i18next from "i18next"; const barWidth = 118; diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index d93ad8b7665..2fb0159b6ef 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -1,7 +1,8 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; -import { addBBCodeTextObject, getTextColor, getTextStyleOptions, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, getTextColor, getTextStyleOptions } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import { fixedInt, rgbHexToRgba } from "#utils/common"; diff --git a/src/ui/achv-bar.ts b/src/ui/achv-bar.ts index 8e0f2a9404b..bb1ef95c9de 100644 --- a/src/ui/achv-bar.ts +++ b/src/ui/achv-bar.ts @@ -1,8 +1,9 @@ import { globalScene } from "#app/global-scene"; import type { PlayerGender } from "#enums/player-gender"; +import { TextStyle } from "#enums/text-style"; import { Achv, getAchievementDescription } from "#system/achv"; import { Voucher } from "#system/voucher"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; export class AchvBar extends Phaser.GameObjects.Container { private defaultWidth: number; diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index 6b247f6da96..01fd1d45a61 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; import { PlayerGender } from "#enums/player-gender"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import type { Achv } from "#system/achv"; import { achvs, getAchievementDescription } from "#system/achv"; @@ -9,7 +10,7 @@ import type { Voucher } from "#system/voucher"; import { getVoucherTypeIcon, getVoucherTypeName, vouchers } from "#system/voucher"; import { MessageUiHandler } from "#ui/message-ui-handler"; import { ScrollBar } from "#ui/scroll-bar"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts index 3d0a1153127..f136aeb5008 100644 --- a/src/ui/admin-ui-handler.ts +++ b/src/ui/admin-ui-handler.ts @@ -1,11 +1,11 @@ import { pokerogueApi } from "#api/pokerogue-api"; import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; import type { ModalConfig } from "#ui/modal-ui-handler"; -import { TextStyle } from "#ui/text"; import { formatText } from "#utils/common"; type AdminUiHandlerService = "discord" | "google"; diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 970c65c8978..9a674719202 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -3,6 +3,7 @@ import { ArenaTrapTag } from "#data/arena-tag"; import { TerrainType } from "#data/terrain"; import { ArenaTagSide } from "#enums/arena-tag-side"; import { ArenaTagType } from "#enums/arena-tag-type"; +import { TextStyle } from "#enums/text-style"; import { WeatherType } from "#enums/weather-type"; import type { ArenaEvent } from "#events/arena"; import { @@ -14,7 +15,7 @@ import { } from "#events/arena"; import type { TurnEndEvent } from "#events/battle-scene"; import { BattleSceneEventType } from "#events/battle-scene"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { TimeOfDayWidget } from "#ui/time-of-day-widget"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import { fixedInt, formatText, toCamelCaseString } from "#utils/common"; diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index bde340e3cf7..67beb0eba84 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -2,9 +2,10 @@ import { globalScene } from "#app/global-scene"; import { getPokeballName } from "#data/pokeball"; import { Button } from "#enums/buttons"; import { Command } from "#enums/command"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { CommandPhase } from "#phases/command-phase"; -import { addTextObject, getTextStyleOptions, TextStyle } from "#ui/text"; +import { addTextObject, getTextStyleOptions } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/base-stats-overlay.ts b/src/ui/base-stats-overlay.ts index 888b87a8d11..e3ba472475a 100644 --- a/src/ui/base-stats-overlay.ts +++ b/src/ui/base-stats-overlay.ts @@ -1,6 +1,7 @@ import type { InfoToggle } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; -import { addTextObject, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { fixedInt } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/battle-flyout.ts b/src/ui/battle-flyout.ts index 083dc7bbf19..0a67dc9ad37 100644 --- a/src/ui/battle-flyout.ts +++ b/src/ui/battle-flyout.ts @@ -2,12 +2,13 @@ import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import { BerryType } from "#enums/berry-type"; import { MoveId } from "#enums/move-id"; +import { TextStyle } from "#enums/text-style"; import { UiTheme } from "#enums/ui-theme"; import type { BerryUsedEvent, MoveUsedEvent } from "#events/battle-scene"; import { BattleSceneEventType } from "#events/battle-scene"; import type { EnemyPokemon, Pokemon } from "#field/pokemon"; import type { Move } from "#moves/move"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { fixedInt } from "#utils/common"; /** Container for info about a {@linkcode Move} */ diff --git a/src/ui/battle-info/battle-info.ts b/src/ui/battle-info/battle-info.ts index 4a2a6d1804d..0aedfbdf5e7 100644 --- a/src/ui/battle-info/battle-info.ts +++ b/src/ui/battle-info/battle-info.ts @@ -4,9 +4,10 @@ import { getTypeRgb } from "#data/type"; import { PokemonType } from "#enums/pokemon-type"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; +import { TextStyle } from "#enums/text-style"; import type { Pokemon } from "#field/pokemon"; import { getVariantTint } from "#sprites/variant"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { fixedInt, getLocalizedSpriteKey, getShinyDescriptor } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/battle-info/enemy-battle-info.ts b/src/ui/battle-info/enemy-battle-info.ts index 5799fb476ef..d426a49df5c 100644 --- a/src/ui/battle-info/enemy-battle-info.ts +++ b/src/ui/battle-info/enemy-battle-info.ts @@ -1,10 +1,11 @@ import { globalScene } from "#app/global-scene"; import { Stat } from "#enums/stat"; +import { TextStyle } from "#enums/text-style"; import type { EnemyPokemon } from "#field/pokemon"; import { BattleFlyout } from "#ui/battle-flyout"; import type { BattleInfoParamList } from "#ui/battle-info"; import { BattleInfo } from "#ui/battle-info"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import i18next from "i18next"; import type { GameObjects } from "phaser"; diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index bd524f0bb43..b58897b9022 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -1,9 +1,10 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; import { getStatKey, PERMANENT_STATS } from "#enums/stat"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { MessageUiHandler } from "#ui/message-ui-handler"; -import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts index d8b6bbe8b8a..fb50e444aa5 100644 --- a/src/ui/bgm-bar.ts +++ b/src/ui/bgm-bar.ts @@ -1,5 +1,6 @@ import { globalScene } from "#app/global-scene"; -import { addTextObject, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addTextObject } from "#ui/text"; import { formatText } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/candy-bar.ts b/src/ui/candy-bar.ts index ea3500d6c4c..239b963227b 100644 --- a/src/ui/candy-bar.ts +++ b/src/ui/candy-bar.ts @@ -1,7 +1,8 @@ import { globalScene } from "#app/global-scene"; import { starterColors } from "#app/global-vars/starter-colors"; import type { SpeciesId } from "#enums/species-id"; -import { addTextObject, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addTextObject } from "#ui/text"; import { rgbHexToRgba } from "#utils/common"; import { argbFromRgba } from "@material/material-color-utilities"; diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index a827cddc9a7..4f205d59de8 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -3,8 +3,9 @@ import type { Challenge } from "#data/challenge"; import { Button } from "#enums/buttons"; import { Challenges } from "#enums/challenges"; import { Color, ShadowColor } from "#enums/color"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import { getLocalizedSpriteKey } from "#utils/common"; diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 2e4acfb7c42..41ff559062a 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -5,11 +5,12 @@ import { Button } from "#enums/buttons"; import { Command } from "#enums/command"; import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { TerastallizeAccessModifier } from "#modifiers/modifier"; import type { CommandPhase } from "#phases/command-phase"; import { PartyUiHandler, PartyUiMode } from "#ui/party-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import i18next from "i18next"; diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index dcd45b40390..9391d02859c 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -1,6 +1,7 @@ import { pokerogueApi } from "#api/pokerogue-api"; import { globalScene } from "#app/global-scene"; -import { addTextObject, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addTextObject } from "#ui/text"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import { executeIf } from "#utils/common"; import { getEnumKeys } from "#utils/enums"; diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index 2a100ddbe59..c13d1ab6482 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; +import { TextStyle } from "#enums/text-style"; import { ScrollBar } from "#ui/scroll-bar"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/egg-counter-container.ts b/src/ui/egg-counter-container.ts index ff536228fde..da394e73b28 100644 --- a/src/ui/egg-counter-container.ts +++ b/src/ui/egg-counter-container.ts @@ -1,8 +1,9 @@ import { globalScene } from "#app/global-scene"; +import { TextStyle } from "#enums/text-style"; import type { EggCountChangedEvent } from "#events/egg"; import { EggEventType } from "#events/egg"; import type { EggHatchSceneHandler } from "#ui/egg-hatch-scene-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; /** diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 19d1efa75dd..5dcf05e2606 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -6,10 +6,11 @@ import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#data/egg"; import { Button } from "#enums/buttons"; import { EggTier } from "#enums/egg-type"; import { GachaType } from "#enums/gacha-types"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { getVoucherTypeIcon, VoucherType } from "#system/voucher"; import { MessageUiHandler } from "#ui/message-ui-handler"; -import { addTextObject, getEggTierTextTint, getTextStyleOptions, TextStyle } from "#ui/text"; +import { addTextObject, getEggTierTextTint, getTextStyleOptions } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { fixedInt, randSeedShuffle } from "#utils/common"; import { getEnumValues } from "#utils/enums"; @@ -74,7 +75,7 @@ export class EggGachaUiHandler extends MessageUiHandler { const gachaInfoContainer = globalScene.add.container(160, 46); const currentLanguage = i18next.resolvedLanguage ?? "en"; - let gachaTextStyle = TextStyle.WINDOW_ALT; + let gachaTextStyle: TextStyle = TextStyle.WINDOW_ALT; let gachaX = 4; let gachaY = 0; let pokemonIconX = -20; diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index 94d6889ed48..42f969b9d38 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -1,11 +1,12 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { MessageUiHandler } from "#ui/message-ui-handler"; import { PokemonIconAnimHandler, PokemonIconAnimMode } from "#ui/pokemon-icon-anim-handler"; import { ScrollBar } from "#ui/scroll-bar"; import { ScrollableGridUiHandler } from "#ui/scrollable-grid-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index 5ad4fc6fdf5..c22cf31faaa 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -1,8 +1,9 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { MessageUiHandler } from "#ui/message-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; export class EvolutionSceneHandler extends MessageUiHandler { public evolutionContainer: Phaser.GameObjects.Container; diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 286199b99e2..42f8cba5df4 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -7,12 +7,13 @@ import { Command } from "#enums/command"; import { MoveCategory } from "#enums/move-category"; import { MoveUseMode } from "#enums/move-use-mode"; import { PokemonType } from "#enums/pokemon-type"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { EnemyPokemon, Pokemon } from "#field/pokemon"; import type { PokemonMove } from "#moves/pokemon-move"; import type { CommandPhase } from "#phases/command-phase"; import { MoveInfoOverlay } from "#ui/move-info-overlay"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { fixedInt, getLocalizedSpriteKey, padInt } from "#utils/common"; import i18next from "i18next"; @@ -284,7 +285,7 @@ export class FightUiHandler extends UiHandler implements InfoToggle { const ppColorStyle = FightUiHandler.ppRatioToColor(pp / maxPP); - //** Changes the text color and shadow according to the determined TextStyle */ + // Changes the text color and shadow according to the determined TextStyle this.ppText.setColor(this.getTextColor(ppColorStyle, false)).setShadowColor(this.getTextColor(ppColorStyle, true)); this.moveInfoOverlay.show(pokemonMove.getMove()); diff --git a/src/ui/filter-bar.ts b/src/ui/filter-bar.ts index 3961ae3415c..ea227655a97 100644 --- a/src/ui/filter-bar.ts +++ b/src/ui/filter-bar.ts @@ -1,10 +1,11 @@ import { globalScene } from "#app/global-scene"; import type { DropDownColumn } from "#enums/drop-down-column"; +import { TextStyle } from "#enums/text-style"; import type { UiTheme } from "#enums/ui-theme"; import type { DropDown } from "#ui/dropdown"; import { DropDownType } from "#ui/dropdown"; import type { StarterContainer } from "#ui/starter-container"; -import { addTextObject, getTextColor, TextStyle } from "#ui/text"; +import { addTextObject, getTextColor } from "#ui/text"; import { addWindow, WindowVariant } from "#ui/ui-theme"; export class FilterBar extends Phaser.GameObjects.Container { diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts index 4a9012e44fc..ff7119dd778 100644 --- a/src/ui/filter-text.ts +++ b/src/ui/filter-text.ts @@ -1,9 +1,10 @@ import { globalScene } from "#app/global-scene"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { UiTheme } from "#enums/ui-theme"; import type { AwaitableUiHandler } from "#ui/awaitable-ui-handler"; import type { StarterContainer } from "#ui/starter-container"; -import { addTextObject, getTextColor, TextStyle } from "#ui/text"; +import { addTextObject, getTextColor } from "#ui/text"; import type { UI } from "#ui/ui"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 35965b09b80..7ae545a7292 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -1,9 +1,10 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import type { ModalConfig } from "#ui/modal-ui-handler"; import { ModalUiHandler } from "#ui/modal-ui-handler"; -import { addTextInputObject, addTextObject, TextStyle } from "#ui/text"; +import { addTextInputObject, addTextObject } from "#ui/text"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import { fixedInt } from "#utils/common"; import type InputText from "phaser3-rex-plugins/plugins/inputtext"; diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 759792b122f..fa5cd0a989a 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -2,9 +2,10 @@ import { globalScene } from "#app/global-scene"; import { speciesStarterCosts } from "#balance/starters"; import { Button } from "#enums/buttons"; import { DexAttr } from "#enums/dex-attr"; +import { TextStyle } from "#enums/text-style"; import { UiTheme } from "#enums/ui-theme"; import type { GameData } from "#system/game-data"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import { formatFancyLargeNumber, getPlayTimeString, toReadableString } from "#utils/common"; diff --git a/src/ui/loading-modal-ui-handler.ts b/src/ui/loading-modal-ui-handler.ts index 585d70d51db..de00d911c47 100644 --- a/src/ui/loading-modal-ui-handler.ts +++ b/src/ui/loading-modal-ui-handler.ts @@ -1,6 +1,7 @@ +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import { ModalUiHandler } from "#ui/modal-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import i18next from "i18next"; export class LoadingModalUiHandler extends ModalUiHandler { diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 417a9031bf7..524eaeece86 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -1,11 +1,12 @@ import { pokerogueApi } from "#api/pokerogue-api"; import { globalScene } from "#app/global-scene"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; import type { ModalConfig } from "#ui/modal-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { fixedInt } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 4e45dfedcb3..fa65cccab2f 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -5,13 +5,14 @@ import { bypassLogin } from "#app/global-vars/bypass-login"; import { handleTutorial, Tutorial } from "#app/tutorial"; import { Button } from "#enums/buttons"; import { GameDataType } from "#enums/game-data-type"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { OptionSelectConfig, OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; import { AdminMode, getAdminModeName } from "#ui/admin-ui-handler"; import type { AwaitableUiHandler } from "#ui/awaitable-ui-handler"; import { BgmBar } from "#ui/bgm-bar"; import { MessageUiHandler } from "#ui/message-ui-handler"; -import { addTextObject, getTextStyleOptions, TextStyle } from "#ui/text"; +import { addTextObject, getTextStyleOptions } from "#ui/text"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import { fixedInt, isLocal, sessionIdKey } from "#utils/common"; import { getCookie } from "#utils/cookies"; diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 844f7f43930..c93b713831e 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -1,7 +1,8 @@ import { globalScene } from "#app/global-scene"; import type { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow, WindowVariant } from "#ui/ui-theme"; diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 3e3487d4ffb..50d88738d32 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -6,13 +6,14 @@ import { getPokeballAtlasKey } from "#data/pokeball"; import { Button } from "#enums/buttons"; import type { PokeballType } from "#enums/pokeball"; import { ShopCursorTarget } from "#enums/shop-cursor-target"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { HealShopCostModifier, LockModifierTiersModifier, PokemonHeldItemModifier } from "#modifiers/modifier"; import type { ModifierTypeOption } from "#modifiers/modifier-type"; import { getPlayerShopModifierTypeOptionsForWave, TmModifierType } from "#modifiers/modifier-type"; import { AwaitableUiHandler } from "#ui/awaitable-ui-handler"; import { MoveInfoOverlay } from "#ui/move-info-overlay"; -import { addTextObject, getModifierTierTextTint, getTextColor, getTextStyleOptions, TextStyle } from "#ui/text"; +import { addTextObject, getModifierTierTextTint, getTextColor, getTextStyleOptions } from "#ui/text"; import { formatMoney, NumberHolder } from "#utils/common"; import i18next from "i18next"; import Phaser from "phaser"; diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts index 7720354a5b3..f8632eb244e 100644 --- a/src/ui/move-info-overlay.ts +++ b/src/ui/move-info-overlay.ts @@ -2,8 +2,9 @@ import type { InfoToggle } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; import { MoveCategory } from "#enums/move-category"; import { PokemonType } from "#enums/pokemon-type"; +import { TextStyle } from "#enums/text-style"; import type { Move } from "#moves/move"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { fixedInt, getLocalizedSpriteKey } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 37f0efb50e4..b6bc464855c 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -3,13 +3,14 @@ import { getPokeballAtlasKey } from "#data/pokeball"; import { Button } from "#enums/buttons"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { getEncounterText } from "#mystery-encounters/encounter-dialogue-utils"; import type { OptionSelectSettings } from "#mystery-encounters/encounter-phase-utils"; import type { MysteryEncounterOption } from "#mystery-encounters/mystery-encounter-option"; import type { MysteryEncounterPhase } from "#phases/mystery-encounter-phases"; import { PartyUiMode } from "#ui/party-ui-handler"; -import { addBBCodeTextObject, getBBCodeFrag, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, getBBCodeFrag } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow, WindowVariant } from "#ui/ui-theme"; import { fixedInt, isNullOrUndefined } from "#utils/common"; diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index 0d6ec936a92..952a1f8227a 100644 --- a/src/ui/party-exp-bar.ts +++ b/src/ui/party-exp-bar.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; +import { TextStyle } from "#enums/text-style"; import type { Pokemon } from "#field/pokemon"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import i18next from "i18next"; export class PartyExpBar extends Phaser.GameObjects.Container { diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 956e4c52e39..2b29a564f9f 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -13,6 +13,7 @@ import { MoveId } from "#enums/move-id"; import { MoveResult } from "#enums/move-result"; import { SpeciesId } from "#enums/species-id"; import { StatusEffect } from "#enums/status-effect"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { PlayerPokemon, Pokemon } from "#field/pokemon"; import type { PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#modifiers/modifier"; @@ -23,7 +24,7 @@ import type { TurnMove } from "#types/turn-move"; import { MessageUiHandler } from "#ui/message-ui-handler"; import { MoveInfoOverlay } from "#ui/move-info-overlay"; import { PokemonIconAnimHandler, PokemonIconAnimMode } from "#ui/pokemon-icon-anim-handler"; -import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { BooleanHolder, getLocalizedSpriteKey, randInt, toReadableString } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/pokedex-info-overlay.ts b/src/ui/pokedex-info-overlay.ts index 6d3b8f1009f..0f2f5fa3dde 100644 --- a/src/ui/pokedex-info-overlay.ts +++ b/src/ui/pokedex-info-overlay.ts @@ -1,6 +1,7 @@ import type { InfoToggle } from "#app/battle-scene"; import { globalScene } from "#app/global-scene"; -import { addTextObject, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { fixedInt } from "#utils/common"; diff --git a/src/ui/pokedex-mon-container.ts b/src/ui/pokedex-mon-container.ts index 73799870e6b..cfb8555e6c9 100644 --- a/src/ui/pokedex-mon-container.ts +++ b/src/ui/pokedex-mon-container.ts @@ -1,7 +1,8 @@ import { globalScene } from "#app/global-scene"; import type { PokemonSpecies } from "#data/pokemon-species"; +import { TextStyle } from "#enums/text-style"; import type { Variant } from "#sprites/variant"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { isNullOrUndefined } from "#utils/common"; interface SpeciesDetails { diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index ff96aa55772..b3eb8de0f50 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -38,6 +38,7 @@ import type { Nature } from "#enums/nature"; import { Passive as PassiveAttr } from "#enums/passive"; import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; +import { TextStyle } from "#enums/text-style"; import { TimeOfDay } from "#enums/time-of-day"; import { UiMode } from "#enums/ui-mode"; import type { Variant } from "#sprites/variant"; @@ -51,7 +52,7 @@ import { MessageUiHandler } from "#ui/message-ui-handler"; import { MoveInfoOverlay } from "#ui/move-info-overlay"; import { PokedexInfoOverlay } from "#ui/pokedex-info-overlay"; import { StatsContainer } from "#ui/stats-container"; -import { addBBCodeTextObject, addTextObject, getTextColor, getTextStyleOptions, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, addTextObject, getTextColor, getTextStyleOptions } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { BooleanHolder, diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index c2f595cb190..5d49e867b59 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -26,6 +26,7 @@ import type { Nature } from "#enums/nature"; import { Passive as PassiveAttr } from "#enums/passive"; import { PokemonType } from "#enums/pokemon-type"; import type { SpeciesId } from "#enums/species-id"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { Variant } from "#sprites/variant"; import { getVariantIcon, getVariantTint } from "#sprites/variant"; @@ -40,7 +41,7 @@ import { MessageUiHandler } from "#ui/message-ui-handler"; import { PokedexMonContainer } from "#ui/pokedex-mon-container"; import { PokemonIconAnimHandler, PokemonIconAnimMode } from "#ui/pokemon-icon-anim-handler"; import { ScrollBar } from "#ui/scroll-bar"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { BooleanHolder, fixedInt, getLocalizedSpriteKey, padInt, randIntRange, rgbHexToRgba } from "#utils/common"; import type { StarterPreferences } from "#utils/data"; diff --git a/src/ui/pokemon-hatch-info-container.ts b/src/ui/pokemon-hatch-info-container.ts index 8bcd62316cd..9c223adf837 100644 --- a/src/ui/pokemon-hatch-info-container.ts +++ b/src/ui/pokemon-hatch-info-container.ts @@ -8,9 +8,10 @@ import { Gender } from "#data/gender"; import { getPokemonSpeciesForm } from "#data/pokemon-species"; import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; +import { TextStyle } from "#enums/text-style"; import type { PlayerPokemon } from "#field/pokemon"; import { PokemonInfoContainer } from "#ui/pokemon-info-container"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { padInt, rgbHexToRgba } from "#utils/common"; import { argbFromRgba } from "@material/material-color-utilities"; diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index c95f412c834..3b2349348a8 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -3,13 +3,14 @@ import { Gender, getGenderColor, getGenderSymbol } from "#data/gender"; import { getNatureName } from "#data/nature"; import { DexAttr } from "#enums/dex-attr"; import { PokemonType } from "#enums/pokemon-type"; +import { TextStyle } from "#enums/text-style"; import type { Pokemon } from "#field/pokemon"; import { getVariantTint } from "#sprites/variant"; import type { StarterDataEntry } from "#system/game-data"; import type { DexEntry } from "#types/dex-data"; import { ConfirmUiHandler } from "#ui/confirm-ui-handler"; import { StatsContainer } from "#ui/stats-container"; -import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { fixedInt, getShinyDescriptor } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/registration-form-ui-handler.ts b/src/ui/registration-form-ui-handler.ts index 2466603af71..60f8d1d987f 100644 --- a/src/ui/registration-form-ui-handler.ts +++ b/src/ui/registration-form-ui-handler.ts @@ -1,10 +1,11 @@ import { pokerogueApi } from "#api/pokerogue-api"; import { globalScene } from "#app/global-scene"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; import type { ModalConfig } from "#ui/modal-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import i18next from "i18next"; interface LanguageSetting { diff --git a/src/ui/run-history-ui-handler.ts b/src/ui/run-history-ui-handler.ts index f810468aea1..00aa47ae65d 100644 --- a/src/ui/run-history-ui-handler.ts +++ b/src/ui/run-history-ui-handler.ts @@ -3,13 +3,14 @@ import { BattleType } from "#enums/battle-type"; import { Button } from "#enums/buttons"; import { GameModes } from "#enums/game-modes"; import { PlayerGender } from "#enums/player-gender"; +import { TextStyle } from "#enums/text-style"; import { TrainerVariant } from "#enums/trainer-variant"; import { UiMode } from "#enums/ui-mode"; import type { RunEntry } from "#system/game-data"; import type { PokemonData } from "#system/pokemon-data"; import { MessageUiHandler } from "#ui/message-ui-handler"; import { RunDisplayMode } from "#ui/run-info-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { fixedInt, formatLargeNumber } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 29f95c4e4c8..465e48a45ad 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -12,6 +12,7 @@ import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PlayerGender } from "#enums/player-gender"; import { PokemonType } from "#enums/pokemon-type"; import type { SpeciesId } from "#enums/species-id"; +import { TextStyle } from "#enums/text-style"; import { TrainerVariant } from "#enums/trainer-variant"; import { UiMode } from "#enums/ui-mode"; // biome-ignore lint/performance/noNamespaceImport: See `src/system/game-data.ts` @@ -21,7 +22,7 @@ import { getVariantTint } from "#sprites/variant"; import type { SessionSaveData } from "#system/game-data"; import type { PokemonData } from "#system/pokemon-data"; import { SettingKeyboard } from "#system/settings-keyboard"; -import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import { formatFancyLargeNumber, formatLargeNumber, formatMoney, getPlayTimeString } from "#utils/common"; diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index bcbe60265cd..9da34e672f1 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -1,6 +1,7 @@ import { GameMode } from "#app/game-mode"; import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; // biome-ignore lint/performance/noNamespaceImport: See `src/system/game-data.ts` import * as Modifier from "#modifiers/modifier"; @@ -8,7 +9,7 @@ import type { SessionSaveData } from "#system/game-data"; import type { PokemonData } from "#system/pokemon-data"; import { MessageUiHandler } from "#ui/message-ui-handler"; import { RunDisplayMode } from "#ui/run-info-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { fixedInt, formatLargeNumber, getPlayTimeString, isNullOrUndefined } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/session-reload-modal-ui-handler.ts b/src/ui/session-reload-modal-ui-handler.ts index ab1197324a6..1f5a205f990 100644 --- a/src/ui/session-reload-modal-ui-handler.ts +++ b/src/ui/session-reload-modal-ui-handler.ts @@ -1,7 +1,8 @@ +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import type { ModalConfig } from "#ui/modal-ui-handler"; import { ModalUiHandler } from "#ui/modal-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; export class SessionReloadModalUiHandler extends ModalUiHandler { constructor(mode: UiMode | null = null) { diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index 7004af8c4ed..eb68456a69d 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -1,8 +1,9 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import { NavigationManager } from "#ui/navigation-menu"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 64786849abc..8f7de42e4db 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -2,11 +2,12 @@ import { globalScene } from "#app/global-scene"; import type { InterfaceConfig } from "#app/inputs-controller"; import { Button } from "#enums/buttons"; import type { Device } from "#enums/devices"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import { getIconWithSettingName } from "#inputs/config-handler"; import { NavigationManager, NavigationMenu } from "#ui/navigation-menu"; import { ScrollBar } from "#ui/scroll-bar"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 9e56ae80b14..81d733220fc 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -1,5 +1,6 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { SettingType } from "#system/settings"; import { Setting, SettingKeys } from "#system/settings"; @@ -7,7 +8,7 @@ import type { InputsIcons } from "#ui/abstract-control-settings-ui-handler"; import { MessageUiHandler } from "#ui/message-ui-handler"; import { NavigationManager, NavigationMenu } from "#ui/navigation-menu"; import { ScrollBar } from "#ui/scroll-bar"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/settings/gamepad-binding-ui-handler.ts b/src/ui/settings/gamepad-binding-ui-handler.ts index e97fc56d7c0..53d606b6f84 100644 --- a/src/ui/settings/gamepad-binding-ui-handler.ts +++ b/src/ui/settings/gamepad-binding-ui-handler.ts @@ -1,9 +1,10 @@ import { globalScene } from "#app/global-scene"; import { Device } from "#enums/devices"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import { getIconWithSettingName, getKeyWithKeycode } from "#inputs/config-handler"; import { AbstractBindingUiHandler } from "#ui/abstract-binding-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import i18next from "i18next"; export class GamepadBindingUiHandler extends AbstractBindingUiHandler { diff --git a/src/ui/settings/keyboard-binding-ui-handler.ts b/src/ui/settings/keyboard-binding-ui-handler.ts index e43184795d1..b339ac16188 100644 --- a/src/ui/settings/keyboard-binding-ui-handler.ts +++ b/src/ui/settings/keyboard-binding-ui-handler.ts @@ -1,9 +1,10 @@ import { globalScene } from "#app/global-scene"; import { Device } from "#enums/devices"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import { getKeyWithKeycode } from "#inputs/config-handler"; import { AbstractBindingUiHandler } from "#ui/abstract-binding-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import i18next from "i18next"; export class KeyboardBindingUiHandler extends AbstractBindingUiHandler { diff --git a/src/ui/settings/navigation-menu.ts b/src/ui/settings/navigation-menu.ts index 1303c32d3a5..2f3aa50f7f3 100644 --- a/src/ui/settings/navigation-menu.ts +++ b/src/ui/settings/navigation-menu.ts @@ -1,8 +1,9 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { InputsIcons } from "#ui/abstract-control-settings-ui-handler"; -import { addTextObject, setTextStyle, TextStyle } from "#ui/text"; +import { addTextObject, setTextStyle } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; diff --git a/src/ui/settings/settings-gamepad-ui-handler.ts b/src/ui/settings/settings-gamepad-ui-handler.ts index ea2e18a2ce6..57a70411f4c 100644 --- a/src/ui/settings/settings-gamepad-ui-handler.ts +++ b/src/ui/settings/settings-gamepad-ui-handler.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import type { InterfaceConfig } from "#app/inputs-controller"; import { Device } from "#enums/devices"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import pad_dualshock from "#inputs/pad-dualshock"; import pad_unlicensedSNES from "#inputs/pad-unlicensed-snes"; @@ -13,7 +14,7 @@ import { settingGamepadOptions, } from "#system/settings-gamepad"; import { AbstractControlSettingsUiHandler } from "#ui/abstract-control-settings-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { truncateString } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/settings/settings-keyboard-ui-handler.ts b/src/ui/settings/settings-keyboard-ui-handler.ts index 2c2e0dbd7cd..ad4bf47f673 100644 --- a/src/ui/settings/settings-keyboard-ui-handler.ts +++ b/src/ui/settings/settings-keyboard-ui-handler.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import type { InterfaceConfig } from "#app/inputs-controller"; import { Device } from "#enums/devices"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import cfg_keyboard_qwerty from "#inputs/cfg-keyboard-qwerty"; import { deleteBind } from "#inputs/config-handler"; @@ -13,7 +14,7 @@ import { } from "#system/settings-keyboard"; import { AbstractControlSettingsUiHandler } from "#ui/abstract-control-settings-ui-handler"; import { NavigationManager } from "#ui/navigation-menu"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { reverseValueToKeySetting, truncateString } from "#utils/common"; import i18next from "i18next"; diff --git a/src/ui/starter-container.ts b/src/ui/starter-container.ts index 4c174dc5955..f81ac8e5bfb 100644 --- a/src/ui/starter-container.ts +++ b/src/ui/starter-container.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import type { PokemonSpecies } from "#data/pokemon-species"; -import { addTextObject, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addTextObject } from "#ui/text"; export class StarterContainer extends Phaser.GameObjects.Container { public species: PokemonSpecies; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index fcd8167a519..82e19d857c5 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -39,6 +39,7 @@ import type { Nature } from "#enums/nature"; import { Passive as PassiveAttr } from "#enums/passive"; import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { CandyUpgradeNotificationChangedEvent } from "#events/battle-scene"; import { BattleSceneEventType } from "#events/battle-scene"; @@ -57,7 +58,7 @@ import { PokemonIconAnimHandler, PokemonIconAnimMode } from "#ui/pokemon-icon-an import { ScrollBar } from "#ui/scroll-bar"; import { StarterContainer } from "#ui/starter-container"; import { StatsContainer } from "#ui/stats-container"; -import { addBBCodeTextObject, addTextObject, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; import { BooleanHolder, diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index 6b89e80b80a..e9af5eed3e3 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -1,6 +1,7 @@ import { globalScene } from "#app/global-scene"; import { getStatKey, PERMANENT_STATS } from "#enums/stat"; -import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "#ui/text"; +import { TextStyle } from "#enums/text-style"; +import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text"; import i18next from "i18next"; import type BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 7661dab068e..c5c714f0b34 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -16,6 +16,7 @@ import { PlayerGender } from "#enums/player-gender"; import { PokemonType } from "#enums/pokemon-type"; import { getStatKey, PERMANENT_STATS, Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import type { PlayerPokemon } from "#field/pokemon"; import { modifierSortFunc, PokemonHeldItemModifier } from "#modifiers/modifier"; @@ -24,7 +25,7 @@ import type { PokemonMove } from "#moves/pokemon-move"; import type { Variant } from "#sprites/variant"; import { getVariantTint } from "#sprites/variant"; import { achvs } from "#system/achv"; -import { addBBCodeTextObject, addTextObject, getBBCodeFrag, TextStyle } from "#ui/text"; +import { addBBCodeTextObject, addTextObject, getBBCodeFrag } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { fixedInt, diff --git a/src/ui/text.ts b/src/ui/text.ts index b2a1894c85c..8aa50983874 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -1,79 +1,14 @@ import { globalScene } from "#app/global-scene"; import { EggTier } from "#enums/egg-type"; import { ModifierTier } from "#enums/modifier-tier"; +import { TextStyle } from "#enums/text-style"; import { UiTheme } from "#enums/ui-theme"; import i18next from "#plugins/i18n"; +import type { TextStyleOptions } from "#types/ui"; import type Phaser from "phaser"; import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; import type InputText from "phaser3-rex-plugins/plugins/inputtext"; -export enum TextStyle { - MESSAGE, - WINDOW, - WINDOW_ALT, - WINDOW_BATTLE_COMMAND, - BATTLE_INFO, - PARTY, - PARTY_RED, - PARTY_CANCEL_BUTTON, - INSTRUCTIONS_TEXT, - MOVE_LABEL, - SUMMARY, - SUMMARY_DEX_NUM, - SUMMARY_DEX_NUM_GOLD, - SUMMARY_ALT, - SUMMARY_HEADER, - SUMMARY_RED, - SUMMARY_BLUE, - SUMMARY_PINK, - SUMMARY_GOLD, - SUMMARY_GRAY, - SUMMARY_GREEN, - SUMMARY_STATS, - SUMMARY_STATS_BLUE, - SUMMARY_STATS_PINK, - SUMMARY_STATS_GOLD, - LUCK_VALUE, - STATS_HEXAGON, - GROWTH_RATE_TYPE, - MONEY, // Money default styling (pale yellow) - MONEY_WINDOW, // Money displayed in Windows (needs different colors based on theme) - HEADER_LABEL, - STATS_LABEL, - STATS_VALUE, - SETTINGS_VALUE, - SETTINGS_LABEL, - SETTINGS_LABEL_NAVBAR, - SETTINGS_SELECTED, - SETTINGS_LOCKED, - EGG_LIST, - EGG_SUMMARY_NAME, - EGG_SUMMARY_DEX, - STARTER_VALUE_LIMIT, - TOOLTIP_TITLE, - TOOLTIP_CONTENT, - FILTER_BAR_MAIN, - MOVE_INFO_CONTENT, - MOVE_PP_FULL, - MOVE_PP_HALF_FULL, - MOVE_PP_NEAR_EMPTY, - MOVE_PP_EMPTY, - SMALLER_WINDOW_ALT, - BGM_BAR, - PERFECT_IV, - ME_OPTION_DEFAULT, // Default style for choices in ME - ME_OPTION_SPECIAL, // Style for choices with special requirements in ME - SHADOW_TEXT, // To obscure unavailable options -} - -export interface TextStyleOptions { - scale: number; - styleOptions: Phaser.Types.GameObjects.Text.TextStyle | InputText.IConfig; - shadowColor: string; - shadowXpos: number; - shadowYpos: number; -} - export function addTextObject( x: number, y: number, @@ -87,9 +22,10 @@ export function addTextObject( extraStyleOptions, ); - const ret = globalScene.add.text(x, y, content, styleOptions); - ret.setScale(scale); - ret.setShadow(shadowXpos, shadowYpos, shadowColor); + const ret = globalScene.add + .text(x, y, content, styleOptions) + .setScale(scale) + .setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { ret.setLineSpacing(scale * 30); } @@ -107,8 +43,7 @@ export function setTextStyle( globalScene.uiTheme, extraStyleOptions, ); - obj.setScale(scale); - obj.setShadow(shadowXpos, shadowYpos, shadowColor); + obj.setScale(scale).setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as Phaser.Types.GameObjects.Text.TextStyle).lineSpacing) { obj.setLineSpacing(scale * 30); } @@ -133,8 +68,7 @@ export function addBBCodeTextObject( const ret = new BBCodeText(globalScene, x, y, content, styleOptions as BBCodeText.TextStyle); globalScene.add.existing(ret); - ret.setScale(scale); - ret.setShadow(shadowXpos, shadowYpos, shadowColor); + ret.setScale(scale).setShadow(shadowXpos, shadowYpos, shadowColor); if (!(styleOptions as BBCodeText.TextStyle).lineSpacing) { ret.setLineSpacing(scale * 60); } diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index b7c37538a3e..66cb69f6a26 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -5,10 +5,11 @@ import { TimedEventDisplay } from "#app/timed-event-manager"; import { getSplashMessages } from "#data/splash-messages"; import { PlayerGender } from "#enums/player-gender"; import type { SpeciesId } from "#enums/species-id"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { version } from "#package.json"; import { OptionSelectUiHandler } from "#ui/option-select-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { fixedInt, randInt, randItem } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import i18next from "i18next"; diff --git a/src/ui/ui-handler.ts b/src/ui/ui-handler.ts index c7b25c90205..7dde6b22dcd 100644 --- a/src/ui/ui-handler.ts +++ b/src/ui/ui-handler.ts @@ -1,7 +1,7 @@ import { globalScene } from "#app/global-scene"; import type { Button } from "#enums/buttons"; +import type { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; -import type { TextStyle } from "#ui/text"; import { getTextColor } from "#ui/text"; /** diff --git a/src/ui/ui.ts b/src/ui/ui.ts index e9798e6350d..4c8f0613122 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -2,6 +2,7 @@ import { globalScene } from "#app/global-scene"; import type { Button } from "#enums/buttons"; import { Device } from "#enums/devices"; import { PlayerGender } from "#enums/player-gender"; +import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; import { AchvBar } from "#ui/achv-bar"; import { AchvsUiHandler } from "#ui/achvs-ui-handler"; @@ -51,7 +52,7 @@ import { StarterSelectUiHandler } from "#ui/starter-select-ui-handler"; import { SummaryUiHandler } from "#ui/summary-ui-handler"; import { TargetSelectUiHandler } from "#ui/target-select-ui-handler"; import { TestDialogueUiHandler } from "#ui/test-dialogue-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { TitleUiHandler } from "#ui/title-ui-handler"; import type { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; diff --git a/src/ui/unavailable-modal-ui-handler.ts b/src/ui/unavailable-modal-ui-handler.ts index 420a47664a7..5c3dc513473 100644 --- a/src/ui/unavailable-modal-ui-handler.ts +++ b/src/ui/unavailable-modal-ui-handler.ts @@ -1,9 +1,10 @@ import { updateUserInfo } from "#app/account"; import { globalScene } from "#app/global-scene"; +import { TextStyle } from "#enums/text-style"; import type { UiMode } from "#enums/ui-mode"; import type { ModalConfig } from "#ui/modal-ui-handler"; import { ModalUiHandler } from "#ui/modal-ui-handler"; -import { addTextObject, TextStyle } from "#ui/text"; +import { addTextObject } from "#ui/text"; import { sessionIdKey } from "#utils/common"; import { removeCookie } from "#utils/cookies"; import i18next from "i18next"; From f3854abc166bf4ec4137a26864b4726cc0290066 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sun, 27 Jul 2025 16:16:04 -0400 Subject: [PATCH 014/106] [Test] Added custom equality matchers (#6157) * Added rudimentary test matchers for `toEqualArrayUnsorted` and `toHaveTypes` Might port the rest at a later date * Actually run the effing setup matchers file + fixed ls lint to not be angy * added dev dep * Update .ls-lint.yml * Update .ls-lint.yml --------- Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> --- .ls-lint.yml | 4 +- package.json | 1 + pnpm-lock.yaml | 3 + test/@types/vitest.d.ts | 26 ++++++++ test/matchers.setup.ts | 14 ++++ .../matchers/to-equal-array-unsorted.ts | 43 +++++++++++++ test/test-utils/matchers/to-have-types.ts | 64 +++++++++++++++++++ vitest.config.ts | 2 +- 8 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 test/@types/vitest.d.ts create mode 100644 test/matchers.setup.ts create mode 100644 test/test-utils/matchers/to-equal-array-unsorted.ts create mode 100644 test/test-utils/matchers/to-have-types.ts diff --git a/.ls-lint.yml b/.ls-lint.yml index 610218f8ed2..22f08f72938 100644 --- a/.ls-lint.yml +++ b/.ls-lint.yml @@ -11,14 +11,14 @@ _cfg: &cfg ls: <<: *cfg - src: + src: &src <<: *cfg .dir: kebab-case | regex:@types .js: exists:0 src/system/version-migration/versions: .ts: snake_case <<: *cfg - + test: *src ignore: - node_modules - .vscode diff --git a/package.json b/package.json index 9bba5e56f89..02d063389b7 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@types/jsdom": "^21.1.7", "@types/node": "^22.16.3", "@vitest/coverage-istanbul": "^3.2.4", + "@vitest/expect": "^3.2.4", "chalk": "^5.4.1", "dependency-cruiser": "^16.10.4", "inquirer": "^12.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e77bf065fd5..86a7bb904a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,6 +57,9 @@ importers: '@vitest/coverage-istanbul': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0)) + '@vitest/expect': + specifier: ^3.2.4 + version: 3.2.4 chalk: specifier: ^5.4.1 version: 5.4.1 diff --git a/test/@types/vitest.d.ts b/test/@types/vitest.d.ts new file mode 100644 index 00000000000..3a0a0fec9cf --- /dev/null +++ b/test/@types/vitest.d.ts @@ -0,0 +1,26 @@ +import type { Pokemon } from "#field/pokemon"; +import type { PokemonType } from "#enums/pokemon-type"; +import type { expect } from "vitest"; +import { toHaveTypesOptions } from "#test/test-utils/matchers/to-have-types"; + +declare module "vitest" { + interface Assertion { + /** + * Matcher to check if an array contains EXACTLY the given items (in any order). + * + * Different from {@linkcode expect.arrayContaining} as the latter only requires the array contain + * _at least_ the listed items. + * + * @param expected - The expected contents of the array, in any order. + * @see {@linkcode expect.arrayContaining} + */ + toEqualArrayUnsorted(expected: E[]): void; + /** + * Matcher to check if a {@linkcode Pokemon}'s current typing includes the given types. + * + * @param expected - The expected types (in any order). + * @param options - The options passed to the matcher. + */ + toHaveTypes(expected: PokemonType[], options?: toHaveTypesOptions): void; + } +} \ No newline at end of file diff --git a/test/matchers.setup.ts b/test/matchers.setup.ts new file mode 100644 index 00000000000..7fd5fcb463e --- /dev/null +++ b/test/matchers.setup.ts @@ -0,0 +1,14 @@ +import { toEqualArrayUnsorted } from "#test/test-utils/matchers/to-equal-array-unsorted"; +import { toHaveTypes } from "#test/test-utils/matchers/to-have-types"; +import { expect } from "vitest"; + +/** + * @module + * Setup file for custom matchers. + * Make sure to define the call signatures in `test/@types/vitest.d.ts` too! + */ + +expect.extend({ + toEqualArrayUnsorted, + toHaveTypes, +}); diff --git a/test/test-utils/matchers/to-equal-array-unsorted.ts b/test/test-utils/matchers/to-equal-array-unsorted.ts new file mode 100644 index 00000000000..0627623bbd9 --- /dev/null +++ b/test/test-utils/matchers/to-equal-array-unsorted.ts @@ -0,0 +1,43 @@ +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher to check if an array contains exactly the given items, disregarding order. + * @param received - The object to check. Should be an array of elements. + * @returns The result of the matching + */ +export function toEqualArrayUnsorted(this: MatcherState, received: unknown, expected: unknown): SyncExpectationResult { + if (!Array.isArray(received)) { + return { + pass: this.isNot, + message: () => `Expected an array, but got ${this.utils.stringify(received)}!`, + }; + } + + if (!Array.isArray(expected)) { + return { + pass: this.isNot, + message: () => `Expected to recieve an array, but got ${this.utils.stringify(expected)}!`, + }; + } + + if (received.length !== expected.length) { + return { + pass: this.isNot, + message: () => `Expected to recieve array of length ${received.length}, but got ${expected.length}!`, + actual: received, + expected, + }; + } + + const gotSorted = received.slice().sort(); + const wantSorted = expected.slice().sort(); + const pass = this.equals(gotSorted, wantSorted, [...this.customTesters, this.utils.iterableEquality]); + + return { + pass: this.isNot !== pass, + message: () => + `Expected ${this.utils.stringify(received)} to exactly equal ${this.utils.stringify(expected)} without order!`, + actual: gotSorted, + expected: wantSorted, + }; +} diff --git a/test/test-utils/matchers/to-have-types.ts b/test/test-utils/matchers/to-have-types.ts new file mode 100644 index 00000000000..d09f4fc5f76 --- /dev/null +++ b/test/test-utils/matchers/to-have-types.ts @@ -0,0 +1,64 @@ +import { PokemonType } from "#enums/pokemon-type"; +import { Pokemon } from "#field/pokemon"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +export interface toHaveTypesOptions { + /** + * Whether to enforce exact matches (`true`) or superset matches (`false`). + * @defaultValue `true` + */ + exact?: boolean; + /** + * Optional arguments to pass to {@linkcode Pokemon.getTypes}. + */ + args?: Parameters<(typeof Pokemon.prototype)["getTypes"]>; +} + +/** + * Matcher to check if an array contains exactly the given items, disregarding order. + * @param received - The object to check. Should be an array of one or more {@linkcode PokemonType}s. + * @param options - The {@linkcode toHaveTypesOptions | options} for this matcher + * @returns The result of the matching + */ +export function toHaveTypes( + this: MatcherState, + received: unknown, + expected: unknown, + options: toHaveTypesOptions = {}, +): SyncExpectationResult { + if (!(received instanceof Pokemon)) { + return { + pass: this.isNot, + message: () => `Expected a Pokemon, but got ${this.utils.stringify(received)}!`, + }; + } + + if (!Array.isArray(expected) || expected.length === 0) { + return { + pass: this.isNot, + message: () => `Expected to recieve an array with length >=1, but got ${this.utils.stringify(expected)}!`, + }; + } + + if (!expected.every((t): t is PokemonType => t in PokemonType)) { + return { + pass: this.isNot, + message: () => `Expected to recieve array of PokemonTypes but got ${this.utils.stringify(expected)}!`, + }; + } + + const gotSorted = pkmnTypeToStr(received.getTypes(...(options.args ?? []))); + const wantSorted = pkmnTypeToStr(expected.slice()); + const pass = this.equals(gotSorted, wantSorted, [...this.customTesters, this.utils.iterableEquality]); + + return { + pass: this.isNot !== pass, + message: () => `Expected ${received.name} to have types ${this.utils.stringify(wantSorted)}, but got ${gotSorted}!`, + actual: gotSorted, + expected: wantSorted, + }; +} + +function pkmnTypeToStr(p: PokemonType[]): string[] { + return p.sort().map(type => PokemonType[type]); +} diff --git a/vitest.config.ts b/vitest.config.ts index e788302857b..65c5427e591 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -9,7 +9,7 @@ export default defineProject(({ mode }) => ({ TZ: "UTC", }, testTimeout: 20000, - setupFiles: ["./test/font-face.setup.ts", "./test/vitest.setup.ts"], + setupFiles: ["./test/font-face.setup.ts", "./test/vitest.setup.ts", "./test/matchers.setup.ts"], sequence: { sequencer: MySequencer, }, From 7cb2c560abbba0b5c8dad79ef3bc349ccbfc4a55 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 27 Jul 2025 13:32:47 -0700 Subject: [PATCH 015/106] [Misc] Fix import in `vitest.d.ts` --- test/@types/vitest.d.ts | 2 +- test/matchers.setup.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/test/@types/vitest.d.ts b/test/@types/vitest.d.ts index 3a0a0fec9cf..58b36580727 100644 --- a/test/@types/vitest.d.ts +++ b/test/@types/vitest.d.ts @@ -1,7 +1,7 @@ import type { Pokemon } from "#field/pokemon"; import type { PokemonType } from "#enums/pokemon-type"; import type { expect } from "vitest"; -import { toHaveTypesOptions } from "#test/test-utils/matchers/to-have-types"; +import type { toHaveTypesOptions } from "#test/test-utils/matchers/to-have-types"; declare module "vitest" { interface Assertion { diff --git a/test/matchers.setup.ts b/test/matchers.setup.ts index 7fd5fcb463e..03d9dd342e4 100644 --- a/test/matchers.setup.ts +++ b/test/matchers.setup.ts @@ -2,8 +2,7 @@ import { toEqualArrayUnsorted } from "#test/test-utils/matchers/to-equal-array-u import { toHaveTypes } from "#test/test-utils/matchers/to-have-types"; import { expect } from "vitest"; -/** - * @module +/* * Setup file for custom matchers. * Make sure to define the call signatures in `test/@types/vitest.d.ts` too! */ From 29d9bb6e7b554fa21403144f0c80b865c3af67c4 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sun, 27 Jul 2025 16:42:57 -0400 Subject: [PATCH 016/106] [Dev] Turned on `checkJs` in TSConfig; fixed script type errors (#6115) --- biome.jsonc | 7 ++++--- scripts/create-test/create-test.js | 24 +++++++++++++----------- tsconfig.json | 1 + 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/biome.jsonc b/biome.jsonc index d4cb67d33a6..470885a543d 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -177,9 +177,10 @@ } }, - // Overrides to prevent unused import removal inside `overrides.ts` and enums files (for TSDoc linkcodes) + // Overrides to prevent unused import removal inside `overrides.ts` and enums files (for TSDoc linkcodes), + // as well as in all TS files in `scripts/` (which are assumed to be boilerplate templates). { - "includes": ["**/src/overrides.ts", "**/src/enums/**/*"], + "includes": ["**/src/overrides.ts", "**/src/enums/**/*", "**/scripts/**/*.ts"], "linter": { "rules": { "correctness": { @@ -189,7 +190,7 @@ } }, { - "includes": ["**/src/overrides.ts"], + "includes": ["**/src/overrides.ts", "**/scripts/**/*.ts"], "linter": { "rules": { "style": { diff --git a/scripts/create-test/create-test.js b/scripts/create-test/create-test.js index f24aac548fc..c0f27f8891e 100644 --- a/scripts/create-test/create-test.js +++ b/scripts/create-test/create-test.js @@ -44,20 +44,22 @@ function getTestFolderPath(...folders) { * @returns {Promise<{selectedOption: {label: string, dir: string}}>} the selected type */ async function promptTestType() { - const typeAnswer = await inquirer.prompt([ - { - type: "list", - name: "selectedOption", - message: "What type of test would you like to create?", - choices: [...choices.map(choice => ({ name: choice.label, value: choice })), "EXIT"], - }, - ]); + const typeAnswer = await inquirer + .prompt([ + { + type: "list", + name: "selectedOption", + message: "What type of test would you like to create?", + choices: [...choices.map(choice => ({ name: choice.label, value: choice })), { name: "EXIT", value: "N/A" }], + }, + ]) + .then(ans => ans.selectedOption); - if (typeAnswer.selectedOption === "EXIT") { + if (typeAnswer.name === "EXIT") { console.log("Exiting..."); - return process.exit(); + return process.exit(0); } - if (!choices.some(choice => choice.dir === typeAnswer.selectedOption.dir)) { + if (!choices.some(choice => choice.dir === typeAnswer.dir)) { console.error(`Please provide a valid type: (${choices.map(choice => choice.label).join(", ")})!`); return await promptTestType(); } diff --git a/tsconfig.json b/tsconfig.json index 8c53625ce55..1e067dcff03 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,7 @@ "esModuleInterop": true, "strictNullChecks": true, "sourceMap": false, + "checkJs": true, "strict": false, // TODO: Enable this eventually "rootDir": ".", "baseUrl": "./src", From 19730f9cf0345ed54e13c606bca8313c2d1aa0de Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sun, 27 Jul 2025 16:59:03 -0400 Subject: [PATCH 017/106] [Misc] Moved + cleaned up string manipulation functions (#6112) * Added string utility package to replace util functions * Changed string manipulation functions fully over to `change-case` * Fixed missing comma in package.json trailing commas when :( * fixed lockfile * Hopefully re-added all the string utils * fixed package json * Fixed remaining cases of regex + code dupliation * Fixed more bugs and errors * Moved around functions and hopefully fixed the regex issues * Minor renaming * Fixed incorrect casing on setting strings pascal snake case :skull: * ran biome --- src/data/balance/egg-moves.ts | 4 +- src/data/battle-anims.ts | 15 +- src/data/challenge.ts | 99 +++------- src/data/dialogue.ts | 4 +- src/data/moves/move.ts | 5 +- .../mystery-encounters/mystery-encounter.ts | 3 +- src/data/nature.ts | 4 +- src/data/pokemon-species.ts | 21 +- src/data/trainer-names.ts | 4 +- src/data/trainers/trainer-config.ts | 14 +- src/field/trainer.ts | 7 +- src/plugins/i18n.ts | 8 +- src/system/game-data.ts | 4 +- src/ui/admin-ui-handler.ts | 6 +- src/ui/arena-flyout.ts | 7 +- src/ui/bgm-bar.ts | 4 +- src/ui/game-stats-ui-handler.ts | 9 +- src/ui/party-ui-handler.ts | 5 +- src/ui/pokedex-page-ui-handler.ts | 12 +- .../abstract-control-settings-ui-handler.ts | 14 +- .../settings/settings-keyboard-ui-handler.ts | 5 +- src/ui/starter-select-ui-handler.ts | 4 +- src/ui/summary-ui-handler.ts | 6 +- src/utils/common.ts | 105 +--------- src/utils/strings.ts | 179 ++++++++++++++++++ test/setting-menu/helpers/in-game-manip.ts | 14 +- test/setting-menu/helpers/menu-manip.ts | 1 + test/test-utils/helpers/move-helper.ts | 15 +- test/utils/strings.test.ts | 47 +++++ 29 files changed, 342 insertions(+), 283 deletions(-) create mode 100644 src/utils/strings.ts create mode 100644 test/utils/strings.test.ts diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index f5026abe2ef..3475fe4fdea 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -1,8 +1,8 @@ import { allMoves } from "#data/data-lists"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; -import { toReadableString } from "#utils/common"; import { getEnumKeys, getEnumValues } from "#utils/enums"; +import { toTitleCase } from "#utils/strings"; export const speciesEggMoves = { [SpeciesId.BULBASAUR]: [ MoveId.SAPPY_SEED, MoveId.MALIGNANT_CHAIN, MoveId.EARTH_POWER, MoveId.MATCHA_GOTCHA ], @@ -617,7 +617,7 @@ function parseEggMoves(content: string): void { } if (eggMoves.every(m => m === MoveId.NONE)) { - console.warn(`Species ${toReadableString(SpeciesId[species])} could not be parsed, excluding from output...`) + console.warn(`Species ${toTitleCase(SpeciesId[species])} could not be parsed, excluding from output...`) } else { output += `[SpeciesId.${SpeciesId[species]}]: [ ${eggMoves.map(m => `MoveId.${MoveId[m]}`).join(", ")} ],\n`; } diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 0dc8bf4850c..55a3cc4e916 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -7,8 +7,9 @@ import { AnimBlendType, AnimFocus, AnimFrameTarget, ChargeAnim, CommonAnim } fro import { MoveFlags } from "#enums/move-flags"; import { MoveId } from "#enums/move-id"; import type { Pokemon } from "#field/pokemon"; -import { animationFileName, coerceArray, getFrameMs, isNullOrUndefined, type nil } from "#utils/common"; +import { coerceArray, getFrameMs, isNullOrUndefined, type nil } from "#utils/common"; import { getEnumKeys, getEnumValues } from "#utils/enums"; +import { toKebabCase } from "#utils/strings"; import Phaser from "phaser"; export class AnimConfig { @@ -412,7 +413,7 @@ export function initCommonAnims(): Promise { const commonAnimId = commonAnimIds[ca]; commonAnimFetches.push( globalScene - .cachedFetch(`./battle-anims/common-${commonAnimNames[ca].toLowerCase().replace(/_/g, "-")}.json`) + .cachedFetch(`./battle-anims/common-${toKebabCase(commonAnimNames[ca])}.json`) .then(response => response.json()) .then(cas => commonAnims.set(commonAnimId, new AnimConfig(cas))), ); @@ -450,7 +451,7 @@ export function initMoveAnim(move: MoveId): Promise { const fetchAnimAndResolve = (move: MoveId) => { globalScene - .cachedFetch(`./battle-anims/${animationFileName(move)}.json`) + .cachedFetch(`./battle-anims/${toKebabCase(MoveId[move])}.json`) .then(response => { const contentType = response.headers.get("content-type"); if (!response.ok || contentType?.indexOf("application/json") === -1) { @@ -506,7 +507,7 @@ function useDefaultAnim(move: MoveId, defaultMoveAnim: MoveId) { * @remarks use {@linkcode useDefaultAnim} to use a default animation */ function logMissingMoveAnim(move: MoveId, ...optionalParams: any[]) { - const moveName = animationFileName(move); + const moveName = toKebabCase(MoveId[move]); console.warn(`Could not load animation file for move '${moveName}'`, ...optionalParams); } @@ -524,7 +525,7 @@ export async function initEncounterAnims(encounterAnim: EncounterAnim | Encounte } encounterAnimFetches.push( globalScene - .cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/_/g, "-")}.json`) + .cachedFetch(`./battle-anims/encounter-${toKebabCase(encounterAnimNames[anim])}.json`) .then(response => response.json()) .then(cas => encounterAnims.set(anim, new AnimConfig(cas))), ); @@ -548,7 +549,7 @@ export function initMoveChargeAnim(chargeAnim: ChargeAnim): Promise { } else { chargeAnims.set(chargeAnim, null); globalScene - .cachedFetch(`./battle-anims/${ChargeAnim[chargeAnim].toLowerCase().replace(/_/g, "-")}.json`) + .cachedFetch(`./battle-anims/${toKebabCase(ChargeAnim[chargeAnim])}.json`) .then(response => response.json()) .then(ca => { if (Array.isArray(ca)) { @@ -1405,7 +1406,9 @@ export async function populateAnims() { const chargeAnimIds = getEnumValues(ChargeAnim); const commonNamePattern = /name: (?:Common:)?(Opp )?(.*)/; const moveNameToId = {}; + // Exclude MoveId.NONE; for (const move of getEnumValues(MoveId).slice(1)) { + // KARATE_CHOP => KARATECHOP const moveName = MoveId[move].toUpperCase().replace(/_/g, ""); moveNameToId[moveName] = move; } diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 938ee482d01..db4ec931bc2 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -27,6 +27,7 @@ import type { DexAttrProps, GameData } from "#system/game-data"; import { BooleanHolder, type NumberHolder, randSeedItem } from "#utils/common"; import { deepCopy } from "#utils/data"; import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { toCamelCase, toSnakeCase } from "#utils/strings"; import i18next from "i18next"; /** A constant for the default max cost of the starting party before a run */ @@ -67,14 +68,11 @@ export abstract class Challenge { } /** - * Gets the localisation key for the challenge - * @returns {@link string} The i18n key for this challenge + * Gets the localization key for the challenge + * @returns The i18n key for this challenge as camel case. */ geti18nKey(): string { - return Challenges[this.id] - .split("_") - .map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase())) - .join(""); + return toCamelCase(Challenges[this.id]); } /** @@ -105,23 +103,22 @@ export abstract class Challenge { } /** - * Returns the textual representation of a challenge's current value. - * @param overrideValue {@link number} The value to check for. If undefined, gets the current value. - * @returns {@link string} The localised name for the current value. + * Return the textual representation of a challenge's current value. + * @param overrideValue - The value to check for; default {@linkcode this.value} + * @returns The localised text for the current value. */ - getValue(overrideValue?: number): string { - const value = overrideValue ?? this.value; - return i18next.t(`challenges:${this.geti18nKey()}.value.${value}`); + getValue(overrideValue: number = this.value): string { + return i18next.t(`challenges:${this.geti18nKey()}.value.${overrideValue}`); } /** - * Returns the description of a challenge's current value. - * @param overrideValue {@link number} The value to check for. If undefined, gets the current value. - * @returns {@link string} The localised description for the current value. + * Return the description of a challenge's current value. + * @param overrideValue - The value to check for; default {@linkcode this.value} + * @returns The localised description for the current value. */ - getDescription(overrideValue?: number): string { - const value = overrideValue ?? this.value; - return `${i18next.t([`challenges:${this.geti18nKey()}.desc.${value}`, `challenges:${this.geti18nKey()}.desc`])}`; + // TODO: Do we need an override value here? it's currently unused + getDescription(overrideValue: number = this.value): string { + return `${i18next.t([`challenges:${this.geti18nKey()}.desc.${overrideValue}`, `challenges:${this.geti18nKey()}.desc`])}`; } /** @@ -579,31 +576,19 @@ export class SingleGenerationChallenge extends Challenge { return this.value > 0 ? 1 : 0; } - /** - * Returns the textual representation of a challenge's current value. - * @param {value} overrideValue The value to check for. If undefined, gets the current value. - * @returns {string} The localised name for the current value. - */ - getValue(overrideValue?: number): string { - const value = overrideValue ?? this.value; - if (value === 0) { + getValue(overrideValue: number = this.value): string { + if (overrideValue === 0) { return i18next.t("settings:off"); } - return i18next.t(`starterSelectUiHandler:gen${value}`); + return i18next.t(`starterSelectUiHandler:gen${overrideValue}`); } - /** - * Returns the description of a challenge's current value. - * @param {value} overrideValue The value to check for. If undefined, gets the current value. - * @returns {string} The localised description for the current value. - */ - getDescription(overrideValue?: number): string { - const value = overrideValue ?? this.value; - if (value === 0) { + getDescription(overrideValue: number = this.value): string { + if (overrideValue === 0) { return i18next.t("challenges:singleGeneration.desc_default"); } return i18next.t("challenges:singleGeneration.desc", { - gen: i18next.t(`challenges:singleGeneration.gen_${value}`), + gen: i18next.t(`challenges:singleGeneration.gen_${overrideValue}`), }); } @@ -671,29 +656,13 @@ export class SingleTypeChallenge extends Challenge { return this.value > 0 ? 1 : 0; } - /** - * Returns the textual representation of a challenge's current value. - * @param {value} overrideValue The value to check for. If undefined, gets the current value. - * @returns {string} The localised name for the current value. - */ - getValue(overrideValue?: number): string { - if (overrideValue === undefined) { - overrideValue = this.value; - } - return PokemonType[this.value - 1].toLowerCase(); + getValue(overrideValue: number = this.value): string { + return toSnakeCase(PokemonType[overrideValue - 1]); } - /** - * Returns the description of a challenge's current value. - * @param {value} overrideValue The value to check for. If undefined, gets the current value. - * @returns {string} The localised description for the current value. - */ - getDescription(overrideValue?: number): string { - if (overrideValue === undefined) { - overrideValue = this.value; - } - const type = i18next.t(`pokemonInfo:Type.${PokemonType[this.value - 1]}`); - const typeColor = `[color=${TypeColor[PokemonType[this.value - 1]]}][shadow=${TypeShadow[PokemonType[this.value - 1]]}]${type}[/shadow][/color]`; + getDescription(overrideValue: number = this.value): string { + const type = i18next.t(`pokemonInfo:Type.${PokemonType[overrideValue - 1]}`); + const typeColor = `[color=${TypeColor[PokemonType[overrideValue - 1]]}][shadow=${TypeShadow[PokemonType[this.value - 1]]}]${type}[/shadow][/color]`; const defaultDesc = i18next.t("challenges:singleType.desc_default"); const typeDesc = i18next.t("challenges:singleType.desc", { type: typeColor, @@ -832,13 +801,7 @@ export class LowerStarterMaxCostChallenge extends Challenge { super(Challenges.LOWER_MAX_STARTER_COST, 9); } - /** - * @override - */ - getValue(overrideValue?: number): string { - if (overrideValue === undefined) { - overrideValue = this.value; - } + getValue(overrideValue: number = this.value): string { return (DEFAULT_PARTY_MAX_COST - overrideValue).toString(); } @@ -866,13 +829,7 @@ export class LowerStarterPointsChallenge extends Challenge { super(Challenges.LOWER_STARTER_POINTS, 9); } - /** - * @override - */ - getValue(overrideValue?: number): string { - if (overrideValue === undefined) { - overrideValue = this.value; - } + getValue(overrideValue: number = this.value): string { return (DEFAULT_PARTY_MAX_COST - overrideValue).toString(); } diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 406e72ee82b..361d005e83b 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -1,6 +1,7 @@ import { BattleSpec } from "#enums/battle-spec"; import { TrainerType } from "#enums/trainer-type"; import { trainerConfigs } from "#trainers/trainer-config"; +import { capitalizeFirstLetter } from "#utils/strings"; export interface TrainerTypeMessages { encounter?: string | string[]; @@ -1755,8 +1756,7 @@ export function initTrainerTypeDialogue(): void { trainerConfigs[trainerType][`${messageType}Messages`] = messages[0][messageType]; } if (messages.length > 1) { - trainerConfigs[trainerType][`female${messageType.slice(0, 1).toUpperCase()}${messageType.slice(1)}Messages`] = - messages[1][messageType]; + trainerConfigs[trainerType][`female${capitalizeFirstLetter(messageType)}Messages`] = messages[1][messageType]; } } else { trainerConfigs[trainerType][`${messageType}Messages`] = messages[messageType]; diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 779f2d4fc76..965ab23a692 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -87,8 +87,9 @@ import type { AttackMoveResult } from "#types/attack-move-result"; import type { Localizable } from "#types/locales"; import type { ChargingMove, MoveAttrMap, MoveAttrString, MoveClassMap, MoveKindString } from "#types/move-types"; import type { TurnMove } from "#types/turn-move"; -import { BooleanHolder, type Constructor, isNullOrUndefined, NumberHolder, randSeedFloat, randSeedInt, randSeedItem, toDmgValue, toReadableString } from "#utils/common"; +import { BooleanHolder, type Constructor, isNullOrUndefined, NumberHolder, randSeedFloat, randSeedInt, randSeedItem, toDmgValue } from "#utils/common"; import { getEnumValues } from "#utils/enums"; +import { toTitleCase } from "#utils/strings"; import i18next from "i18next"; /** @@ -8137,7 +8138,7 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr { } const type = validTypes[user.randBattleSeedInt(validTypes.length)]; user.summonData.types = [ type ]; - globalScene.phaseManager.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: toReadableString(PokemonType[type]) })); + globalScene.phaseManager.queueMessage(i18next.t("battle:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), type: toTitleCase(PokemonType[type]) })); user.updateInfo(); return true; diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index a2ca2b20ce7..47dfe58cace 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -25,7 +25,8 @@ import { StatusEffectRequirement, WaveRangeRequirement, } from "#mystery-encounters/mystery-encounter-requirements"; -import { capitalizeFirstLetter, coerceArray, isNullOrUndefined, randSeedInt } from "#utils/common"; +import { coerceArray, isNullOrUndefined, randSeedInt } from "#utils/common"; +import { capitalizeFirstLetter } from "#utils/strings"; export interface EncounterStartOfBattleEffect { sourcePokemon?: Pokemon; diff --git a/src/data/nature.ts b/src/data/nature.ts index 41764ec4276..b085faebb80 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -3,7 +3,7 @@ import { EFFECTIVE_STATS, getShortenedStatKey, Stat } from "#enums/stat"; import { TextStyle } from "#enums/text-style"; import { UiTheme } from "#enums/ui-theme"; import { getBBCodeFrag } from "#ui/text"; -import { toReadableString } from "#utils/common"; +import { toTitleCase } from "#utils/strings"; import i18next from "i18next"; export function getNatureName( @@ -13,7 +13,7 @@ export function getNatureName( ignoreBBCode = false, uiTheme: UiTheme = UiTheme.DEFAULT, ): string { - let ret = toReadableString(Nature[nature]); + let ret = toTitleCase(Nature[nature]); //Translating nature if (i18next.exists(`nature:${ret}`)) { ret = i18next.t(`nature:${ret}` as any); diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 4e1c01642cb..dfaa6425ef1 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -29,15 +29,9 @@ import type { Variant, VariantSet } from "#sprites/variant"; import { populateVariantColorCache, variantColorCache, variantData } from "#sprites/variant"; import type { StarterMoveset } from "#system/game-data"; import type { Localizable } from "#types/locales"; -import { - capitalizeString, - isNullOrUndefined, - randSeedFloat, - randSeedGauss, - randSeedInt, - randSeedItem, -} from "#utils/common"; +import { isNullOrUndefined, randSeedFloat, randSeedGauss, randSeedInt, randSeedItem } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { toCamelCase, toPascalCase } from "#utils/strings"; import { argbFromRgba, QuantizerCelebi, rgbaFromArgb } from "@material/material-color-utilities"; import i18next from "i18next"; @@ -91,6 +85,7 @@ export function getPokemonSpeciesForm(species: SpeciesId, formIndex: number): Po return retSpecies; } +// TODO: Clean this up and seriously review alternate means of fusion naming export function getFusedSpeciesName(speciesAName: string, speciesBName: string): string { const fragAPattern = /([a-z]{2}.*?[aeiou(?:y$)\-']+)(.*?)$/i; const fragBPattern = /([a-z]{2}.*?[aeiou(?:y$)\-'])(.*?)$/i; @@ -904,14 +899,14 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable { * @returns the pokemon-form locale key for the single form name ("Alolan Form", "Eternal Flower" etc) */ getFormNameToDisplay(formIndex = 0, append = false): string { - const formKey = this.forms?.[formIndex!]?.formKey; - const formText = capitalizeString(formKey, "-", false, false) || ""; - const speciesName = capitalizeString(SpeciesId[this.speciesId], "_", true, false); + const formKey = this.forms[formIndex]?.formKey ?? ""; + const formText = toPascalCase(formKey); + const speciesName = toCamelCase(SpeciesId[this.speciesId]); let ret = ""; const region = this.getRegion(); if (this.speciesId === SpeciesId.ARCEUS) { - ret = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); + ret = i18next.t(`pokemonInfo:Type.${formText.toUpperCase()}`); } else if ( [ SpeciesFormKey.MEGA, @@ -937,7 +932,7 @@ export class PokemonSpecies extends PokemonSpeciesForm implements Localizable { if (i18next.exists(i18key)) { ret = i18next.t(i18key); } else { - const rootSpeciesName = capitalizeString(SpeciesId[this.getRootSpeciesId()], "_", true, false); + const rootSpeciesName = toCamelCase(SpeciesId[this.getRootSpeciesId()]); const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`; ret = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText; } diff --git a/src/data/trainer-names.ts b/src/data/trainer-names.ts index 6b882d1ddc1..8eafd9f6404 100644 --- a/src/data/trainer-names.ts +++ b/src/data/trainer-names.ts @@ -1,12 +1,12 @@ import { TrainerType } from "#enums/trainer-type"; -import { toReadableString } from "#utils/common"; +import { toPascalSnakeCase } from "#utils/strings"; class TrainerNameConfig { public urls: string[]; public femaleUrls: string[] | null; constructor(type: TrainerType, ...urls: string[]) { - this.urls = urls.length ? urls : [toReadableString(TrainerType[type]).replace(/ /g, "_")]; + this.urls = urls.length ? urls : [toPascalSnakeCase(TrainerType[type])]; } hasGenderVariant(...femaleUrls: string[]): TrainerNameConfig { diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 4e88399bec3..6b3fcf70f80 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -41,15 +41,9 @@ import type { TrainerConfigs, TrainerTierPools, } from "#types/trainer-funcs"; -import { - coerceArray, - isNullOrUndefined, - randSeedInt, - randSeedIntRange, - randSeedItem, - toReadableString, -} from "#utils/common"; +import { coerceArray, isNullOrUndefined, randSeedInt, randSeedIntRange, randSeedItem } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { toSnakeCase, toTitleCase } from "#utils/strings"; import i18next from "i18next"; /** Minimum BST for Pokemon generated onto the Elite Four's teams */ @@ -140,7 +134,7 @@ export class TrainerConfig { constructor(trainerType: TrainerType, allowLegendaries?: boolean) { this.trainerType = trainerType; this.trainerAI = new TrainerAI(); - this.name = toReadableString(TrainerType[this.getDerivedType()]); + this.name = toTitleCase(TrainerType[this.getDerivedType()]); this.battleBgm = "battle_trainer"; this.mixedBattleBgm = "battle_trainer"; this.victoryBgm = "victory_trainer"; @@ -734,7 +728,7 @@ export class TrainerConfig { } // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores. - const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); + const nameForCall = toSnakeCase(this.name); this.name = i18next.t(`trainerNames:${nameForCall}`); // Set the title to "elite_four". (this is the key in the i18n file) diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 7186cc4e928..a8af298e1cf 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -23,6 +23,7 @@ import { } from "#trainers/trainer-party-template"; import { randSeedInt, randSeedItem, randSeedWeightedItem } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { toSnakeCase } from "#utils/strings"; import i18next from "i18next"; export class Trainer extends Phaser.GameObjects.Container { @@ -170,7 +171,7 @@ export class Trainer extends Phaser.GameObjects.Container { const evilTeamTitles = ["grunt"]; if (this.name === "" && evilTeamTitles.some(t => name.toLocaleLowerCase().includes(t))) { // This is a evil team grunt so we localize it by only using the "name" as the title - title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`); + title = i18next.t(`trainerClasses:${toSnakeCase(name)}`); console.log("Localized grunt name: " + title); // Since grunts are not named we can just return the title return title; @@ -187,7 +188,7 @@ export class Trainer extends Phaser.GameObjects.Container { } // Get the localized trainer class name from the i18n file and set it as the title. // This is used for trainer class names, not titles like "Elite Four, Champion, etc." - title = i18next.t(`trainerClasses:${name.toLowerCase().replace(/\s/g, "_")}`); + title = i18next.t(`trainerClasses:${toSnakeCase(name)}`); } // If no specific trainer slot is set. @@ -208,7 +209,7 @@ export class Trainer extends Phaser.GameObjects.Container { if (this.config.titleDouble && this.variant === TrainerVariant.DOUBLE && !this.config.doubleOnly) { title = this.config.titleDouble; - name = i18next.t(`trainerNames:${this.config.nameDouble.toLowerCase().replace(/\s/g, "_")}`); + name = i18next.t(`trainerNames:${toSnakeCase(this.config.nameDouble)}`); } console.log(title ? `${title} ${name}` : name); diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 4ee4aa730fb..89946b2691b 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -1,5 +1,5 @@ import pkg from "#package.json"; -import { camelCaseToKebabCase } from "#utils/common"; +import { toKebabCase } from "#utils/strings"; import i18next from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import HttpBackend from "i18next-http-backend"; @@ -194,14 +194,16 @@ export async function initI18n(): Promise { ], backend: { loadPath(lng: string, [ns]: string[]) { + // Use namespace maps where required let fileName: string; if (namespaceMap[ns]) { fileName = namespaceMap[ns]; } else if (ns.startsWith("mysteryEncounters/")) { - fileName = camelCaseToKebabCase(ns + "Dialogue"); + fileName = toKebabCase(ns + "-dialogue"); // mystery-encounters/a-trainers-test-dialogue } else { - fileName = camelCaseToKebabCase(ns); + fileName = toKebabCase(ns); } + // ex: "./locales/en/move-anims" return `./locales/${lng}/${fileName}.json?v=${pkg.version}`; }, }, diff --git a/src/system/game-data.ts b/src/system/game-data.ts index c52a5155fb4..b148ed4e2ba 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1454,11 +1454,10 @@ export class GameData { reader.onload = (_ => { return e => { - let dataName: string; + let dataName = GameDataType[dataType].toLowerCase(); let dataStr = AES.decrypt(e.target?.result?.toString()!, saveKey).toString(enc.Utf8); // TODO: is this bang correct? let valid = false; try { - dataName = GameDataType[dataType].toLowerCase(); switch (dataType) { case GameDataType.SYSTEM: { dataStr = this.convertSystemDataStr(dataStr); @@ -1493,7 +1492,6 @@ export class GameData { const displayError = (error: string) => globalScene.ui.showText(error, null, () => globalScene.ui.showText("", 0), fixedInt(1500)); - dataName = dataName!; // tell TS compiler that dataName is defined! if (!valid) { return globalScene.ui.showText( diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts index f136aeb5008..e577368363d 100644 --- a/src/ui/admin-ui-handler.ts +++ b/src/ui/admin-ui-handler.ts @@ -6,7 +6,7 @@ import { UiMode } from "#enums/ui-mode"; import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; import type { ModalConfig } from "#ui/modal-ui-handler"; -import { formatText } from "#utils/common"; +import { toTitleCase } from "#utils/strings"; type AdminUiHandlerService = "discord" | "google"; type AdminUiHandlerServiceMode = "Link" | "Unlink"; @@ -21,9 +21,9 @@ export class AdminUiHandler extends FormModalUiHandler { private readonly httpUserNotFoundErrorCode: number = 404; private readonly ERR_REQUIRED_FIELD = (field: string) => { if (field === "username") { - return `${formatText(field)} is required`; + return `${toTitleCase(field)} is required`; } - return `${formatText(field)} Id is required`; + return `${toTitleCase(field)} Id is required`; }; // returns a string saying whether a username has been successfully linked/unlinked to discord/google private readonly SUCCESS_SERVICE_MODE = (service: string, mode: string) => { diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 9a674719202..d2a45646690 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -18,7 +18,8 @@ import { BattleSceneEventType } from "#events/battle-scene"; import { addTextObject } from "#ui/text"; import { TimeOfDayWidget } from "#ui/time-of-day-widget"; import { addWindow, WindowVariant } from "#ui/ui-theme"; -import { fixedInt, formatText, toCamelCaseString } from "#utils/common"; +import { fixedInt } from "#utils/common"; +import { toCamelCase, toTitleCase } from "#utils/strings"; import type { ParseKeys } from "i18next"; import i18next from "i18next"; @@ -49,10 +50,10 @@ export function getFieldEffectText(arenaTagType: string): string { if (!arenaTagType || arenaTagType === ArenaTagType.NONE) { return arenaTagType; } - const effectName = toCamelCaseString(arenaTagType); + const effectName = toCamelCase(arenaTagType); const i18nKey = `arenaFlyout:${effectName}` as ParseKeys; const resultName = i18next.t(i18nKey); - return !resultName || resultName === i18nKey ? formatText(arenaTagType) : resultName; + return !resultName || resultName === i18nKey ? toTitleCase(arenaTagType) : resultName; } export class ArenaFlyout extends Phaser.GameObjects.Container { diff --git a/src/ui/bgm-bar.ts b/src/ui/bgm-bar.ts index fb50e444aa5..e2c6925ec30 100644 --- a/src/ui/bgm-bar.ts +++ b/src/ui/bgm-bar.ts @@ -1,7 +1,7 @@ import { globalScene } from "#app/global-scene"; import { TextStyle } from "#enums/text-style"; import { addTextObject } from "#ui/text"; -import { formatText } from "#utils/common"; +import { toTitleCase } from "#utils/strings"; import i18next from "i18next"; const hiddenX = -150; @@ -101,7 +101,7 @@ export class BgmBar extends Phaser.GameObjects.Container { getRealBgmName(bgmName: string): string { return i18next.t([`bgmName:${bgmName}`, "bgmName:missing_entries"], { - name: formatText(bgmName), + name: toTitleCase(bgmName), }); } } diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index fa5cd0a989a..ed66230bed7 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -8,7 +8,8 @@ import type { GameData } from "#system/game-data"; import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; -import { formatFancyLargeNumber, getPlayTimeString, toReadableString } from "#utils/common"; +import { formatFancyLargeNumber, getPlayTimeString } from "#utils/common"; +import { toTitleCase } from "#utils/strings"; import i18next from "i18next"; import Phaser from "phaser"; @@ -502,11 +503,9 @@ export function initStatsKeys() { sourceFunc: gameData => gameData.gameStats[key].toString(), }; } - if (!(displayStats[key] as DisplayStat).label_key) { + if (!displayStats[key].label_key) { const splittableKey = key.replace(/([a-z]{2,})([A-Z]{1}(?:[^A-Z]|$))/g, "$1_$2"); - (displayStats[key] as DisplayStat).label_key = toReadableString( - `${splittableKey[0].toUpperCase()}${splittableKey.slice(1)}`, - ); + displayStats[key].label_key = toTitleCase(splittableKey); } } } diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 2b29a564f9f..915cc76fd73 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -26,7 +26,8 @@ import { MoveInfoOverlay } from "#ui/move-info-overlay"; import { PokemonIconAnimHandler, PokemonIconAnimMode } from "#ui/pokemon-icon-anim-handler"; import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; -import { BooleanHolder, getLocalizedSpriteKey, randInt, toReadableString } from "#utils/common"; +import { BooleanHolder, getLocalizedSpriteKey, randInt } from "#utils/common"; +import { toTitleCase } from "#utils/strings"; import i18next from "i18next"; import type BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; @@ -1409,7 +1410,7 @@ export class PartyUiHandler extends MessageUiHandler { if (this.localizedOptions.includes(option)) { optionName = i18next.t(`partyUiHandler:${PartyOption[option]}`); } else { - optionName = toReadableString(PartyOption[option]); + optionName = toTitleCase(PartyOption[option]); } } break; diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index b3eb8de0f50..49ce5b64d9f 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -54,16 +54,10 @@ import { PokedexInfoOverlay } from "#ui/pokedex-info-overlay"; import { StatsContainer } from "#ui/stats-container"; import { addBBCodeTextObject, addTextObject, getTextColor, getTextStyleOptions } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; -import { - BooleanHolder, - getLocalizedSpriteKey, - isNullOrUndefined, - padInt, - rgbHexToRgba, - toReadableString, -} from "#utils/common"; +import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, padInt, rgbHexToRgba } from "#utils/common"; import { getEnumValues } from "#utils/enums"; import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { toTitleCase } from "#utils/strings"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; import type BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText"; @@ -2620,7 +2614,7 @@ export class PokedexPageUiHandler extends MessageUiHandler { // Setting growth rate text if (isFormCaught) { - let growthReadable = toReadableString(GrowthRate[species.growthRate]); + let growthReadable = toTitleCase(GrowthRate[species.growthRate]); const growthAux = growthReadable.replace(" ", "_"); if (i18next.exists("growth:" + growthAux)) { growthReadable = i18next.t(("growth:" + growthAux) as any); diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 8f7de42e4db..ee9e990ee2a 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -10,6 +10,7 @@ import { ScrollBar } from "#ui/scroll-bar"; import { addTextObject } from "#ui/text"; import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; +import { toCamelCase } from "#utils/strings"; import i18next from "i18next"; export interface InputsIcons { @@ -88,12 +89,6 @@ export abstract class AbstractControlSettingsUiHandler extends UiHandler { return settings; } - private camelize(string: string): string { - return string - .replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => (index === 0 ? word.toLowerCase() : word.toUpperCase())) - .replace(/\s+/g, ""); - } - /** * Setup UI elements. */ @@ -210,14 +205,15 @@ export abstract class AbstractControlSettingsUiHandler extends UiHandler { settingFiltered.forEach((setting, s) => { // Convert the setting key from format 'Key_Name' to 'Key name' for display. - const settingName = setting.replace(/_/g, " "); + // TODO: IDK if this can be followed by both an underscore and a space, so leaving it as a regex matching both for now + const i18nKey = toCamelCase(setting.replace(/Alt(_| )/, "")); // Create and add a text object for the setting name to the scene. const isLock = this.settingBlacklisted.includes(this.setting[setting]); const labelStyle = isLock ? TextStyle.SETTINGS_LOCKED : TextStyle.SETTINGS_LABEL; + const isAlt = setting.includes("Alt"); let labelText: string; - const i18nKey = this.camelize(settingName.replace("Alt ", "")); - if (settingName.toLowerCase().includes("alt")) { + if (isAlt) { labelText = `${i18next.t(`settings:${i18nKey}`)}${i18next.t("settings:alt")}`; } else { labelText = i18next.t(`settings:${i18nKey}`); diff --git a/src/ui/settings/settings-keyboard-ui-handler.ts b/src/ui/settings/settings-keyboard-ui-handler.ts index ad4bf47f673..295a71abe36 100644 --- a/src/ui/settings/settings-keyboard-ui-handler.ts +++ b/src/ui/settings/settings-keyboard-ui-handler.ts @@ -15,7 +15,8 @@ import { import { AbstractControlSettingsUiHandler } from "#ui/abstract-control-settings-ui-handler"; import { NavigationManager } from "#ui/navigation-menu"; import { addTextObject } from "#ui/text"; -import { reverseValueToKeySetting, truncateString } from "#utils/common"; +import { truncateString } from "#utils/common"; +import { toPascalSnakeCase } from "#utils/strings"; import i18next from "i18next"; /** @@ -101,7 +102,7 @@ export class SettingsKeyboardUiHandler extends AbstractControlSettingsUiHandler } const cursor = this.cursor + this.scrollCursor; // Calculate the absolute cursor position. const selection = this.settingLabels[cursor].text; - const key = reverseValueToKeySetting(selection); + const key = toPascalSnakeCase(selection); const settingName = SettingKeyboard[key]; const activeConfig = this.getActiveConfig(); const success = deleteBind(this.getActiveConfig(), settingName); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 82e19d857c5..e8f9b5e1c38 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -69,10 +69,10 @@ import { padInt, randIntRange, rgbHexToRgba, - toReadableString, } from "#utils/common"; import type { StarterPreferences } from "#utils/data"; import { loadStarterPreferences, saveStarterPreferences } from "#utils/data"; +import { toTitleCase } from "#utils/strings"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; import type { GameObjects } from "phaser"; @@ -3527,7 +3527,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); //Growth translate - let growthReadable = toReadableString(GrowthRate[species.growthRate]); + let growthReadable = toTitleCase(GrowthRate[species.growthRate]); const growthAux = growthReadable.replace(" ", "_"); if (i18next.exists("growth:" + growthAux)) { growthReadable = i18next.t(("growth:" + growthAux) as any); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index c5c714f0b34..b51bdfdb157 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -35,9 +35,9 @@ import { isNullOrUndefined, padInt, rgbHexToRgba, - toReadableString, } from "#utils/common"; import { getEnumValues } from "#utils/enums"; +import { toTitleCase } from "#utils/strings"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; @@ -962,8 +962,8 @@ export class SummaryUiHandler extends UiHandler { this.passiveContainer?.descriptionText?.setVisible(false); const closeFragment = getBBCodeFrag("", TextStyle.WINDOW_ALT); - const rawNature = toReadableString(Nature[this.pokemon?.getNature()!]); // TODO: is this bang correct? - const nature = `${getBBCodeFrag(toReadableString(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? + const rawNature = toTitleCase(Nature[this.pokemon?.getNature()!]); // TODO: is this bang correct? + const nature = `${getBBCodeFrag(toTitleCase(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? const memoString = i18next.t("pokemonSummary:memoString", { metFragment: i18next.t( diff --git a/src/utils/common.ts b/src/utils/common.ts index e9ba3acb5e5..66a74ed2c33 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1,6 +1,5 @@ import { pokerogueApi } from "#api/pokerogue-api"; import { MoneyFormat } from "#enums/money-format"; -import { MoveId } from "#enums/move-id"; import type { Variant } from "#sprites/variant"; import i18next from "i18next"; @@ -10,19 +9,6 @@ export const MissingTextureKey = "__MISSING"; // TODO: Draft tests for these utility functions // TODO: Break up this file -/** - * Convert a `snake_case` string in any capitalization (such as one from an enum reverse mapping) - * into a readable `Title Case` version. - * @param str - The snake case string to be converted. - * @returns The result of converting `str` into title case. - */ -export function toReadableString(str: string): string { - return str - .replace(/_/g, " ") - .split(" ") - .map(s => capitalizeFirstLetter(s.toLowerCase())) - .join(" "); -} export function randomString(length: number, seeded = false) { const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; @@ -278,7 +264,7 @@ export function formatMoney(format: MoneyFormat, amount: number) { } export function formatStat(stat: number, forHp = false): string { - return formatLargeNumber(stat, forHp ? 100000 : 1000000); + return formatLargeNumber(stat, forHp ? 100_000 : 1_000_000); } export function executeIf(condition: boolean, promiseFunc: () => Promise): Promise { @@ -359,31 +345,6 @@ export function fixedInt(value: number): number { return new FixedInt(value) as unknown as number; } -/** - * Formats a string to title case - * @param unformattedText Text to be formatted - * @returns the formatted string - */ -export function formatText(unformattedText: string): string { - const text = unformattedText.split("_"); - for (let i = 0; i < text.length; i++) { - text[i] = text[i].charAt(0).toUpperCase() + text[i].substring(1).toLowerCase(); - } - - return text.join(" "); -} - -export function toCamelCaseString(unformattedText: string): string { - if (!unformattedText) { - return ""; - } - return unformattedText - .split(/[_ ]/) - .filter(f => f) - .map((f, i) => (i ? `${f[0].toUpperCase()}${f.slice(1).toLowerCase()}` : f.toLowerCase())) - .join(""); -} - export function rgbToHsv(r: number, g: number, b: number) { const v = Math.max(r, g, b); const c = v - Math.min(r, g, b); @@ -510,41 +471,6 @@ export function truncateString(str: string, maxLength = 10) { return str; } -/** - * Convert a space-separated string into a capitalized and underscored string. - * @param input - The string to be converted. - * @returns The converted string with words capitalized and separated by underscores. - */ -export function reverseValueToKeySetting(input: string) { - // Split the input string into an array of words - const words = input.split(" "); - // Capitalize the first letter of each word and convert the rest to lowercase - const capitalizedWords = words.map((word: string) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()); - // Join the capitalized words with underscores and return the result - return capitalizedWords.join("_"); -} - -/** - * Capitalize a string. - * @param str - The string to be capitalized. - * @param sep - The separator between the words of the string. - * @param lowerFirstChar - Whether the first character of the string should be lowercase or not. - * @param returnWithSpaces - Whether the returned string should have spaces between the words or not. - * @returns The capitalized string. - */ -export function capitalizeString(str: string, sep: string, lowerFirstChar = true, returnWithSpaces = false) { - if (str) { - const splitedStr = str.toLowerCase().split(sep); - - for (let i = +lowerFirstChar; i < splitedStr?.length; i++) { - splitedStr[i] = splitedStr[i].charAt(0).toUpperCase() + splitedStr[i].substring(1); - } - - return returnWithSpaces ? splitedStr.join(" ") : splitedStr.join(""); - } - return null; -} - /** * Report whether a given value is nullish (`null`/`undefined`). * @param val - The value whose nullishness is being checked @@ -554,15 +480,6 @@ export function isNullOrUndefined(val: any): val is null | undefined { return val === null || val === undefined; } -/** - * Capitalize the first letter of a string. - * @param str - The string whose first letter is being capitalized - * @return The original string with its first letter capitalized - */ -export function capitalizeFirstLetter(str: string) { - return str.charAt(0).toUpperCase() + str.slice(1); -} - /** * This function is used in the context of a Pokémon battle game to calculate the actual integer damage value from a float result. * Many damage calculation formulas involve various parameters and result in float values. @@ -597,26 +514,6 @@ export function isBetween(num: number, min: number, max: number): boolean { return min <= num && num <= max; } -/** - * Helper method to return the animation filename for a given move - * - * @param move the move for which the animation filename is needed - */ -export function animationFileName(move: MoveId): string { - return MoveId[move].toLowerCase().replace(/_/g, "-"); -} - -/** - * Transforms a camelCase string into a kebab-case string - * @param str The camelCase string - * @returns A kebab-case string - * - * @source {@link https://stackoverflow.com/a/67243723/} - */ -export function camelCaseToKebabCase(str: string): string { - return str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, (s, o) => (o ? "-" : "") + s.toLowerCase()); -} - /** Get the localized shiny descriptor for the provided variant * @param variant - The variant to get the shiny descriptor for * @returns The localized shiny descriptor diff --git a/src/utils/strings.ts b/src/utils/strings.ts new file mode 100644 index 00000000000..dfa3d7c887f --- /dev/null +++ b/src/utils/strings.ts @@ -0,0 +1,179 @@ +// TODO: Standardize file and path casing to remove the need for all these different casing methods + +// #region Split string code + +// Regexps involved with splitting words in various case formats. +// Sourced from https://www.npmjs.com/package/change-case (with slight tweaking here and there) + +/** Regex to split at word boundaries.*/ +const SPLIT_LOWER_UPPER_RE = /([\p{Ll}\d])(\p{Lu})/gu; +/** Regex to split around single-letter uppercase words.*/ +const SPLIT_UPPER_UPPER_RE = /(\p{Lu})([\p{Lu}][\p{Ll}])/gu; +/** Regexp involved with stripping non-word delimiters from the result. */ +const DELIM_STRIP_REGEXP = /[-_ ]+/giu; +// The replacement value for splits. +const SPLIT_REPLACE_VALUE = "$1\0$2"; + +/** + * Split any cased string into an array of its constituent words. + * @param string - The string to be split + * @returns The new string, delimited at each instance of one or more spaces, underscores, hyphens + * or lower-to-upper boundaries. + * @remarks + * **DO NOT USE THIS FUNCTION!** + * Exported only to allow for testing. + * @todo Consider tests into [in-source testing](https://vitest.dev/guide/in-source.html) and converting this to unexported + */ +export function splitWords(value: string): string[] { + let result = value.trim(); + result = result.replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE).replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE); + result = result.replace(DELIM_STRIP_REGEXP, "\0"); + + // Trim the delimiter from around the output string + return trimFromStartAndEnd(result, "\0").split(/\0/g); +} + +/** + * Helper function to remove one or more sequences of characters from either end of a string. + * @param str - The string to replace + * @param charToTrim - The string to remove + * @returns The result of removing all instances of {@linkcode charsToTrim} from either end of {@linkcode str}. + */ +function trimFromStartAndEnd(str: string, charToTrim: string): string { + let start = 0; + let end = str.length; + const blockLength = charToTrim.length; + + while (str.startsWith(charToTrim, start)) { + start += blockLength; + } + if (start - end === blockLength) { + // Occurs if the ENTIRE string is made up of charToTrim (at which point we return nothing) + return ""; + } + while (str.endsWith(charToTrim, end)) { + end -= blockLength; + } + return str.slice(start, end); +} + +// #endregion Split String code + +/** + * Capitalize the first letter of a string. + * @param str - The string whose first letter is to be capitalized + * @return The original string with its first letter capitalized. + * @example + * ```ts + * console.log(capitalizeFirstLetter("consectetur adipiscing elit")); // returns "Consectetur adipiscing elit" + * ``` + */ +export function capitalizeFirstLetter(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +/** + * Helper method to convert a string into `Title Case` (such as one used for console logs). + * @param str - The string being converted + * @returns The result of converting `str` into title case. + * @example + * ```ts + * console.log(toTitleCase("lorem ipsum dolor sit amet")); // returns "Lorem Ipsum Dolor Sit Amet" + * ``` + */ +export function toTitleCase(str: string): string { + return splitWords(str) + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(" "); +} + +/** + * Helper method to convert a string into `camelCase` (such as one used for i18n keys). + * @param str - The string being converted + * @returns The result of converting `str` into camel case. + * @example + * ```ts + * console.log(toCamelCase("BIG_ANGRY_TRAINER")); // returns "bigAngryTrainer" + * ``` + */ +export function toCamelCase(str: string) { + return splitWords(str) + .map((word, index) => (index === 0 ? word.toLowerCase() : capitalizeFirstLetter(word))) + .join(""); +} + +/** + * Helper method to convert a string into `PascalCase`. + * @param str - The string being converted + * @returns The result of converting `str` into pascal case. + * @example + * ```ts + * console.log(toPascalCase("hi how was your day")); // returns "HiHowWasYourDay" + * ``` + * @remarks + */ +export function toPascalCase(str: string) { + return splitWords(str) + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(""); +} + +/** + * Helper method to convert a string into `kebab-case` (such as one used for filenames). + * @param str - The string being converted + * @returns The result of converting `str` into kebab case. + * @example + * ```ts + * console.log(toKebabCase("not_kebab-caSe String")); // returns "not-kebab-case-string" + * ``` + */ +export function toKebabCase(str: string): string { + return splitWords(str) + .map(word => word.toLowerCase()) + .join("-"); +} + +/** + * Helper method to convert a string into `snake_case` (such as one used for filenames). + * @param str - The string being converted + * @returns The result of converting `str` into snake case. + * @example + * ```ts + * console.log(toSnakeCase("not-in snake_CaSe")); // returns "not_in_snake_case" + * ``` + */ +export function toSnakeCase(str: string) { + return splitWords(str) + .map(word => word.toLowerCase()) + .join("_"); +} + +/** + * Helper method to convert a string into `UPPER_SNAKE_CASE`. + * @param str - The string being converted + * @returns The result of converting `str` into upper snake case. + * @example + * ```ts + * console.log(toUpperSnakeCase("apples bananas_oranGes-PearS")); // returns "APPLES_BANANAS_ORANGES_PEARS" + * ``` + */ +export function toUpperSnakeCase(str: string) { + return splitWords(str) + .map(word => word.toUpperCase()) + .join("_"); +} + +/** + * Helper method to convert a string into `Pascal_Snake_Case`. + * @param str - The string being converted + * @returns The result of converting `str` into pascal snake case. + * @example + * ```ts + * console.log(toPascalSnakeCase("apples-bananas_oranGes Pears")); // returns "Apples_Bananas_Oranges_Pears" + * ``` + */ +export function toPascalSnakeCase(str: string) { + return splitWords(str) + .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join("_"); +} diff --git a/test/setting-menu/helpers/in-game-manip.ts b/test/setting-menu/helpers/in-game-manip.ts index acc119b2cc2..2f4350bab5c 100644 --- a/test/setting-menu/helpers/in-game-manip.ts +++ b/test/setting-menu/helpers/in-game-manip.ts @@ -1,5 +1,6 @@ import { getIconForLatestInput, getSettingNameWithKeycode } from "#inputs/config-handler"; import { SettingKeyboard } from "#system/settings-keyboard"; +import { toPascalSnakeCase } from "#utils/strings"; import { expect } from "vitest"; export class InGameManip { @@ -56,22 +57,11 @@ export class InGameManip { return this; } - normalizeSettingNameString(input) { - // Convert the input string to lower case - const lowerCasedInput = input.toLowerCase(); - - // Replace underscores with spaces, capitalize the first letter of each word, and join them back with underscores - const words = lowerCasedInput.split("_").map(word => word.charAt(0).toUpperCase() + word.slice(1)); - const result = words.join("_"); - - return result; - } - weShouldTriggerTheButton(settingName) { if (!settingName.includes("Button_")) { settingName = "Button_" + settingName; } - this.settingName = SettingKeyboard[this.normalizeSettingNameString(settingName)]; + this.settingName = SettingKeyboard[toPascalSnakeCase(settingName)]; expect(getSettingNameWithKeycode(this.config, this.keycode)).toEqual(this.settingName); return this; } diff --git a/test/setting-menu/helpers/menu-manip.ts b/test/setting-menu/helpers/menu-manip.ts index 29e096608f1..276fef2f973 100644 --- a/test/setting-menu/helpers/menu-manip.ts +++ b/test/setting-menu/helpers/menu-manip.ts @@ -29,6 +29,7 @@ export class MenuManip { this.specialCaseIcon = null; } + // TODO: Review this convertNameToButtonString(input) { // Check if the input starts with "Alt_Button" if (input.startsWith("Alt_Button")) { diff --git a/test/test-utils/helpers/move-helper.ts b/test/test-utils/helpers/move-helper.ts index 4fa14b573ab..15605edf31d 100644 --- a/test/test-utils/helpers/move-helper.ts +++ b/test/test-utils/helpers/move-helper.ts @@ -12,7 +12,8 @@ import type { CommandPhase } from "#phases/command-phase"; import type { EnemyCommandPhase } from "#phases/enemy-command-phase"; import { MoveEffectPhase } from "#phases/move-effect-phase"; import { GameManagerHelper } from "#test/test-utils/helpers/game-manager-helper"; -import { coerceArray, toReadableString } from "#utils/common"; +import { coerceArray } from "#utils/common"; +import { toTitleCase } from "#utils/strings"; import type { MockInstance } from "vitest"; import { expect, vi } from "vitest"; @@ -66,12 +67,12 @@ export class MoveHelper extends GameManagerHelper { const movePosition = this.getMovePosition(pkmIndex, move); if (movePosition === -1) { expect.fail( - `MoveHelper.select called with move '${toReadableString(MoveId[move])}' not in moveset!` + - `\nBattler Index: ${toReadableString(BattlerIndex[pkmIndex])}` + + `MoveHelper.select called with move '${toTitleCase(MoveId[move])}' not in moveset!` + + `\nBattler Index: ${toTitleCase(BattlerIndex[pkmIndex])}` + `\nMoveset: [${this.game.scene .getPlayerParty() [pkmIndex].getMoveset() - .map(pm => toReadableString(MoveId[pm.moveId])) + .map(pm => toTitleCase(MoveId[pm.moveId])) .join(", ")}]`, ); } @@ -110,12 +111,12 @@ export class MoveHelper extends GameManagerHelper { const movePosition = this.getMovePosition(pkmIndex, move); if (movePosition === -1) { expect.fail( - `MoveHelper.selectWithTera called with move '${toReadableString(MoveId[move])}' not in moveset!` + - `\nBattler Index: ${toReadableString(BattlerIndex[pkmIndex])}` + + `MoveHelper.selectWithTera called with move '${toTitleCase(MoveId[move])}' not in moveset!` + + `\nBattler Index: ${toTitleCase(BattlerIndex[pkmIndex])}` + `\nMoveset: [${this.game.scene .getPlayerParty() [pkmIndex].getMoveset() - .map(pm => toReadableString(MoveId[pm.moveId])) + .map(pm => toTitleCase(MoveId[pm.moveId])) .join(", ")}]`, ); } diff --git a/test/utils/strings.test.ts b/test/utils/strings.test.ts new file mode 100644 index 00000000000..3d6eb235ba8 --- /dev/null +++ b/test/utils/strings.test.ts @@ -0,0 +1,47 @@ +import { splitWords } from "#utils/strings"; +import { describe, expect, it } from "vitest"; + +interface testCase { + input: string; + words: string[]; +} + +const testCases: testCase[] = [ + { + input: "Lorem ipsum dolor sit amet", + words: ["Lorem", "ipsum", "dolor", "sit", "amet"], + }, + { + input: "consectetur-adipiscing-elit", + words: ["consectetur", "adipiscing", "elit"], + }, + { + input: "sed_do_eiusmod_tempor_incididunt_ut_labore", + words: ["sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore"], + }, + { + input: "Et Dolore Magna Aliqua", + words: ["Et", "Dolore", "Magna", "Aliqua"], + }, + { + input: "BIG_ANGRY_TRAINER", + words: ["BIG", "ANGRY", "TRAINER"], + }, + { + input: "ApplesBananasOrangesAndAPear", + words: ["Apples", "Bananas", "Oranges", "And", "A", "Pear"], + }, + { + input: "mysteryEncounters/anOfferYouCantRefuse", + words: ["mystery", "Encounters/an", "Offer", "You", "Cant", "Refuse"], + }, +]; + +describe("Utils - Casing -", () => { + describe("splitWords", () => { + it.each(testCases)("should split a string into its constituent words - $input", ({ input, words }) => { + const ret = splitWords(input); + expect(ret).toEqual(words); + }); + }); +}); From c0e755c3c3344a0d9f703cf6b78b5e267d4d8e95 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 27 Jul 2025 19:01:44 -0600 Subject: [PATCH 018/106] [Refactor] Prevent serialization of full species in pokemon summon data https://github.com/pagefaultgames/pokerogue/pull/6145 * Prevent serialization of entire species form in pokemon summon data * Apply suggestions from code review Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Apply Kev's suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --------- Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/@types/type-helpers.ts | 11 +++ src/data/pokemon/pokemon-data.ts | 132 ++++++++++++++++++++++++++++++- 2 files changed, 141 insertions(+), 2 deletions(-) diff --git a/src/@types/type-helpers.ts b/src/@types/type-helpers.ts index 3a5c88e3f15..b3e5b1cfc07 100644 --- a/src/@types/type-helpers.ts +++ b/src/@types/type-helpers.ts @@ -75,3 +75,14 @@ export type NonFunctionPropertiesRecursive = { }; export type AbstractConstructor = abstract new (...args: any[]) => T; + +/** + * Type helper that iterates through the fields of the type and coerces any `null` properties to `undefined` (including in union types). + * + * @remarks + * This is primarily useful when an object with nullable properties wants to be serialized and have its `null` + * properties coerced to `undefined`. + */ +export type CoerceNullPropertiesToUndefined = { + [K in keyof T]: null extends T[K] ? Exclude | undefined : T[K]; +}; diff --git a/src/data/pokemon/pokemon-data.ts b/src/data/pokemon/pokemon-data.ts index 6ae86bed5e7..a2a0138a17a 100644 --- a/src/data/pokemon/pokemon-data.ts +++ b/src/data/pokemon/pokemon-data.ts @@ -1,18 +1,29 @@ import { type BattlerTag, loadBattlerTag } from "#data/battler-tags"; +import { allSpecies } from "#data/data-lists"; import type { Gender } from "#data/gender"; import { PokemonMove } from "#data/moves/pokemon-move"; -import type { PokemonSpeciesForm } from "#data/pokemon-species"; +import { getPokemonSpeciesForm, type PokemonSpeciesForm } from "#data/pokemon-species"; import type { TypeDamageMultiplier } from "#data/type"; import type { AbilityId } from "#enums/ability-id"; import type { BerryType } from "#enums/berry-type"; import type { MoveId } from "#enums/move-id"; import type { Nature } from "#enums/nature"; import type { PokemonType } from "#enums/pokemon-type"; +import type { SpeciesId } from "#enums/species-id"; import type { AttackMoveResult } from "#types/attack-move-result"; import type { IllusionData } from "#types/illusion-data"; import type { TurnMove } from "#types/turn-move"; +import type { CoerceNullPropertiesToUndefined } from "#types/type-helpers"; import { isNullOrUndefined } from "#utils/common"; +/** + * The type that {@linkcode PokemonSpeciesForm} is converted to when an object containing it serializes it. + */ +type SerializedSpeciesForm = { + id: SpeciesId; + formIdx: number; +}; + /** * Permanent data that can customize a Pokemon in non-standard ways from its Species. * Includes abilities, nature, changed types, etc. @@ -41,9 +52,59 @@ export class CustomPokemonData { } } +/** + * Deserialize a pokemon species form from an object containing `id` and `formIdx` properties. + * @param value - The value to deserialize + * @returns The `PokemonSpeciesForm` or `null` if the fields could not be properly discerned + */ +function deserializePokemonSpeciesForm(value: SerializedSpeciesForm | PokemonSpeciesForm): PokemonSpeciesForm | null { + // @ts-expect-error: We may be deserializing a PokemonSpeciesForm, but we catch later on + let { id, formIdx } = value; + + if (isNullOrUndefined(id) || isNullOrUndefined(formIdx)) { + // @ts-expect-error: Typescript doesn't know that in block, `value` must be a PokemonSpeciesForm + id = value.speciesId; + // @ts-expect-error: Same as above (plus we are accessing a protected property) + formIdx = value._formIndex; + } + // If for some reason either of these fields are null/undefined, we cannot reconstruct the species form + if (isNullOrUndefined(id) || isNullOrUndefined(formIdx)) { + return null; + } + return getPokemonSpeciesForm(id, formIdx); +} + +interface SerializedIllusionData extends Omit { + /** The id of the illusioned fusion species, or `undefined` if not a fusion */ + fusionSpecies?: SpeciesId; +} + +interface SerializedPokemonSummonData { + statStages: number[]; + moveQueue: TurnMove[]; + tags: BattlerTag[]; + abilitySuppressed: boolean; + speciesForm?: SerializedSpeciesForm; + fusionSpeciesForm?: SerializedSpeciesForm; + ability?: AbilityId; + passiveAbility?: AbilityId; + gender?: Gender; + fusionGender?: Gender; + stats: number[]; + moveset?: PokemonMove[]; + types: PokemonType[]; + addedType?: PokemonType; + illusion?: SerializedIllusionData; + illusionBroken: boolean; + berriesEatenLast: BerryType[]; + moveHistory: TurnMove[]; +} + /** * Persistent in-battle data for a {@linkcode Pokemon}. * Resets on switch or new battle. + * + * @sealed */ export class PokemonSummonData { /** [Atk, Def, SpAtk, SpDef, Spd, Acc, Eva] */ @@ -86,7 +147,7 @@ export class PokemonSummonData { */ public moveHistory: TurnMove[] = []; - constructor(source?: PokemonSummonData | Partial) { + constructor(source?: PokemonSummonData | SerializedPokemonSummonData) { if (isNullOrUndefined(source)) { return; } @@ -97,6 +158,30 @@ export class PokemonSummonData { continue; } + if (key === "speciesForm" || key === "fusionSpeciesForm") { + this[key] = deserializePokemonSpeciesForm(value); + } + + if (key === "illusion" && typeof value === "object") { + // Make a copy so as not to mutate provided value + const illusionData = { + ...value, + }; + if (!isNullOrUndefined(illusionData.fusionSpecies)) { + switch (typeof illusionData.fusionSpecies) { + case "object": + illusionData.fusionSpecies = allSpecies[illusionData.fusionSpecies.speciesId]; + break; + case "number": + illusionData.fusionSpecies = allSpecies[illusionData.fusionSpecies]; + break; + default: + illusionData.fusionSpecies = undefined; + } + } + this[key] = illusionData as IllusionData; + } + if (key === "moveset") { this.moveset = value?.map((m: any) => PokemonMove.loadMove(m)); continue; @@ -110,6 +195,49 @@ export class PokemonSummonData { this[key] = value; } } + + /** + * Serialize this PokemonSummonData to JSON, converting {@linkcode PokemonSpeciesForm} and {@linkcode IllusionData.fusionSpecies} + * into simpler types instead of serializing all of their fields. + * + * @remarks + * - `IllusionData.fusionSpecies` is serialized as just the species ID + * - `PokemonSpeciesForm` and `PokemonSpeciesForm.fusionSpeciesForm` are converted into {@linkcode SerializedSpeciesForm} objects + */ + public toJSON(): SerializedPokemonSummonData { + // Pokemon species forms are never saved, only the species ID. + const illusion = this.illusion; + const speciesForm = this.speciesForm; + const fusionSpeciesForm = this.fusionSpeciesForm; + const illusionSpeciesForm = illusion?.fusionSpecies; + const t = { + // the "as omit" is required to avoid TS resolving the overwritten properties to "never" + // We coerce null to undefined in the type, as the for loop below replaces `null` with `undefined` + ...(this as Omit< + CoerceNullPropertiesToUndefined, + "speciesForm" | "fusionSpeciesForm" | "illusion" + >), + speciesForm: isNullOrUndefined(speciesForm) + ? undefined + : { id: speciesForm.speciesId, formIdx: speciesForm.formIndex }, + fusionSpeciesForm: isNullOrUndefined(fusionSpeciesForm) + ? undefined + : { id: fusionSpeciesForm.speciesId, formIdx: fusionSpeciesForm.formIndex }, + illusion: isNullOrUndefined(illusion) + ? undefined + : { + ...(this.illusion as Omit), + fusionSpecies: illusionSpeciesForm?.speciesId, + }, + }; + // Replace `null` with `undefined`, as `undefined` never gets serialized + for (const [key, value] of Object.entries(t)) { + if (value === null) { + t[key] = undefined; + } + } + return t; + } } // TODO: Merge this inside `summmonData` but exclude from save if/when a save data serializer is added From 343407832962d4e8c007663fb82d429f48392eda Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:03:34 -0700 Subject: [PATCH 019/106] [Docs] Add `@module` modifier tag to `tsdoc.json` --- tsdoc.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tsdoc.json b/tsdoc.json index b4cbc9a62a5..689f7a96c5c 100644 --- a/tsdoc.json +++ b/tsdoc.json @@ -9,6 +9,10 @@ { "tagName": "@linkcode", "syntaxKind": "inline" + }, + { + "tagName": "@module", + "syntaxKind": "modifier" } ] } From 157b662f9ed719f8ef35ab13792ae7ec448f1e5c Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sun, 27 Jul 2025 23:17:46 -0400 Subject: [PATCH 020/106] [Bug] Fix camel case bug in `strings.ts` (#6161) --- src/utils/strings.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/utils/strings.ts b/src/utils/strings.ts index dfa3d7c887f..bf5e5c6473f 100644 --- a/src/utils/strings.ts +++ b/src/utils/strings.ts @@ -98,7 +98,9 @@ export function toTitleCase(str: string): string { */ export function toCamelCase(str: string) { return splitWords(str) - .map((word, index) => (index === 0 ? word.toLowerCase() : capitalizeFirstLetter(word))) + .map((word, index) => + index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(), + ) .join(""); } From 462b423cb8e903d150bd1d665254a97af9843b61 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 27 Jul 2025 21:20:02 -0700 Subject: [PATCH 021/106] [Dev] Change `target` to `ES2023` in `tsconfig.json` (#6160) --- src/field/pokemon.ts | 5 ++--- src/field/trainer.ts | 1 - src/modifier/modifier.ts | 20 ++++++++++---------- tsconfig.json | 8 ++++---- 4 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 32229d80f37..fd04c007e1b 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -213,7 +213,6 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * TODO: Stop treating this like a unique ID and stop treating 0 as no pokemon */ public id: number; - public name: string; public nickname: string; public species: PokemonSpecies; public formIndex: number; @@ -5664,7 +5663,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } export class PlayerPokemon extends Pokemon { - protected battleInfo: PlayerBattleInfo; + protected declare battleInfo: PlayerBattleInfo; public compatibleTms: MoveId[]; constructor( @@ -6193,7 +6192,7 @@ export class PlayerPokemon extends Pokemon { } export class EnemyPokemon extends Pokemon { - protected battleInfo: EnemyBattleInfo; + protected declare battleInfo: EnemyBattleInfo; public trainerSlot: TrainerSlot; public aiType: AiType; public bossSegments: number; diff --git a/src/field/trainer.ts b/src/field/trainer.ts index a8af298e1cf..584c9310932 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -30,7 +30,6 @@ export class Trainer extends Phaser.GameObjects.Container { public config: TrainerConfig; public variant: TrainerVariant; public partyTemplateIndex: number; - public name: string; public partnerName: string; public nameKey: string; public partnerNameKey: string | undefined; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index f6a9ed48847..b31bee7fc69 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -462,7 +462,7 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { * @see {@linkcode apply} */ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier { - public override type: DoubleBattleChanceBoosterModifierType; + public declare type: DoubleBattleChanceBoosterModifierType; match(modifier: Modifier): boolean { return modifier instanceof DoubleBattleChanceBoosterModifier && modifier.getMaxBattles() === this.getMaxBattles(); @@ -936,7 +936,7 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { * Currently used by Shuckle Juice item */ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { - public override type: PokemonBaseStatTotalModifierType; + public declare type: PokemonBaseStatTotalModifierType; public isTransferable = false; public statModifier: 10 | -15; @@ -2074,7 +2074,7 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { } export class TerrastalizeModifier extends ConsumablePokemonModifier { - public override type: TerastallizeModifierType; + public declare type: TerastallizeModifierType; public teraType: PokemonType; constructor(type: TerastallizeModifierType, pokemonId: number, teraType: PokemonType) { @@ -2318,7 +2318,7 @@ export class PokemonLevelIncrementModifier extends ConsumablePokemonModifier { } export class TmModifier extends ConsumablePokemonModifier { - public override type: TmModifierType; + public declare type: TmModifierType; /** * Applies {@linkcode TmModifier} @@ -2365,7 +2365,7 @@ export class RememberMoveModifier extends ConsumablePokemonModifier { } export class EvolutionItemModifier extends ConsumablePokemonModifier { - public override type: EvolutionItemModifierType; + public declare type: EvolutionItemModifierType; /** * Applies {@linkcode EvolutionItemModifier} * @param playerPokemon The {@linkcode PlayerPokemon} that should evolve via item @@ -2530,7 +2530,7 @@ export class ExpBoosterModifier extends PersistentModifier { } export class PokemonExpBoosterModifier extends PokemonHeldItemModifier { - public override type: PokemonExpBoosterModifierType; + public declare type: PokemonExpBoosterModifierType; private boostMultiplier: number; @@ -2627,7 +2627,7 @@ export class ExpBalanceModifier extends PersistentModifier { } export class PokemonFriendshipBoosterModifier extends PokemonHeldItemModifier { - public override type: PokemonFriendshipBoosterModifierType; + public declare type: PokemonFriendshipBoosterModifierType; matchType(modifier: Modifier): boolean { return modifier instanceof PokemonFriendshipBoosterModifier; @@ -2684,7 +2684,7 @@ export class PokemonNatureWeightModifier extends PokemonHeldItemModifier { } export class PokemonMoveAccuracyBoosterModifier extends PokemonHeldItemModifier { - public override type: PokemonMoveAccuracyBoosterModifierType; + public declare type: PokemonMoveAccuracyBoosterModifierType; private accuracyAmount: number; constructor(type: PokemonMoveAccuracyBoosterModifierType, pokemonId: number, accuracy: number, stackCount?: number) { @@ -2736,7 +2736,7 @@ export class PokemonMoveAccuracyBoosterModifier extends PokemonHeldItemModifier } export class PokemonMultiHitModifier extends PokemonHeldItemModifier { - public override type: PokemonMultiHitModifierType; + public declare type: PokemonMultiHitModifierType; matchType(modifier: Modifier): boolean { return modifier instanceof PokemonMultiHitModifier; @@ -2817,7 +2817,7 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { } export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { - public override type: FormChangeItemModifierType; + public declare type: FormChangeItemModifierType; public formChangeItem: FormChangeItem; public active: boolean; public isTransferable = false; diff --git a/tsconfig.json b/tsconfig.json index 1e067dcff03..9aa06829789 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,11 @@ { "compilerOptions": { - "target": "ES2020", - "module": "ES2020", + "target": "ES2023", + "module": "ES2022", // Modifying this option requires all values to be set manually because the defaults get overridden - // Values other than "ES2024.Promise" taken from https://github.com/microsoft/TypeScript/blob/main/src/lib/es2020.full.d.ts + // Values other than "ES2024.Promise" taken from https://github.com/microsoft/TypeScript/blob/main/src/lib/es2023.full.d.ts "lib": [ - "ES2020", + "ES2023", "ES2024.Promise", "DOM", "DOM.AsyncIterable", From 0935d817e9ab9261a7a736be249e7d5f168ec4e8 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 25 May 2025 17:26:37 -0500 Subject: [PATCH 022/106] breakup fight and ball commands into their own methods --- src/phases/command-phase.ts | 418 +++++++++++++++++++----------------- 1 file changed, 222 insertions(+), 196 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 14674037fbe..92c01aa4b85 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -148,206 +148,232 @@ export class CommandPhase extends FieldPhase { } /** - * TODO: Remove `args` and clean this thing up - * Code will need to be copied over from pkty except replacing the `virtual` and `ignorePP` args with a corresponding `MoveUseMode`. + * + * @param user - The pokemon using the move + * @param cursor - */ - handleCommand(command: Command, cursor: number, ...args: any[]): boolean { + private queueFightErrorMessage(user: PlayerPokemon, cursor: number) { + const move = user.getMoveset()[cursor]; + globalScene.ui.setMode(UiMode.MESSAGE); + + // Decides between a Disabled, Not Implemented, or No PP translation message + const errorMessage = user.isMoveRestricted(move.moveId, user) + ? user.getRestrictingTag(move.moveId, user)!.selectionDeniedText(user, move.moveId) + : move.getName().endsWith(" (N)") + ? "battle:moveNotImplemented" + : "battle:moveNoPP"; + const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator + + globalScene.ui.showText( + i18next.t(errorMessage, { moveName: moveName }), + null, + () => { + globalScene.ui.clearText(); + globalScene.ui.setMode(UiMode.FIGHT, this.fieldIndex); + }, + null, + true, + ); + } + + /** Helper method for {@linkcode handleFightCommand} that returns the moveID for the phase + * based on the move passed in or the cursor. + * + * Does not check if the move is usable or not, that should be handled by the caller. + */ + private comptueMoveId(playerPokemon: PlayerPokemon, cursor: number, move?: TurnMove): MoveId { + return move?.move ?? (cursor > -1 ? playerPokemon.getMoveset()[cursor]?.moveId : MoveId.NONE); + } + + /** + * Handle fight logic + * @param command - The command to handle (FIGHT or TERA) + * @param cursor - The index that the cursor is placed on, or -1 if no move can be selected. + * @param args - Any additional arguments to pass to the command + */ + private handleFightCommand( + command: Command.FIGHT | Command.TERA, + cursor: number, + useMode: MoveUseMode = MoveUseMode.NORMAL, + move?: TurnMove, + ): boolean { + const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; + const ignorePP = isIgnorePP(useMode); + + /** Whether or not to display an error message instead of attempting to initiate the command selection process */ + let canUse = cursor !== -1 || !playerPokemon.trySelectMove(cursor, ignorePP); + + const useStruggle = canUse + ? false + : cursor > -1 && !playerPokemon.getMoveset().some(m => m.isUsable(playerPokemon)); + + canUse = canUse || useStruggle; + + if (!canUse) { + this.queueFightErrorMessage(playerPokemon, cursor); + return false; + } + + const moveId = useStruggle ? MoveId.STRUGGLE : this.comptueMoveId(playerPokemon, cursor, move); + + const turnCommand: TurnCommand = { + command: Command.FIGHT, + cursor: cursor, + move: { move: moveId, targets: [], useMode }, + args: [useMode, move], + }; + const preTurnCommand: TurnCommand = { + command: command, + targets: [this.fieldIndex], + skip: command === Command.FIGHT, + }; + + const moveTargets: MoveTargetSet = + move === undefined + ? getMoveTargets(playerPokemon, moveId) + : { + targets: move.targets, + multiple: move.targets.length > 1, + }; + + if (!moveId) { + turnCommand.targets = [this.fieldIndex]; + } + + console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); + + if (moveTargets.multiple) { + globalScene.phaseManager.unshiftNew("SelectTargetPhase", this.fieldIndex); + } + + if (turnCommand.move && (moveTargets.targets.length <= 1 || moveTargets.multiple)) { + turnCommand.move.targets = moveTargets.targets; + } else if ( + turnCommand.move && + playerPokemon.getTag(BattlerTagType.CHARGING) && + playerPokemon.getMoveQueue().length >= 1 + ) { + turnCommand.move.targets = playerPokemon.getMoveQueue()[0].targets; + } else { + globalScene.phaseManager.unshiftNew("SelectTargetPhase", this.fieldIndex); + } + + globalScene.currentBattle.preTurnCommands[this.fieldIndex] = preTurnCommand; + globalScene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; + + return true; + } + + private queueShowText(key: string) { + globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(UiMode.MESSAGE); + + globalScene.ui.showText( + i18next.t(key), + null, + () => { + globalScene.ui.showText("", 0); + globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); + }, + null, + true, + ); + } + + /** + * Helper method for {@linkcode handleBallCommand} that checks if the pokeball can be thrown. + * + * The pokeball may not be thrown if: + * - It is a trainer battle + * - The biome is {@linkcode Biome.END} and it is not classic mode + * - The biome is {@linkcode Biome.END} and the fresh start challenge is active + * - The biome is {@linkcode Biome.END} and the player has not either caught the target before or caught all but one starter + * - The player is in a mystery encounter that disallows catching the pokemon + * @returns Whether a pokeball can be thrown + * + */ + private checkCanUseBall(): boolean { + if ( + globalScene.arena.biomeType === BiomeId.END && + (!globalScene.gameMode.isClassic || + globalScene.gameMode.isFreshStartChallenge() || + (globalScene + .getEnemyField() + .some(p => p.isActive() && !globalScene.gameData.dexData[p.species.speciesId].caughtAttr) && + globalScene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1)) + ) { + this.queueShowText("battle:noPokeballForce"); + } else if (globalScene.currentBattle.battleType === BattleType.TRAINER) { + this.queueShowText("battle:noPokeballTrainer"); + } else if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + !globalScene.currentBattle.mysteryEncounter!.catchAllowed + ) { + this.queueShowText("battle:noPokeballMysteryEncounter"); + } else { + return true; + } + + return false; + } + + /** + * Helper method for {@linkcode handleCommand} that handles the logic when the selected command is to use a pokeball. + * + * @param cursor - The index of the pokeball to use + * @returns Whether the command was successfully initiated + */ + handleBallCommand(cursor: number): boolean { + const targets = globalScene + .getEnemyField() + .filter(p => p.isActive(true)) + .map(p => p.getBattlerIndex()); + if (targets.length > 1) { + this.queueShowText("battle:noPokeballMulti"); + return false; + } + + if (!this.checkCanUseBall()) { + return false; + } + + if (cursor < 5) { + const targetPokemon = globalScene.getEnemyPokemon(); + if ( + targetPokemon?.isBoss() && + targetPokemon?.bossSegmentIndex >= 1 && + // TODO: Decouple this hardcoded exception for wonder guard and just check the target... + !targetPokemon?.hasAbility(AbilityId.WONDER_GUARD, false, true) && + cursor < PokeballType.MASTER_BALL + ) { + this.queueShowText("battle:noPokeballStrong"); + return false; + } + + globalScene.currentBattle.turnCommands[this.fieldIndex] = { + command: Command.BALL, + cursor: cursor, + }; + globalScene.currentBattle.turnCommands[this.fieldIndex]!.targets = targets; + if (this.fieldIndex) { + globalScene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; + } + return true; + } + + return false; + } + + handleCommand(command: Command, cursor: number, useMode: MoveUseMode = MoveUseMode.NORMAL, move?: TurnMove): boolean { const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; let success = false; switch (command) { - // TODO: We don't need 2 args for this - moveUseMode is carried over from queuedMove case Command.TERA: - case Command.FIGHT: { - let useStruggle = false; - const turnMove: TurnMove | undefined = args.length === 2 ? (args[1] as TurnMove) : undefined; - if ( - cursor === -1 || - playerPokemon.trySelectMove(cursor, isIgnorePP(args[0] as MoveUseMode)) || - (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m.isUsable(playerPokemon)).length) - ) { - let moveId: MoveId; - if (useStruggle) { - moveId = MoveId.STRUGGLE; - } else if (turnMove !== undefined) { - moveId = turnMove.move; - } else if (cursor > -1) { - moveId = playerPokemon.getMoveset()[cursor].moveId; - } else { - moveId = MoveId.NONE; - } - - const turnCommand: TurnCommand = { - command: Command.FIGHT, - cursor: cursor, - move: { move: moveId, targets: [], useMode: args[0] }, - args: args, - }; - const preTurnCommand: TurnCommand = { - command: command, - targets: [this.fieldIndex], - skip: command === Command.FIGHT, - }; - const moveTargets: MoveTargetSet = - turnMove === undefined - ? getMoveTargets(playerPokemon, moveId) - : { - targets: turnMove.targets, - multiple: turnMove.targets.length > 1, - }; - if (!moveId) { - turnCommand.targets = [this.fieldIndex]; - } - console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); - if (moveTargets.targets.length > 1 && moveTargets.multiple) { - globalScene.phaseManager.unshiftNew("SelectTargetPhase", this.fieldIndex); - } - if (turnCommand.move && (moveTargets.targets.length <= 1 || moveTargets.multiple)) { - turnCommand.move.targets = moveTargets.targets; - } else if ( - turnCommand.move && - playerPokemon.getTag(BattlerTagType.CHARGING) && - playerPokemon.getMoveQueue().length >= 1 - ) { - turnCommand.move.targets = playerPokemon.getMoveQueue()[0].targets; - } else { - globalScene.phaseManager.unshiftNew("SelectTargetPhase", this.fieldIndex); - } - globalScene.currentBattle.preTurnCommands[this.fieldIndex] = preTurnCommand; - globalScene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; - success = true; - } else if (cursor < playerPokemon.getMoveset().length) { - const move = playerPokemon.getMoveset()[cursor]; - globalScene.ui.setMode(UiMode.MESSAGE); - - // Decides between a Disabled, Not Implemented, or No PP translation message - const errorMessage = playerPokemon.isMoveRestricted(move.moveId, playerPokemon) - ? playerPokemon - .getRestrictingTag(move.moveId, playerPokemon)! - .selectionDeniedText(playerPokemon, move.moveId) - : move.getName().endsWith(" (N)") - ? "battle:moveNotImplemented" - : "battle:moveNoPP"; - const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator - - globalScene.ui.showText( - i18next.t(errorMessage, { moveName: moveName }), - null, - () => { - globalScene.ui.clearText(); - globalScene.ui.setMode(UiMode.FIGHT, this.fieldIndex); - }, - null, - true, - ); - } - break; - } - case Command.BALL: { - const notInDex = - globalScene - .getEnemyField() - .filter(p => p.isActive(true)) - .some(p => !globalScene.gameData.dexData[p.species.speciesId].caughtAttr) && - globalScene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1; - if ( - globalScene.arena.biomeType === BiomeId.END && - (!globalScene.gameMode.isClassic || globalScene.gameMode.isFreshStartChallenge() || notInDex) - ) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(UiMode.MESSAGE); - globalScene.ui.showText( - i18next.t("battle:noPokeballForce"), - null, - () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - }, - null, - true, - ); - } else if (globalScene.currentBattle.battleType === BattleType.TRAINER) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(UiMode.MESSAGE); - globalScene.ui.showText( - i18next.t("battle:noPokeballTrainer"), - null, - () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - }, - null, - true, - ); - } else if ( - globalScene.currentBattle.isBattleMysteryEncounter() && - !globalScene.currentBattle.mysteryEncounter!.catchAllowed - ) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(UiMode.MESSAGE); - globalScene.ui.showText( - i18next.t("battle:noPokeballMysteryEncounter"), - null, - () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - }, - null, - true, - ); - } else { - const targets = globalScene - .getEnemyField() - .filter(p => p.isActive(true)) - .map(p => p.getBattlerIndex()); - if (targets.length > 1) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(UiMode.MESSAGE); - globalScene.ui.showText( - i18next.t("battle:noPokeballMulti"), - null, - () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - }, - null, - true, - ); - } else if (cursor < 5) { - const targetPokemon = globalScene.getEnemyField().find(p => p.isActive(true)); - if ( - targetPokemon?.isBoss() && - targetPokemon?.bossSegmentIndex >= 1 && - !targetPokemon?.hasAbility(AbilityId.WONDER_GUARD, false, true) && - cursor < PokeballType.MASTER_BALL - ) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(UiMode.MESSAGE); - globalScene.ui.showText( - i18next.t("battle:noPokeballStrong"), - null, - () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - }, - null, - true, - ); - } else { - globalScene.currentBattle.turnCommands[this.fieldIndex] = { - command: Command.BALL, - cursor: cursor, - }; - globalScene.currentBattle.turnCommands[this.fieldIndex]!.targets = targets; - if (this.fieldIndex) { - globalScene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; - } - success = true; - } - } - } - break; - } + case Command.FIGHT: + return this.handleFightCommand(command, cursor, useMode, move); + case Command.BALL: + return this.handleBallCommand(cursor); case Command.POKEMON: case Command.RUN: { const isSwitch = command === Command.POKEMON; @@ -388,11 +414,11 @@ export class CommandPhase extends FieldPhase { true, ); } else { - const batonPass = isSwitch && (args[0] as boolean); + const batonPass = isSwitch && useMode; const trappedAbMessages: string[] = []; if (batonPass || !playerPokemon.isTrapped(trappedAbMessages)) { currentBattle.turnCommands[this.fieldIndex] = isSwitch - ? { command: Command.POKEMON, cursor: cursor, args: args } + ? { command: Command.POKEMON, cursor: cursor } : { command: Command.RUN }; success = true; if (!isSwitch && this.fieldIndex) { From 22b9a19ba65950c909328b057a8d002007cdc462 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 26 May 2025 11:46:53 -0500 Subject: [PATCH 023/106] Breakup run and pokemon commands --- src/phases/command-phase.ts | 274 +++++++++++++++++++++--------------- 1 file changed, 158 insertions(+), 116 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 92c01aa4b85..a37721ac912 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -20,15 +20,19 @@ import { UiMode } from "#enums/ui-mode"; import type { PlayerPokemon } from "#field/pokemon"; import type { MoveTargetSet } from "#moves/move"; import { getMoveTargets } from "#moves/move-utils"; -import { FieldPhase } from "#phases/field-phase"; import type { TurnMove } from "#types/turn-move"; -import { isNullOrUndefined } from "#utils/common"; import i18next from "i18next"; +import { FieldPhase } from "./field-phase"; export class CommandPhase extends FieldPhase { public readonly phaseName = "CommandPhase"; protected fieldIndex: number; + /** + * Whether the command phase is handling a switch command + */ + private isSwitch = false; + constructor(fieldIndex: number) { super(); @@ -150,7 +154,7 @@ export class CommandPhase extends FieldPhase { /** * * @param user - The pokemon using the move - * @param cursor - + * @param cursor - The index of the move in the moveset */ private queueFightErrorMessage(user: PlayerPokemon, cursor: number) { const move = user.getMoveset()[cursor]; @@ -264,6 +268,11 @@ export class CommandPhase extends FieldPhase { return true; } + /** + * Set the mode in preparation to show the text, and then show the text. + * Only works for parameterless i18next keys. + * @param key - The i18next key for the text to show + */ private queueShowText(key: string) { globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); globalScene.ui.setMode(UiMode.MESSAGE); @@ -323,7 +332,7 @@ export class CommandPhase extends FieldPhase { * @param cursor - The index of the pokeball to use * @returns Whether the command was successfully initiated */ - handleBallCommand(cursor: number): boolean { + private handleBallCommand(cursor: number): boolean { const targets = globalScene .getEnemyField() .filter(p => p.isActive(true)) @@ -364,125 +373,158 @@ export class CommandPhase extends FieldPhase { return false; } - handleCommand(command: Command, cursor: number, useMode: MoveUseMode = MoveUseMode.NORMAL, move?: TurnMove): boolean { + /** + * Common helper method to handle the logic for effects that prevent the pokemon from leaving the field + * due to trapping abilities or effects. + * + * This method queues the proper messages in the case of trapping abilities or effects + * + * @returns Whether the pokemon is currently trapped + */ + private handleTrap(): boolean { const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; + const trappedAbMessages: string[] = []; + const isSwitch = this.isSwitch; + if (!playerPokemon.isTrapped(trappedAbMessages)) { + return false; + } + if (trappedAbMessages.length > 0) { + if (isSwitch) { + globalScene.ui.setMode(UiMode.MESSAGE); + } + globalScene.ui.showText( + trappedAbMessages[0], + null, + () => { + globalScene.ui.showText("", 0); + if (isSwitch) { + globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); + } + }, + null, + true, + ); + } else { + const trapTag = playerPokemon.getTag(TrappedTag); + const fairyLockTag = globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER); + + if (!isSwitch) { + globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); + globalScene.ui.setMode(UiMode.MESSAGE); + } + if (trapTag) { + this.showNoEscapeText(trapTag, false); + } else if (fairyLockTag) { + this.showNoEscapeText(fairyLockTag, false); + } + } + + return true; + } + + /** + * Common helper method that attempts to have the pokemon leave the field. + * Checks for trapping abilities and effects. + * + * @param cursor - The index of the option that the cursor is on + * @param isBatonSwitch - Whether the switch command is switching via the Baton item + * @returns whether the pokemon is able to leave the field, indicating the command phase should end + */ + private tryLeaveField(cursor?: number, isBatonSwitch = false): boolean { + const currentBattle = globalScene.currentBattle; + + if (isBatonSwitch && !this.handleTrap()) { + currentBattle.turnCommands[this.fieldIndex] = { + command: this.isSwitch ? Command.POKEMON : Command.RUN, + cursor: cursor, + }; + if (!this.isSwitch && this.fieldIndex) { + currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; + } + return true; + } + + return false; + } + + private handleRunCommand(): boolean { + const { currentBattle, arena } = globalScene; + const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed ?? true; + if (arena.biomeType === BiomeId.END || !mysteryEncounterFleeAllowed) { + this.queueShowText("battle:noEscapeForce"); + return false; + } + if ( + currentBattle.battleType === BattleType.TRAINER || + currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE + ) { + this.queueShowText("battle:noEscapeTrainer"); + return false; + } + + const success = this.tryLeaveField(); + + return success; + } + + /** + * Show a message indicating that the pokemon cannot escape, and then return to the command phase. + */ + private showNoEscapeText(tag: any, isSwitch: boolean): void { + globalScene.ui.showText( + i18next.t("battle:noEscapePokemon", { + pokemonName: + tag.sourceId && globalScene.getPokemonById(tag.sourceId) + ? getPokemonNameWithAffix(globalScene.getPokemonById(tag.sourceId)!) + : "", + moveName: tag.getMoveName(), + escapeVerb: i18next.t(isSwitch ? "battle:escapeVerbSwitch" : "battle:escapeVerbFlee"), + }), + null, + () => { + globalScene.ui.showText("", 0); + if (!isSwitch) { + globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); + } + }, + null, + true, + ); + } + + // Overloads for handleCommand to provide a more specific type signature for the different options + handleCommand(command: Command.FIGHT | Command.TERA, cursor: number, useMode?: MoveUseMode, move?: TurnMove): boolean; + handleCommand(command: Command.BALL, cursor: number): boolean; + handleCommand(command: Command.POKEMON, cursor: number, useBaton: boolean): boolean; + handleCommand(command: Command.RUN, cursor: number): boolean; + handleCommand(command: Command, cursor: number, useMode?: boolean | MoveUseMode, move?: TurnMove): boolean; + + /** + * Process the command phase logic based on the selected command + * + * @param command - The kind of command to handle + * @param cursor - The index of option that the cursor is on, or -1 if no option is selected + * @param useMode - The mode to use for the move, if applicable. For switches, a boolean that specifies whether the switch is a Baton switch. + * @param move - For {@linkcode Command.FIGHT}, the move to use + */ + handleCommand(command: Command, cursor: number, useMode: boolean | MoveUseMode = false, move?: TurnMove): boolean { let success = false; switch (command) { case Command.TERA: case Command.FIGHT: - return this.handleFightCommand(command, cursor, useMode, move); - case Command.BALL: - return this.handleBallCommand(cursor); - case Command.POKEMON: - case Command.RUN: { - const isSwitch = command === Command.POKEMON; - const { currentBattle, arena } = globalScene; - const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed; - if ( - !isSwitch && - (arena.biomeType === BiomeId.END || - (!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed)) - ) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(UiMode.MESSAGE); - globalScene.ui.showText( - i18next.t("battle:noEscapeForce"), - null, - () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - }, - null, - true, - ); - } else if ( - !isSwitch && - (currentBattle.battleType === BattleType.TRAINER || - currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) - ) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(UiMode.MESSAGE); - globalScene.ui.showText( - i18next.t("battle:noEscapeTrainer"), - null, - () => { - globalScene.ui.showText("", 0); - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - }, - null, - true, - ); - } else { - const batonPass = isSwitch && useMode; - const trappedAbMessages: string[] = []; - if (batonPass || !playerPokemon.isTrapped(trappedAbMessages)) { - currentBattle.turnCommands[this.fieldIndex] = isSwitch - ? { command: Command.POKEMON, cursor: cursor } - : { command: Command.RUN }; - success = true; - if (!isSwitch && this.fieldIndex) { - currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; - } - } else if (trappedAbMessages.length > 0) { - if (!isSwitch) { - globalScene.ui.setMode(UiMode.MESSAGE); - } - globalScene.ui.showText( - trappedAbMessages[0], - null, - () => { - globalScene.ui.showText("", 0); - if (!isSwitch) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - } - }, - null, - true, - ); - } else { - const trapTag = playerPokemon.getTag(TrappedTag); - const fairyLockTag = globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER); - - if (!trapTag && !fairyLockTag) { - i18next.t(`battle:noEscape${isSwitch ? "Switch" : "Flee"}`); - break; - } - if (!isSwitch) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - globalScene.ui.setMode(UiMode.MESSAGE); - } - const showNoEscapeText = (tag: any) => { - globalScene.ui.showText( - i18next.t("battle:noEscapePokemon", { - pokemonName: - tag.sourceId && globalScene.getPokemonById(tag.sourceId) - ? getPokemonNameWithAffix(globalScene.getPokemonById(tag.sourceId)!) - : "", - moveName: tag.getMoveName(), - escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee"), - }), - null, - () => { - globalScene.ui.showText("", 0); - if (!isSwitch) { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - } - }, - null, - true, - ); - }; - - if (trapTag) { - showNoEscapeText(trapTag); - } else if (fairyLockTag) { - showNoEscapeText(fairyLockTag); - } - } - } + success = this.handleFightCommand(command, cursor, typeof useMode === "boolean" ? undefined : useMode, move); break; - } + case Command.BALL: + success = this.handleBallCommand(cursor); + break; + case Command.POKEMON: + this.isSwitch = true; + success = this.tryLeaveField(cursor, typeof useMode === "boolean" ? useMode : undefined); + this.isSwitch = false; + break; + case Command.RUN: + success = this.handleRunCommand(); } if (success) { From 958eb005665637223b22a41371a95b09d379dce8 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 26 May 2025 15:56:14 -0500 Subject: [PATCH 024/106] Breakup commandPhase#start Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/phases/command-phase.ts | 205 ++++++++++++++++++++++-------------- 1 file changed, 125 insertions(+), 80 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index a37721ac912..943eca87e5a 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -1,14 +1,13 @@ import type { TurnCommand } from "#app/battle"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import { speciesStarterCosts } from "#balance/starters"; -import type { EncoreTag } from "#data/battler-tags"; import { TrappedTag } from "#data/battler-tags"; import { AbilityId } from "#enums/ability-id"; import { ArenaTagSide } from "#enums/arena-tag-side"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleType } from "#enums/battle-type"; -import { BattlerTagType } from "#enums/battler-tag-type"; import { BiomeId } from "#enums/biome-id"; import { Command } from "#enums/command"; import { FieldPosition } from "#enums/field-position"; @@ -39,11 +38,13 @@ export class CommandPhase extends FieldPhase { this.fieldIndex = fieldIndex; } - start() { - super.start(); - - globalScene.updateGameInfo(); - + /** + * Resets the cursor to the position of {@linkcode Command.FIGHT} if any of the following are true + * - The setting to remember the last action is not enabled + * - This is the first turn of a mystery encounter, trainer battle, or the END biome + * - The cursor is currently on the POKEMON command + */ + private resetCursorIfNeeded() { const commandUiHandler = globalScene.ui.handlers[UiMode.COMMAND]; // If one of these conditions is true, we always reset the cursor to Command.FIGHT @@ -52,33 +53,42 @@ export class CommandPhase extends FieldPhase { globalScene.currentBattle.battleType === BattleType.TRAINER || globalScene.arena.biomeType === BiomeId.END; - if (commandUiHandler) { - if ( - (globalScene.currentBattle.turn === 1 && (!globalScene.commandCursorMemory || cursorResetEvent)) || - commandUiHandler.getCursor() === Command.POKEMON - ) { - commandUiHandler.setCursor(Command.FIGHT); - } else { - commandUiHandler.setCursor(commandUiHandler.getCursor()); - } + if ( + (commandUiHandler && + globalScene.currentBattle.turn === 1 && + (!globalScene.commandCursorMemory || cursorResetEvent)) || + commandUiHandler.getCursor() === Command.POKEMON + ) { + commandUiHandler.setCursor(Command.FIGHT); + } + } + + /** + * Submethod of {@linkcode start} that validates field index logic for nonzero field indices. + * Must only be called if the field index is nonzero. + */ + private handleFieldIndexLogic() { + // If we somehow are attempting to check the right pokemon but there's only one pokemon out + // Switch back to the center pokemon. This can happen rarely in double battles with mid turn switching + // TODO: Prevent this from happening in the first place + if (globalScene.getPlayerField().filter(p => p.isActive()).length === 1) { + this.fieldIndex = FieldPosition.CENTER; + return; } - if (this.fieldIndex) { - // If we somehow are attempting to check the right pokemon but there's only one pokemon out - // Switch back to the center pokemon. This can happen rarely in double battles with mid turn switching - if (globalScene.getPlayerField().filter(p => p.isActive()).length === 1) { - this.fieldIndex = FieldPosition.CENTER; - } else { - const allyCommand = globalScene.currentBattle.turnCommands[this.fieldIndex - 1]; - if (allyCommand?.command === Command.BALL || allyCommand?.command === Command.RUN) { - globalScene.currentBattle.turnCommands[this.fieldIndex] = { - command: allyCommand?.command, - skip: true, - }; - } - } + const allyCommand = globalScene.currentBattle.turnCommands[this.fieldIndex - 1]; + if (allyCommand?.command === Command.BALL || allyCommand?.command === Command.RUN) { + globalScene.currentBattle.turnCommands[this.fieldIndex] = { + command: allyCommand?.command, + skip: true, + }; } + } + /** Submethod of {@linkcode start} that sets the turn command to skip if this pokemon is commanding its ally + * via {@linkcode Abilities.COMMANDER}. + */ + private checkCommander() { // If the Pokemon has applied Commander's effects to its ally, skip this command if ( globalScene.currentBattle?.double && @@ -90,64 +100,99 @@ export class CommandPhase extends FieldPhase { skip: true, }; } + } - // Checks if the Pokemon is under the effects of Encore. If so, Encore can end early if the encored move has no more PP. - const encoreTag = this.getPokemon().getTag(BattlerTagType.ENCORE) as EncoreTag | undefined; - if (encoreTag) { - this.getPokemon().lapseTag(BattlerTagType.ENCORE); + /** + * Clear out all unusable moves in front of the currently acting pokemon's move queue. + * TODO: Refactor move queue handling to ensure that this method is not necessary. + */ + private clearUnusuableMoves() { + const playerPokemon = this.getPokemon(); + const moveQueue = playerPokemon.getMoveQueue(); + if (moveQueue.length === 0) { + return; } + let entriesToDelete = 0; + const moveset = playerPokemon.getMoveset(); + for (const queuedMove of moveQueue) { + const movesetQueuedMove = moveset.find(m => m.moveId === queuedMove.move); + if ( + queuedMove.move !== MoveId.NONE && + !isVirtual(queuedMove.useMode) && + !movesetQueuedMove?.isUsable(playerPokemon, isIgnorePP(queuedMove.useMode)) + ) { + entriesToDelete++; + } else { + break; + } + } + if (entriesToDelete) { + moveQueue.splice(0, entriesToDelete); + } + } + + /** + * Attempt to execute the first usable move in this Pokemon's move queue + * @returns Whether a queued move was successfully set to be executed. + */ + private tryExecuteQueuedMove(): boolean { + this.clearUnusuableMoves(); + const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; + const moveQueue = playerPokemon.getMoveQueue(); + + if (moveQueue.length === 0) { + return false; + } + + const queuedMove = moveQueue[0]; + if (queuedMove.move === MoveId.NONE) { + this.handleCommand(Command.FIGHT, -1); + return true; + } + const moveIndex = playerPokemon.getMoveset().findIndex(m => m.moveId === queuedMove.move); + if (!isVirtual(queuedMove.useMode) && moveIndex === -1) { + globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); + } else { + this.handleCommand(Command.FIGHT, moveIndex, queuedMove.useMode, queuedMove); + } + + return true; + } + + start() { + super.start(); + + globalScene.updateGameInfo(); + this.resetCursorIfNeeded(); + + if (this.fieldIndex) { + this.handleFieldIndexLogic(); + } + + this.checkCommander(); + + const playerPokemon = this.getPokemon(); + + // Note: It is OK to call this if the target is not under the effect of encore; it will simply do nothing. + playerPokemon.lapseTag(BattlerTagType.ENCORE); + if (globalScene.currentBattle.turnCommands[this.fieldIndex]?.skip) { return this.end(); } - const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; - - const moveQueue = playerPokemon.getMoveQueue(); - - while ( - moveQueue.length && - moveQueue[0] && - moveQueue[0].move && - !isVirtual(moveQueue[0].useMode) && - (!playerPokemon.getMoveset().find(m => m.moveId === moveQueue[0].move) || - !playerPokemon - .getMoveset() - [playerPokemon.getMoveset().findIndex(m => m.moveId === moveQueue[0].move)].isUsable( - playerPokemon, - isIgnorePP(moveQueue[0].useMode), - )) - ) { - moveQueue.shift(); + if (this.tryExecuteQueuedMove()) { + return; } - // TODO: Refactor this. I did a few simple find/replace matches but this is just ABHORRENTLY structured - if (moveQueue.length > 0) { - const queuedMove = moveQueue[0]; - if (!queuedMove.move) { - this.handleCommand(Command.FIGHT, -1, MoveUseMode.NORMAL); - } else { - const moveIndex = playerPokemon.getMoveset().findIndex(m => m.moveId === queuedMove.move); - if ( - (moveIndex > -1 && - playerPokemon.getMoveset()[moveIndex].isUsable(playerPokemon, isIgnorePP(queuedMove.useMode))) || - isVirtual(queuedMove.useMode) - ) { - this.handleCommand(Command.FIGHT, moveIndex, queuedMove.useMode, queuedMove); - } else { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - } - } + if ( + globalScene.currentBattle.isBattleMysteryEncounter() && + globalScene.currentBattle.mysteryEncounter?.skipToFightInput + ) { + globalScene.ui.clearText(); + globalScene.ui.setMode(UiMode.FIGHT, this.fieldIndex); } else { - if ( - globalScene.currentBattle.isBattleMysteryEncounter() && - globalScene.currentBattle.mysteryEncounter?.skipToFightInput - ) { - globalScene.ui.clearText(); - globalScene.ui.setMode(UiMode.FIGHT, this.fieldIndex); - } else { - globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); - } + globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); } } @@ -201,7 +246,7 @@ export class CommandPhase extends FieldPhase { useMode: MoveUseMode = MoveUseMode.NORMAL, move?: TurnMove, ): boolean { - const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; + const playerPokemon = this.getPokemon(); const ignorePP = isIgnorePP(useMode); /** Whether or not to display an error message instead of attempting to initiate the command selection process */ @@ -382,7 +427,7 @@ export class CommandPhase extends FieldPhase { * @returns Whether the pokemon is currently trapped */ private handleTrap(): boolean { - const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; + const playerPokemon = this.getPokemon(); const trappedAbMessages: string[] = []; const isSwitch = this.isSwitch; if (!playerPokemon.isTrapped(trappedAbMessages)) { From 22d2b4a43665543ae386a3ca88df2834482912eb Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 26 May 2025 16:41:58 -0500 Subject: [PATCH 025/106] Minor touchups --- src/phases/command-phase.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 943eca87e5a..34ca7bb71e5 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -249,8 +249,7 @@ export class CommandPhase extends FieldPhase { const playerPokemon = this.getPokemon(); const ignorePP = isIgnorePP(useMode); - /** Whether or not to display an error message instead of attempting to initiate the command selection process */ - let canUse = cursor !== -1 || !playerPokemon.trySelectMove(cursor, ignorePP); + let canUse = cursor === -1 || playerPokemon.trySelectMove(cursor, ignorePP); const useStruggle = canUse ? false @@ -291,7 +290,7 @@ export class CommandPhase extends FieldPhase { console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); - if (moveTargets.multiple) { + if (moveTargets.targets.length > 1 && moveTargets.multiple) { globalScene.phaseManager.unshiftNew("SelectTargetPhase", this.fieldIndex); } @@ -419,7 +418,7 @@ export class CommandPhase extends FieldPhase { } /** - * Common helper method to handle the logic for effects that prevent the pokemon from leaving the field + * Helper method to handle the logic for effects that prevent the pokemon from leaving the field * due to trapping abilities or effects. * * This method queues the proper messages in the case of trapping abilities or effects @@ -478,11 +477,16 @@ export class CommandPhase extends FieldPhase { private tryLeaveField(cursor?: number, isBatonSwitch = false): boolean { const currentBattle = globalScene.currentBattle; - if (isBatonSwitch && !this.handleTrap()) { - currentBattle.turnCommands[this.fieldIndex] = { - command: this.isSwitch ? Command.POKEMON : Command.RUN, - cursor: cursor, - }; + if (isBatonSwitch || !this.handleTrap()) { + currentBattle.turnCommands[this.fieldIndex] = this.isSwitch + ? { + command: Command.POKEMON, + cursor: cursor, + args: [isBatonSwitch], + } + : { + command: Command.RUN, + }; if (!this.isSwitch && this.fieldIndex) { currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; } @@ -537,7 +541,7 @@ export class CommandPhase extends FieldPhase { ); } - // Overloads for handleCommand to provide a more specific type signature for the different options + // Overloads for handleCommand to provide a more specific signature for the different options handleCommand(command: Command.FIGHT | Command.TERA, cursor: number, useMode?: MoveUseMode, move?: TurnMove): boolean; handleCommand(command: Command.BALL, cursor: number): boolean; handleCommand(command: Command.POKEMON, cursor: number, useBaton: boolean): boolean; From 9218d35938d11813d53a44c48a1fe181cce0a105 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 26 May 2025 16:49:00 -0500 Subject: [PATCH 026/106] Add overload for handle command --- src/phases/command-phase.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 34ca7bb71e5..c9a83096359 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -249,6 +249,7 @@ export class CommandPhase extends FieldPhase { const playerPokemon = this.getPokemon(); const ignorePP = isIgnorePP(useMode); + let canUse = cursor === -1 || playerPokemon.trySelectMove(cursor, ignorePP); let canUse = cursor === -1 || playerPokemon.trySelectMove(cursor, ignorePP); const useStruggle = canUse From adb5900497fcc1a6d6afeb892e84e508c6b899f8 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 26 May 2025 20:40:48 -0500 Subject: [PATCH 027/106] Fix improperly named computeMoveId method --- src/phases/command-phase.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index c9a83096359..024e54f8065 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -230,7 +230,7 @@ export class CommandPhase extends FieldPhase { * * Does not check if the move is usable or not, that should be handled by the caller. */ - private comptueMoveId(playerPokemon: PlayerPokemon, cursor: number, move?: TurnMove): MoveId { + private computeMoveId(playerPokemon: PlayerPokemon, cursor: number, move?: TurnMove): MoveId { return move?.move ?? (cursor > -1 ? playerPokemon.getMoveset()[cursor]?.moveId : MoveId.NONE); } @@ -263,7 +263,7 @@ export class CommandPhase extends FieldPhase { return false; } - const moveId = useStruggle ? MoveId.STRUGGLE : this.comptueMoveId(playerPokemon, cursor, move); + const moveId = useStruggle ? MoveId.STRUGGLE : this.computeMoveId(playerPokemon, cursor, move); const turnCommand: TurnCommand = { command: Command.FIGHT, From e1e7287919513d9017b8e17f142e34d3cd103ef5 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 26 May 2025 23:13:46 -0500 Subject: [PATCH 028/106] Improve `canUse` computation --- src/phases/command-phase.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 024e54f8065..85b919148e3 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -252,13 +252,12 @@ export class CommandPhase extends FieldPhase { let canUse = cursor === -1 || playerPokemon.trySelectMove(cursor, ignorePP); let canUse = cursor === -1 || playerPokemon.trySelectMove(cursor, ignorePP); + // Ternary here ensures we don't compute struggle conditions unless necessary const useStruggle = canUse ? false : cursor > -1 && !playerPokemon.getMoveset().some(m => m.isUsable(playerPokemon)); - canUse = canUse || useStruggle; - - if (!canUse) { + if (!canUse && !useStruggle) { this.queueFightErrorMessage(playerPokemon, cursor); return false; } From 1df3ac096254d0dd3587d9c26a986212d24dcf60 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 26 May 2025 23:18:04 -0500 Subject: [PATCH 029/106] Explicitly check against Moves.NONE Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/phases/command-phase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 85b919148e3..a8ea0abe5c2 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -284,7 +284,7 @@ export class CommandPhase extends FieldPhase { multiple: move.targets.length > 1, }; - if (!moveId) { + if (moveId === Moves.NONE) { turnCommand.targets = [this.fieldIndex]; } From 26cbf2db8c1d6a3f1485ad53f2b007ba40c39187 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 6 Jun 2025 10:41:34 -0500 Subject: [PATCH 030/106] Update with Bertie's comments Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/phases/command-phase.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index a8ea0abe5c2..ce83c25d314 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -225,7 +225,8 @@ export class CommandPhase extends FieldPhase { ); } - /** Helper method for {@linkcode handleFightCommand} that returns the moveID for the phase + /** + * Helper method for {@linkcode handleFightCommand} that returns the moveID for the phase * based on the move passed in or the cursor. * * Does not check if the move is usable or not, that should be handled by the caller. @@ -235,10 +236,16 @@ export class CommandPhase extends FieldPhase { } /** - * Handle fight logic + * Process the logic for executing a fight-related command + * + * @remarks + * - Validates whether the move can be used, using struggle if not + * - Constructs the turn command and inserts it into the battle's turn commands + * * @param command - The command to handle (FIGHT or TERA) * @param cursor - The index that the cursor is placed on, or -1 if no move can be selected. - * @param args - Any additional arguments to pass to the command + * @param ignorePP - Whether to ignore PP when checking if the move can be used. + * @param move - The move to force the command to use, if any. */ private handleFightCommand( command: Command.FIGHT | Command.TERA, @@ -249,7 +256,6 @@ export class CommandPhase extends FieldPhase { const playerPokemon = this.getPokemon(); const ignorePP = isIgnorePP(useMode); - let canUse = cursor === -1 || playerPokemon.trySelectMove(cursor, ignorePP); let canUse = cursor === -1 || playerPokemon.trySelectMove(cursor, ignorePP); // Ternary here ensures we don't compute struggle conditions unless necessary @@ -257,7 +263,9 @@ export class CommandPhase extends FieldPhase { ? false : cursor > -1 && !playerPokemon.getMoveset().some(m => m.isUsable(playerPokemon)); - if (!canUse && !useStruggle) { + canUse ||= useStruggle; + + if (!canUse) { this.queueFightErrorMessage(playerPokemon, cursor); return false; } @@ -284,7 +292,7 @@ export class CommandPhase extends FieldPhase { multiple: move.targets.length > 1, }; - if (moveId === Moves.NONE) { + if (moveId === MoveId.NONE) { turnCommand.targets = [this.fieldIndex]; } From c0a42985bffbab5369bf797b3adb9246fa653819 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 15 Jul 2025 22:12:19 -0700 Subject: [PATCH 031/106] Fix imports --- src/phases/command-phase.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index ce83c25d314..d44681ab12c 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -1,5 +1,4 @@ import type { TurnCommand } from "#app/battle"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import { speciesStarterCosts } from "#balance/starters"; @@ -8,6 +7,7 @@ import { AbilityId } from "#enums/ability-id"; import { ArenaTagSide } from "#enums/arena-tag-side"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleType } from "#enums/battle-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; import { BiomeId } from "#enums/biome-id"; import { Command } from "#enums/command"; import { FieldPosition } from "#enums/field-position"; @@ -19,9 +19,9 @@ import { UiMode } from "#enums/ui-mode"; import type { PlayerPokemon } from "#field/pokemon"; import type { MoveTargetSet } from "#moves/move"; import { getMoveTargets } from "#moves/move-utils"; +import { FieldPhase } from "#phases/field-phase"; import type { TurnMove } from "#types/turn-move"; import i18next from "i18next"; -import { FieldPhase } from "./field-phase"; export class CommandPhase extends FieldPhase { public readonly phaseName = "CommandPhase"; From ed915dcb58c85a9c511b80dba329b65bdde609be Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Wed, 23 Jul 2025 21:15:23 -0600 Subject: [PATCH 032/106] Apply kev's suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/phases/command-phase.ts | 115 +++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 46 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index d44681ab12c..44b365146d9 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -44,19 +44,21 @@ export class CommandPhase extends FieldPhase { * - This is the first turn of a mystery encounter, trainer battle, or the END biome * - The cursor is currently on the POKEMON command */ - private resetCursorIfNeeded() { + private resetCursorIfNeeded(): void { const commandUiHandler = globalScene.ui.handlers[UiMode.COMMAND]; + const { arena, commandCursorMemory, currentBattle } = globalScene; + const { battleType, turn } = currentBattle; + const { biomeType } = arena; // If one of these conditions is true, we always reset the cursor to Command.FIGHT const cursorResetEvent = - globalScene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER || - globalScene.currentBattle.battleType === BattleType.TRAINER || - globalScene.arena.biomeType === BiomeId.END; + battleType === BattleType.MYSTERY_ENCOUNTER || battleType === BattleType.TRAINER || biomeType === BiomeId.END; + if (!commandUiHandler) { + return; + } if ( - (commandUiHandler && - globalScene.currentBattle.turn === 1 && - (!globalScene.commandCursorMemory || cursorResetEvent)) || + (turn === 1 && (!commandCursorMemory || cursorResetEvent)) || commandUiHandler.getCursor() === Command.POKEMON ) { commandUiHandler.setCursor(Command.FIGHT); @@ -67,7 +69,7 @@ export class CommandPhase extends FieldPhase { * Submethod of {@linkcode start} that validates field index logic for nonzero field indices. * Must only be called if the field index is nonzero. */ - private handleFieldIndexLogic() { + private handleFieldIndexLogic(): void { // If we somehow are attempting to check the right pokemon but there's only one pokemon out // Switch back to the center pokemon. This can happen rarely in double battles with mid turn switching // TODO: Prevent this from happening in the first place @@ -85,10 +87,11 @@ export class CommandPhase extends FieldPhase { } } - /** Submethod of {@linkcode start} that sets the turn command to skip if this pokemon is commanding its ally - * via {@linkcode Abilities.COMMANDER}. + /** + * Submethod of {@linkcode start} that sets the turn command to skip if this pokemon + * is commanding its ally via {@linkcode AbilityId.COMMANDER}. */ - private checkCommander() { + private checkCommander(): void { // If the Pokemon has applied Commander's effects to its ally, skip this command if ( globalScene.currentBattle?.double && @@ -104,9 +107,10 @@ export class CommandPhase extends FieldPhase { /** * Clear out all unusable moves in front of the currently acting pokemon's move queue. + * * TODO: Refactor move queue handling to ensure that this method is not necessary. */ - private clearUnusuableMoves() { + private clearUnusuableMoves(): void { const playerPokemon = this.getPokemon(); const moveQueue = playerPokemon.getMoveQueue(); if (moveQueue.length === 0) { @@ -160,7 +164,7 @@ export class CommandPhase extends FieldPhase { return true; } - start() { + public override start(): void { super.start(); globalScene.updateGameInfo(); @@ -178,7 +182,8 @@ export class CommandPhase extends FieldPhase { playerPokemon.lapseTag(BattlerTagType.ENCORE); if (globalScene.currentBattle.turnCommands[this.fieldIndex]?.skip) { - return this.end(); + this.end(); + return; } if (this.tryExecuteQueuedMove()) { @@ -197,7 +202,8 @@ export class CommandPhase extends FieldPhase { } /** - * + * Submethod of {@linkcode handleFightCommand} responsible for queuing the appropriate + * error message when a move cannot be used. * @param user - The pokemon using the move * @param cursor - The index of the move in the moveset */ @@ -231,7 +237,7 @@ export class CommandPhase extends FieldPhase { * * Does not check if the move is usable or not, that should be handled by the caller. */ - private computeMoveId(playerPokemon: PlayerPokemon, cursor: number, move?: TurnMove): MoveId { + private computeMoveId(playerPokemon: PlayerPokemon, cursor: number, move: TurnMove | undefined): MoveId { return move?.move ?? (cursor > -1 ? playerPokemon.getMoveset()[cursor]?.moveId : MoveId.NONE); } @@ -274,12 +280,12 @@ export class CommandPhase extends FieldPhase { const turnCommand: TurnCommand = { command: Command.FIGHT, - cursor: cursor, + cursor, move: { move: moveId, targets: [], useMode }, args: [useMode, move], }; const preTurnCommand: TurnCommand = { - command: command, + command, targets: [this.fieldIndex], skip: command === Command.FIGHT, }; @@ -296,7 +302,14 @@ export class CommandPhase extends FieldPhase { turnCommand.targets = [this.fieldIndex]; } - console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); + console.log( + "Move:", + MoveId[moveId], + "Move targets:", + moveTargets, + "\nPlayer Pokemon:", + getPokemonNameWithAffix(playerPokemon), + ); if (moveTargets.targets.length > 1 && moveTargets.multiple) { globalScene.phaseManager.unshiftNew("SelectTargetPhase", this.fieldIndex); @@ -325,7 +338,7 @@ export class CommandPhase extends FieldPhase { * Only works for parameterless i18next keys. * @param key - The i18next key for the text to show */ - private queueShowText(key: string) { + private queueShowText(key: string): void { globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex); globalScene.ui.setMode(UiMode.MESSAGE); @@ -344,32 +357,35 @@ export class CommandPhase extends FieldPhase { /** * Helper method for {@linkcode handleBallCommand} that checks if the pokeball can be thrown. * - * The pokeball may not be thrown if: + * The pokeball may not be thrown if any of the following are true: * - It is a trainer battle - * - The biome is {@linkcode Biome.END} and it is not classic mode - * - The biome is {@linkcode Biome.END} and the fresh start challenge is active - * - The biome is {@linkcode Biome.END} and the player has not either caught the target before or caught all but one starter + * - The player is in the {@linkcode BiomeId.END | End} biome and + * - it is not classic mode; or + * - the fresh start challenge is active; or + * - the player has not caught the target before and the player is still missing more than one starter * - The player is in a mystery encounter that disallows catching the pokemon * @returns Whether a pokeball can be thrown - * */ private checkCanUseBall(): boolean { + const { arena, currentBattle, gameData, gameMode } = globalScene; + const { battleType } = currentBattle; + const { biomeType } = arena; + const { isClassic } = gameMode; + const { dexData } = gameData; + + const someUncaughtSpeciesOnField = globalScene + .getEnemyField() + .some(p => p.isActive() && !dexData[p.species.speciesId].caughtAttr); + const missingMultipleStarters = + gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1; if ( - globalScene.arena.biomeType === BiomeId.END && - (!globalScene.gameMode.isClassic || - globalScene.gameMode.isFreshStartChallenge() || - (globalScene - .getEnemyField() - .some(p => p.isActive() && !globalScene.gameData.dexData[p.species.speciesId].caughtAttr) && - globalScene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1)) + biomeType === BiomeId.END && + (!isClassic || gameMode.isFreshStartChallenge() || (someUncaughtSpeciesOnField && missingMultipleStarters)) ) { this.queueShowText("battle:noPokeballForce"); - } else if (globalScene.currentBattle.battleType === BattleType.TRAINER) { + } else if (battleType === BattleType.TRAINER) { this.queueShowText("battle:noPokeballTrainer"); - } else if ( - globalScene.currentBattle.isBattleMysteryEncounter() && - !globalScene.currentBattle.mysteryEncounter!.catchAllowed - ) { + } else if (currentBattle.isBattleMysteryEncounter() && !currentBattle.mysteryEncounter!.catchAllowed) { this.queueShowText("battle:noPokeballMysteryEncounter"); } else { return true; @@ -398,7 +414,8 @@ export class CommandPhase extends FieldPhase { return false; } - if (cursor < 5) { + const numBallTypes = 5; + if (cursor < numBallTypes) { const targetPokemon = globalScene.getEnemyPokemon(); if ( targetPokemon?.isBoss() && @@ -489,7 +506,7 @@ export class CommandPhase extends FieldPhase { currentBattle.turnCommands[this.fieldIndex] = this.isSwitch ? { command: Command.POKEMON, - cursor: cursor, + cursor, args: [isBatonSwitch], } : { @@ -550,12 +567,6 @@ export class CommandPhase extends FieldPhase { } // Overloads for handleCommand to provide a more specific signature for the different options - handleCommand(command: Command.FIGHT | Command.TERA, cursor: number, useMode?: MoveUseMode, move?: TurnMove): boolean; - handleCommand(command: Command.BALL, cursor: number): boolean; - handleCommand(command: Command.POKEMON, cursor: number, useBaton: boolean): boolean; - handleCommand(command: Command.RUN, cursor: number): boolean; - handleCommand(command: Command, cursor: number, useMode?: boolean | MoveUseMode, move?: TurnMove): boolean; - /** * Process the command phase logic based on the selected command * @@ -563,8 +574,20 @@ export class CommandPhase extends FieldPhase { * @param cursor - The index of option that the cursor is on, or -1 if no option is selected * @param useMode - The mode to use for the move, if applicable. For switches, a boolean that specifies whether the switch is a Baton switch. * @param move - For {@linkcode Command.FIGHT}, the move to use + * @returns Whether the command was successful */ - handleCommand(command: Command, cursor: number, useMode: boolean | MoveUseMode = false, move?: TurnMove): boolean { + handleCommand(command: Command.FIGHT | Command.TERA, cursor: number, useMode?: MoveUseMode, move?: TurnMove): boolean; + handleCommand(command: Command.BALL, cursor: number): boolean; + handleCommand(command: Command.POKEMON, cursor: number, useBaton: boolean): boolean; + handleCommand(command: Command.RUN, cursor: number): boolean; + handleCommand(command: Command, cursor: number, useMode?: boolean | MoveUseMode, move?: TurnMove): boolean; + + public handleCommand( + command: Command, + cursor: number, + useMode: boolean | MoveUseMode = false, + move?: TurnMove, + ): boolean { let success = false; switch (command) { From 0c82b3f514d2624ea1d36e39b5a749f385fa3013 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:14:24 -0600 Subject: [PATCH 033/106] Improve documentation Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/phases/command-phase.ts | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 44b365146d9..016d4ff5d3b 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -107,9 +107,8 @@ export class CommandPhase extends FieldPhase { /** * Clear out all unusable moves in front of the currently acting pokemon's move queue. - * - * TODO: Refactor move queue handling to ensure that this method is not necessary. */ + // TODO: Refactor move queue handling to ensure that this method is not necessary. private clearUnusuableMoves(): void { const playerPokemon = this.getPokemon(); const moveQueue = playerPokemon.getMoveQueue(); @@ -355,8 +354,10 @@ export class CommandPhase extends FieldPhase { } /** - * Helper method for {@linkcode handleBallCommand} that checks if the pokeball can be thrown. + * Helper method for {@linkcode handleBallCommand} that checks if a pokeball can be thrown + * and displays the appropriate error message. * + * @remarks * The pokeball may not be thrown if any of the following are true: * - It is a trainer battle * - The player is in the {@linkcode BiomeId.END | End} biome and @@ -443,10 +444,10 @@ export class CommandPhase extends FieldPhase { } /** - * Helper method to handle the logic for effects that prevent the pokemon from leaving the field + * Submethod of {@linkcode tryLeaveField} to handle the logic for effects that prevent the pokemon from leaving the field * due to trapping abilities or effects. * - * This method queues the proper messages in the case of trapping abilities or effects + * This method queues the proper messages in the case of trapping abilities or effects. * * @returns Whether the pokemon is currently trapped */ @@ -496,8 +497,7 @@ export class CommandPhase extends FieldPhase { * Checks for trapping abilities and effects. * * @param cursor - The index of the option that the cursor is on - * @param isBatonSwitch - Whether the switch command is switching via the Baton item - * @returns whether the pokemon is able to leave the field, indicating the command phase should end + * @returns Whether the pokemon is able to leave the field, indicating the command phase should end */ private tryLeaveField(cursor?: number, isBatonSwitch = false): boolean { const currentBattle = globalScene.currentBattle; @@ -521,6 +521,19 @@ export class CommandPhase extends FieldPhase { return false; } + /** + * Helper method for {@linkcode handleCommand} that handles the logic when the selected command is RUN. + * + * @remarks + * Checks if the player is allowed to flee, and if not, queues the appropriate message. + * + * The player cannot flee if: + * - The player is in the {@linkcode BiomeId.END | End} biome + * - The player is in a trainer battle + * - The player is in a mystery encounter that disallows fleeing + * - The player's pokemon is trapped by an ability or effect + * @returns Whether the pokemon is able to leave the field, indicating the command phase should end + */ private handleRunCommand(): boolean { const { currentBattle, arena } = globalScene; const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed ?? true; From 903fad89d9e4d25fd4665958b3cc99efab718db5 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Mon, 28 Jul 2025 01:46:11 -0400 Subject: [PATCH 034/106] [Balance][Challenge] Added expanded Fresh Start options (#6162) --- src/data/challenge.ts | 35 ++++++++++++++++++++++++++--------- src/system/achv.ts | 2 +- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index db4ec931bc2..aaa82a7d20f 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -4,6 +4,7 @@ import { defaultStarterSpecies } from "#app/constants"; import { globalScene } from "#app/global-scene"; import { pokemonEvolutions } from "#balance/pokemon-evolutions"; import { speciesStarterCosts } from "#balance/starters"; +import { getEggTierForSpecies } from "#data/egg"; import { pokemonFormChanges } from "#data/pokemon-forms"; import type { PokemonSpecies } from "#data/pokemon-species"; import { getPokemonSpeciesForm } from "#data/pokemon-species"; @@ -11,6 +12,7 @@ import { BattleType } from "#enums/battle-type"; import { ChallengeType } from "#enums/challenge-type"; import { Challenges } from "#enums/challenges"; import { TypeColor, TypeShadow } from "#enums/color"; +import { EggTier } from "#enums/egg-type"; import { ClassicFixedBossWaves } from "#enums/fixed-boss-waves"; import { ModifierTier } from "#enums/modifier-tier"; import type { MoveId } from "#enums/move-id"; @@ -683,11 +685,14 @@ export class SingleTypeChallenge extends Challenge { */ export class FreshStartChallenge extends Challenge { constructor() { - super(Challenges.FRESH_START, 1); + super(Challenges.FRESH_START, 3); } applyStarterChoice(pokemon: PokemonSpecies, valid: BooleanHolder): boolean { - if (!defaultStarterSpecies.includes(pokemon.speciesId)) { + if ( + (this.value === 1 && !defaultStarterSpecies.includes(pokemon.speciesId)) || + (this.value === 2 && getEggTierForSpecies(pokemon) >= EggTier.EPIC) + ) { valid.value = false; return true; } @@ -695,15 +700,12 @@ export class FreshStartChallenge extends Challenge { } applyStarterCost(species: SpeciesId, cost: NumberHolder): boolean { - if (defaultStarterSpecies.includes(species)) { - cost.value = speciesStarterCosts[species]; - return true; - } - return false; + cost.value = speciesStarterCosts[species]; + return true; } applyStarterModify(pokemon: Pokemon): boolean { - pokemon.abilityIndex = 0; // Always base ability, not hidden ability + pokemon.abilityIndex = pokemon.abilityIndex % 2; // Always base ability, if you set it to hidden it wraps to first ability pokemon.passive = false; // Passive isn't unlocked pokemon.nature = Nature.HARDY; // Neutral nature pokemon.moveset = pokemon.species @@ -715,7 +717,22 @@ export class FreshStartChallenge extends Challenge { pokemon.luck = 0; // No luck pokemon.shiny = false; // Not shiny pokemon.variant = 0; // Not shiny - pokemon.formIndex = 0; // Froakie should be base form + if (pokemon.species.speciesId === SpeciesId.ZYGARDE && pokemon.formIndex >= 2) { + pokemon.formIndex -= 2; // Sets 10%-PC to 10%-AB and 50%-PC to 50%-AB + } else if ( + pokemon.formIndex > 0 && + [ + SpeciesId.PIKACHU, + SpeciesId.EEVEE, + SpeciesId.PICHU, + SpeciesId.ROTOM, + SpeciesId.MELOETTA, + SpeciesId.FROAKIE, + SpeciesId.ROCKRUFF, + ].includes(pokemon.species.speciesId) + ) { + pokemon.formIndex = 0; // These mons are set to form 0 because they're meant to be unlocks or mid-run form changes + } pokemon.ivs = [15, 15, 15, 15, 15, 15]; // Default IVs of 15 for all stats (Updated to 15 from 10 in 1.2.0) pokemon.teraType = pokemon.species.type1; // Always primary tera type return true; diff --git a/src/system/achv.ts b/src/system/achv.ts index abe6f264d20..69eade02e35 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -890,7 +890,7 @@ export const achvs = { 100, c => c instanceof FreshStartChallenge && - c.value > 0 && + c.value === 1 && !globalScene.gameMode.challenges.some( c => [Challenges.INVERSE_BATTLE, Challenges.FLIP_STAT].includes(c.id) && c.value > 0, ), From c92b895946825d1a552224810629927296614d12 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:43:36 -0400 Subject: [PATCH 035/106] [Dev] Add `workflow-dispatch` trigger to tests github workflow (#6152) Add `workflow-dispatch` trigger to github workflow Co-authored-by: damocleas --- .github/workflows/tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d3dd23eb379..764a35ace60 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,6 +11,7 @@ on: - beta merge_group: types: [checks_requested] + workflow_dispatch: jobs: check-path-change-filter: From 48db9491c6a61eb871b7dc591c427a44a824b277 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Mon, 28 Jul 2025 14:51:43 -0400 Subject: [PATCH 036/106] [Test] Add support for custom boilerplates to `create-test.js` (#6158) * Added support for custom boilerplates to test:create script * Added support for custom boilerplates to create-test.js * Fixed syntax error * Update create-test.js Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> * Fix pluralization error in `create-test.js` --------- Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> --- .../default.ts} | 0 scripts/create-test/create-test.js | 107 +++++++++++------- 2 files changed, 63 insertions(+), 44 deletions(-) rename scripts/create-test/{test-boilerplate.ts => boilerplates/default.ts} (100%) diff --git a/scripts/create-test/test-boilerplate.ts b/scripts/create-test/boilerplates/default.ts similarity index 100% rename from scripts/create-test/test-boilerplate.ts rename to scripts/create-test/boilerplates/default.ts diff --git a/scripts/create-test/create-test.js b/scripts/create-test/create-test.js index c0f27f8891e..765993959d1 100644 --- a/scripts/create-test/create-test.js +++ b/scripts/create-test/create-test.js @@ -17,15 +17,20 @@ const version = "2.0.1"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const projectRoot = path.join(__dirname, "..", ".."); -const boilerplateFilePath = path.join(__dirname, "test-boilerplate.ts"); -const choices = [ - { label: "Move", dir: "moves" }, - { label: "Ability", dir: "abilities" }, - { label: "Item", dir: "items" }, - { label: "Mystery Encounter", dir: "mystery-encounter/encounters" }, - { label: "Utils", dir: "utils" }, - { label: "UI", dir: "ui" }, -]; + +const choices = /** @type {const} */ (["Move", "Ability", "Item", "Reward", "Mystery Encounter", "Utils", "UI"]); +/** @typedef {choices[number]} choiceType */ + +/** @satisfies {{[k in choiceType]: string}} */ +const choicesToDirs = /** @type {const} */ ({ + Move: "moves", + Ability: "abilities", + Item: "items", + Reward: "rewards", + "Mystery Encounter": "mystery-encounter/encounters", + Utils: "utils", + UI: "ui", +}); //#endregion //#region Functions @@ -41,48 +46,47 @@ function getTestFolderPath(...folders) { /** * Prompts the user to select a type via list. - * @returns {Promise<{selectedOption: {label: string, dir: string}}>} the selected type + * @returns {Promise} the selected type */ async function promptTestType() { - const typeAnswer = await inquirer + /** @type {choiceType | "EXIT"} */ + const choice = await inquirer .prompt([ { type: "list", name: "selectedOption", message: "What type of test would you like to create?", - choices: [...choices.map(choice => ({ name: choice.label, value: choice })), { name: "EXIT", value: "N/A" }], + choices: [...choices, "EXIT"], }, ]) - .then(ans => ans.selectedOption); + .then(ta => ta.selectedOption); - if (typeAnswer.name === "EXIT") { + if (choice === "EXIT") { console.log("Exiting..."); return process.exit(0); } - if (!choices.some(choice => choice.dir === typeAnswer.dir)) { - console.error(`Please provide a valid type: (${choices.map(choice => choice.label).join(", ")})!`); - return await promptTestType(); - } - return typeAnswer; + return choice; } /** * Prompts the user to provide a file name. - * @param {string} selectedType - * @returns {Promise<{userInput: string}>} the selected file name + * @param {choiceType} selectedType The chosen string (used to display console logs) + * @returns {Promise} the selected file name */ async function promptFileName(selectedType) { - /** @type {{userInput: string}} */ - const fileNameAnswer = await inquirer.prompt([ - { - type: "input", - name: "userInput", - message: `Please provide the name of the ${selectedType}:`, - }, - ]); + /** @type {string} */ + const fileNameAnswer = await inquirer + .prompt([ + { + type: "input", + name: "userInput", + message: `Please provide the name of the ${selectedType}.`, + }, + ]) + .then(fa => fa.userInput); - if (!fileNameAnswer.userInput || fileNameAnswer.userInput.trim().length === 0) { + if (fileNameAnswer.trim().length === 0) { console.error("Please provide a valid file name!"); return await promptFileName(selectedType); } @@ -90,51 +94,66 @@ async function promptFileName(selectedType) { return fileNameAnswer; } +/** + * Obtain the path to the boilerplate file based on the current option. + * @param {choiceType} choiceType The choice selected + * @returns {string} The path to the boilerplate file + */ +function getBoilerplatePath(choiceType) { + switch (choiceType) { + // case "Reward": + // return path.join(__dirname, "boilerplates/reward.ts"); + default: + return path.join(__dirname, "boilerplates/default.ts"); + } +} + /** * Runs the interactive test:create "CLI" * @returns {Promise} */ async function runInteractive() { - console.group(chalk.grey(`Create Test - v${version}\n`)); + console.group(chalk.grey(`🧪 Create Test - v${version}\n`)); try { - const typeAnswer = await promptTestType(); - const fileNameAnswer = await promptFileName(typeAnswer.selectedOption.label); + const choice = await promptTestType(); + const fileNameAnswer = await promptFileName(choice); - const type = typeAnswer.selectedOption; // Convert fileName from snake_case or camelCase to kebab-case - const fileName = fileNameAnswer.userInput + const fileName = fileNameAnswer .replace(/_+/g, "-") // Convert snake_case (underscore) to kebab-case (dashes) .replace(/([a-z])([A-Z])/g, "$1-$2") // Convert camelCase to kebab-case .replace(/\s+/g, "-") // Replace spaces with dashes .toLowerCase(); // Ensure all lowercase - // Format the description for the test case + // Format the description for the test case in Title Case const formattedName = fileName.replace(/-/g, " ").replace(/\b\w/g, char => char.toUpperCase()); + const description = `${choice} - ${formattedName}`; + // Determine the directory based on the type - const dir = getTestFolderPath(type.dir); - const description = `${type.label} - ${formattedName}`; + const localDir = choicesToDirs[choice]; + const absoluteDir = getTestFolderPath(localDir); // Define the content template - const content = fs.readFileSync(boilerplateFilePath, "utf8").replace("{{description}}", description); + const content = fs.readFileSync(getBoilerplatePath(choice), "utf8").replace("{{description}}", description); // Ensure the directory exists - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); + if (!fs.existsSync(absoluteDir)) { + fs.mkdirSync(absoluteDir, { recursive: true }); } // Create the file with the given name - const filePath = path.join(dir, `${fileName}.test.ts`); + const filePath = path.join(absoluteDir, `${fileName}.test.ts`); if (fs.existsSync(filePath)) { - console.error(chalk.red.bold(`\n✗ File "${fileName}.test.ts" already exists!\n`)); + console.error(chalk.red.bold(`✗ File "${fileName}.test.ts" already exists!\n`)); process.exit(1); } // Write the template content to the file fs.writeFileSync(filePath, content, "utf8"); - console.log(chalk.green.bold(`\n✔ File created at: test/${type.dir}/${fileName}.test.ts\n`)); + console.log(chalk.green.bold(`✔ File created at: test/${localDir}/${fileName}.test.ts\n`)); console.groupEnd(); } catch (err) { console.error(chalk.red("✗ Error: ", err.message)); From 0517d5704aa63f09a92002ba06e4f95e0c8939d2 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 28 Jul 2025 20:13:10 -0600 Subject: [PATCH 037/106] [Refactor] Mark nickname in pokemon as optional (#6168) Mark nickname in pokemon as optional --- src/@types/illusion-data.ts | 2 +- src/field/pokemon.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/@types/illusion-data.ts b/src/@types/illusion-data.ts index b152e3fdf59..5bf86d23ac2 100644 --- a/src/@types/illusion-data.ts +++ b/src/@types/illusion-data.ts @@ -11,7 +11,7 @@ export interface IllusionData { /** The name of pokemon featured in the illusion */ name: string; /** The nickname of the pokemon featured in the illusion */ - nickname: string; + nickname?: string; /** Whether the pokemon featured in the illusion is shiny or not */ shiny: boolean; /** The variant of the pokemon featured in the illusion */ diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index fd04c007e1b..7aecc0c8e75 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -213,7 +213,11 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * TODO: Stop treating this like a unique ID and stop treating 0 as no pokemon */ public id: number; - public nickname: string; + /** + * The Pokemon's current nickname, or `undefined` if it currently lacks one. + * If omitted, references to this should refer to the default name for this Pokemon's species. + */ + public nickname?: string; public species: PokemonSpecies; public formIndex: number; public abilityIndex: number; @@ -443,7 +447,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { getNameToRender(useIllusion = true) { const illusion = this.summonData.illusion; const name = useIllusion ? (illusion?.name ?? this.name) : this.name; - const nickname: string = useIllusion ? (illusion?.nickname ?? this.nickname) : this.nickname; + const nickname: string | undefined = useIllusion ? illusion?.nickname : this.nickname; try { if (nickname) { return decodeURIComponent(escape(atob(nickname))); // TODO: Remove `atob` and `escape`... eventually... From 9f74bfff943190e365b6900dc6bb9211f711ac62 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 29 Jul 2025 08:59:41 -0700 Subject: [PATCH 038/106] [Dev] Update Vite from 6.3.5 to 7.0.6 (#6163) --- package.json | 8 +- pnpm-lock.yaml | 918 ++++++++++++++++++++++--------------------------- 2 files changed, 418 insertions(+), 508 deletions(-) diff --git a/package.json b/package.json index 02d063389b7..71a8b1ae334 100644 --- a/package.json +++ b/package.json @@ -30,19 +30,19 @@ "@biomejs/biome": "2.0.0", "@ls-lint/ls-lint": "2.3.1", "@types/jsdom": "^21.1.7", - "@types/node": "^22.16.3", + "@types/node": "^22.16.5", "@vitest/coverage-istanbul": "^3.2.4", "@vitest/expect": "^3.2.4", "chalk": "^5.4.1", "dependency-cruiser": "^16.10.4", - "inquirer": "^12.7.0", + "inquirer": "^12.8.2", "jsdom": "^26.1.0", "lefthook": "^1.12.2", "msw": "^2.10.4", "phaser3spectorjs": "^0.0.8", - "typedoc": "^0.28.7", + "typedoc": "^0.28.8", "typescript": "^5.8.3", - "vite": "^6.3.5", + "vite": "^7.0.6", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.2.4", "vitest-canvas-mock": "^0.3.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86a7bb904a1..900be6fd76e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,11 +52,11 @@ importers: specifier: ^21.1.7 version: 21.1.7 '@types/node': - specifier: ^22.16.3 - version: 22.16.3 + specifier: ^22.16.5 + version: 22.16.5 '@vitest/coverage-istanbul': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(yaml@2.8.0)) '@vitest/expect': specifier: ^3.2.4 version: 3.2.4 @@ -67,8 +67,8 @@ importers: specifier: ^16.10.4 version: 16.10.4 inquirer: - specifier: ^12.7.0 - version: 12.7.0(@types/node@22.16.3) + specifier: ^12.8.2 + version: 12.8.2(@types/node@22.16.5) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -77,28 +77,28 @@ importers: version: 1.12.2 msw: specifier: ^2.10.4 - version: 2.10.4(@types/node@22.16.3)(typescript@5.8.3) + version: 2.10.4(@types/node@22.16.5)(typescript@5.8.3) phaser3spectorjs: specifier: ^0.0.8 version: 0.0.8 typedoc: - specifier: ^0.28.7 - version: 0.28.7(typescript@5.8.3) + specifier: ^0.28.8 + version: 0.28.8(typescript@5.8.3) typescript: specifier: ^5.8.3 version: 5.8.3 vite: - specifier: ^6.3.5 - version: 6.3.5(@types/node@22.16.3)(yaml@2.8.0) + specifier: ^7.0.6 + version: 7.0.6(@types/node@22.16.5)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.3)(yaml@2.8.0)) + version: 5.1.4(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(yaml@2.8.0)) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0) + version: 3.2.4(@types/node@22.16.5)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(yaml@2.8.0) vitest-canvas-mock: specifier: ^0.3.3 - version: 0.3.3(vitest@3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0)) + version: 0.3.3(vitest@3.2.4(@types/node@22.16.5)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(yaml@2.8.0)) packages: @@ -155,8 +155,8 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + '@babel/helpers@7.28.2': + resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} engines: {node: '>=6.9.0'} '@babel/parser@7.28.0': @@ -164,8 +164,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/runtime@7.28.2': + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': @@ -176,8 +176,8 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} '@biomejs/biome@2.0.0': @@ -270,167 +270,167 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@gerrit0/mini-shiki@3.7.0': - resolution: {integrity: sha512-7iY9wg4FWXmeoFJpUL2u+tsmh0d0jcEJHAIzVxl3TG4KL493JNnisdLAILZ77zcD+z3J0keEXZ+lFzUgzQzPDg==} + '@gerrit0/mini-shiki@3.8.1': + resolution: {integrity: sha512-HVZW+8pxoOExr5ZMPK15U79jQAZTO/S6i5byQyyZGjtNj+qaYd82cizTncwFzTQgiLo8uUBym6vh+/1tfJklTw==} - '@inquirer/checkbox@4.1.9': - resolution: {integrity: sha512-DBJBkzI5Wx4jFaYm221LHvAhpKYkhVS0k9plqHwaHhofGNxvYB7J3Bz8w+bFJ05zaMb0sZNHo4KdmENQFlNTuQ==} + '@inquirer/checkbox@4.2.0': + resolution: {integrity: sha512-fdSw07FLJEU5vbpOPzXo5c6xmMGDzbZE2+niuDHX5N6mc6V0Ebso/q3xiHra4D73+PMsC8MJmcaZKuAAoaQsSA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -438,8 +438,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.13': - resolution: {integrity: sha512-EkCtvp67ICIVVzjsquUiVSd+V5HRGOGQfsqA4E4vMWhYnB7InUL0pa0TIWt1i+OfP16Gkds8CdIu6yGZwOM1Yw==} + '@inquirer/confirm@5.1.14': + resolution: {integrity: sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -447,8 +447,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.14': - resolution: {integrity: sha512-Ma+ZpOJPewtIYl6HZHZckeX1STvDnHTCB2GVINNUlSEn2Am6LddWwfPkIGY0IUFVjUUrr/93XlBwTK6mfLjf0A==} + '@inquirer/core@10.1.15': + resolution: {integrity: sha512-8xrp836RZvKkpNbVvgWUlxjT4CraKk2q+I3Ksy+seI2zkcE+y6wNs1BVhgcv8VyImFecUhdQrYLdW32pAjwBdA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -456,8 +456,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.14': - resolution: {integrity: sha512-yd2qtLl4QIIax9DTMZ1ZN2pFrrj+yL3kgIWxm34SS6uwCr0sIhsNyudUjAo5q3TqI03xx4SEBkUJqZuAInp9uA==} + '@inquirer/editor@4.2.15': + resolution: {integrity: sha512-wst31XT8DnGOSS4nNJDIklGKnf+8shuauVrWzgKegWUe28zfCftcWZ2vktGdzJgcylWSS2SrDnYUb6alZcwnCQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -465,8 +465,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.16': - resolution: {integrity: sha512-oiDqafWzMtofeJyyGkb1CTPaxUkjIcSxePHHQCfif8t3HV9pHcw1Kgdw3/uGpDvaFfeTluwQtWiqzPVjAqS3zA==} + '@inquirer/expand@4.0.17': + resolution: {integrity: sha512-PSqy9VmJx/VbE3CT453yOfNa+PykpKg/0SYP7odez1/NWBGuDXgPhp4AeGYYKjhLn5lUUavVS/JbeYMPdH50Mw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -474,12 +474,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.12': - resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} engines: {node: '>=18'} - '@inquirer/input@4.2.0': - resolution: {integrity: sha512-opqpHPB1NjAmDISi3uvZOTrjEEU5CWVu/HBkDby8t93+6UxYX0Z7Ps0Ltjm5sZiEbWenjubwUkivAEYQmy9xHw==} + '@inquirer/input@4.2.1': + resolution: {integrity: sha512-tVC+O1rBl0lJpoUZv4xY+WGWY8V5b0zxU1XDsMsIHYregdh7bN5X5QnIONNBAl0K765FYlAfNHS2Bhn7SSOVow==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -487,8 +487,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.16': - resolution: {integrity: sha512-kMrXAaKGavBEoBYUCgualbwA9jWUx2TjMA46ek+pEKy38+LFpL9QHlTd8PO2kWPUgI/KB+qi02o4y2rwXbzr3Q==} + '@inquirer/number@3.0.17': + resolution: {integrity: sha512-GcvGHkyIgfZgVnnimURdOueMk0CztycfC8NZTiIY9arIAkeOgt6zG57G+7vC59Jns3UX27LMkPKnKWAOF5xEYg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -496,8 +496,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.16': - resolution: {integrity: sha512-g8BVNBj5Zeb5/Y3cSN+hDUL7CsIFDIuVxb9EPty3lkxBaYpjL5BNRKSYOF9yOLe+JOcKFd+TSVeADQ4iSY7rbg==} + '@inquirer/password@4.0.17': + resolution: {integrity: sha512-DJolTnNeZ00E1+1TW+8614F7rOJJCM4y4BAGQ3Gq6kQIG+OJ4zr3GLjIjVVJCbKsk2jmkmv6v2kQuN/vriHdZA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -505,8 +505,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.6.0': - resolution: {integrity: sha512-jAhL7tyMxB3Gfwn4HIJ0yuJ5pvcB5maYUcouGcgd/ub79f9MqZ+aVnBtuFf+VC2GTkCBF+R+eo7Vi63w5VZlzw==} + '@inquirer/prompts@7.7.1': + resolution: {integrity: sha512-XDxPrEWeWUBy8scAXzXuFY45r/q49R0g72bUzgQXZ1DY/xEFX+ESDMkTQolcb5jRBzaNJX2W8XQl6krMNDTjaA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -514,8 +514,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.1.4': - resolution: {integrity: sha512-5GGvxVpXXMmfZNtvWw4IsHpR7RzqAR624xtkPd1NxxlV5M+pShMqzL4oRddRkg8rVEOK9fKdJp1jjVML2Lr7TQ==} + '@inquirer/rawlist@4.1.5': + resolution: {integrity: sha512-R5qMyGJqtDdi4Ht521iAkNqyB6p2UPuZUbMifakg1sWtu24gc2Z8CJuw8rP081OckNDMgtDCuLe42Q2Kr3BolA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -523,8 +523,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.16': - resolution: {integrity: sha512-POCmXo+j97kTGU6aeRjsPyuCpQQfKcMXdeTMw708ZMtWrj5aykZvlUxH4Qgz3+Y1L/cAVZsSpA+UgZCu2GMOMg==} + '@inquirer/search@3.0.17': + resolution: {integrity: sha512-CuBU4BAGFqRYors4TNCYzy9X3DpKtgIW4Boi0WNkm4Ei1hvY9acxKdBdyqzqBCEe4YxSdaQQsasJlFlUJNgojw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -532,8 +532,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.2.4': - resolution: {integrity: sha512-unTppUcTjmnbl/q+h8XeQDhAqIOmwWYWNyiiP2e3orXrg6tOaa5DHXja9PChCSbChOsktyKgOieRZFnajzxoBg==} + '@inquirer/select@4.3.1': + resolution: {integrity: sha512-Gfl/5sqOF5vS/LIrSndFgOh7jgoe0UXEizDqahFRkq5aJBLegZ6WjuMh/hVEJwlFQjyLq1z9fRtvUMkb7jM1LA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -541,8 +541,8 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.7': - resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -580,8 +580,8 @@ packages: '@material/material-color-utilities@0.2.7': resolution: {integrity: sha512-0FCeqG6WvK4/Cc06F/xXMd/pv4FeisI0c1tUpBbfhA2n9Y8eZEv4Karjbmf2ZqQCPUWMrGp8A571tCjizxoTiQ==} - '@mswjs/interceptors@0.39.2': - resolution: {integrity: sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==} + '@mswjs/interceptors@0.39.4': + resolution: {integrity: sha512-B82DbrGVCIBrNEfRJbqUFB0eNz0wVzqbenEpmbE71XLVU4yKZbDnRBuxz+7udc/uM7LDWDD4sRJ5tISzHf2QkQ==} engines: {node: '>=18'} '@open-draft/deferred-promise@2.2.0': @@ -593,161 +593,121 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@oxlint/darwin-arm64@1.6.0': - resolution: {integrity: sha512-m3wyqBh1TOHjpr/dXeIZY7OoX+MQazb+bMHQdDtwUvefrafUx+5YHRvulYh1sZSQ449nQ3nk3qj5qj535vZRjg==} - cpu: [arm64] - os: [darwin] - - '@oxlint/darwin-x64@1.6.0': - resolution: {integrity: sha512-75fJfF/9xNypr7cnOYoZBhfmG1yP7ex3pUOeYGakmtZRffO9z1i1quLYhjZsmaDXsAIZ3drMhenYHMmFKS3SRg==} - cpu: [x64] - os: [darwin] - - '@oxlint/linux-arm64-gnu@1.6.0': - resolution: {integrity: sha512-YhXGf0FXa72bEt4F7eTVKx5X3zWpbAOPnaA/dZ6/g8tGhw1m9IFjrabVHFjzcx3dQny4MgA59EhyElkDvpUe8A==} - cpu: [arm64] - os: [linux] - - '@oxlint/linux-arm64-musl@1.6.0': - resolution: {integrity: sha512-T3JDhx8mjGjvh5INsPZJrlKHmZsecgDYvtvussKRdkc1Nnn7WC+jH9sh5qlmYvwzvmetlPVNezAoNvmGO9vtMg==} - cpu: [arm64] - os: [linux] - - '@oxlint/linux-x64-gnu@1.6.0': - resolution: {integrity: sha512-Dx7ghtAl8aXBdqofJpi338At6lkeCtTfoinTYQXd9/TEJx+f+zCGNlQO6nJz3ydJBX48FDuOFKkNC+lUlWrd8w==} - cpu: [x64] - os: [linux] - - '@oxlint/linux-x64-musl@1.6.0': - resolution: {integrity: sha512-7KvMGdWmAZtAtg6IjoEJHKxTXdAcrHnUnqfgs0JpXst7trquV2mxBeRZusQXwxpu4HCSomKMvJfsp1qKaqSFDg==} - cpu: [x64] - os: [linux] - - '@oxlint/win32-arm64@1.6.0': - resolution: {integrity: sha512-iSGC9RwX+dl7o5KFr5aH7Gq3nFbkq/3Gda6mxNPMvNkWrgXdIyiINxpyD8hJu566M+QSv1wEAu934BZotFDyoQ==} - cpu: [arm64] - os: [win32] - - '@oxlint/win32-x64@1.6.0': - resolution: {integrity: sha512-jOj3L/gfLc0IwgOTkZMiZ5c673i/hbAmidlaylT0gE6H18hln9HxPgp5GCf4E4y6mwEJlW8QC5hQi221+9otdA==} - cpu: [x64] - os: [win32] - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.45.0': - resolution: {integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==} + '@rollup/rollup-android-arm-eabi@4.46.1': + resolution: {integrity: sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.0': - resolution: {integrity: sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==} + '@rollup/rollup-android-arm64@4.46.1': + resolution: {integrity: sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.0': - resolution: {integrity: sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==} + '@rollup/rollup-darwin-arm64@4.46.1': + resolution: {integrity: sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.0': - resolution: {integrity: sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==} + '@rollup/rollup-darwin-x64@4.46.1': + resolution: {integrity: sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.0': - resolution: {integrity: sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==} + '@rollup/rollup-freebsd-arm64@4.46.1': + resolution: {integrity: sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.0': - resolution: {integrity: sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==} + '@rollup/rollup-freebsd-x64@4.46.1': + resolution: {integrity: sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.0': - resolution: {integrity: sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==} + '@rollup/rollup-linux-arm-gnueabihf@4.46.1': + resolution: {integrity: sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.0': - resolution: {integrity: sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==} + '@rollup/rollup-linux-arm-musleabihf@4.46.1': + resolution: {integrity: sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.0': - resolution: {integrity: sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==} + '@rollup/rollup-linux-arm64-gnu@4.46.1': + resolution: {integrity: sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.0': - resolution: {integrity: sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==} + '@rollup/rollup-linux-arm64-musl@4.46.1': + resolution: {integrity: sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.0': - resolution: {integrity: sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==} + '@rollup/rollup-linux-loongarch64-gnu@4.46.1': + resolution: {integrity: sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': - resolution: {integrity: sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==} + '@rollup/rollup-linux-ppc64-gnu@4.46.1': + resolution: {integrity: sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.0': - resolution: {integrity: sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==} + '@rollup/rollup-linux-riscv64-gnu@4.46.1': + resolution: {integrity: sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.0': - resolution: {integrity: sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==} + '@rollup/rollup-linux-riscv64-musl@4.46.1': + resolution: {integrity: sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.0': - resolution: {integrity: sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==} + '@rollup/rollup-linux-s390x-gnu@4.46.1': + resolution: {integrity: sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.0': - resolution: {integrity: sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==} + '@rollup/rollup-linux-x64-gnu@4.46.1': + resolution: {integrity: sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.0': - resolution: {integrity: sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==} + '@rollup/rollup-linux-x64-musl@4.46.1': + resolution: {integrity: sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.45.0': - resolution: {integrity: sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==} + '@rollup/rollup-win32-arm64-msvc@4.46.1': + resolution: {integrity: sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.0': - resolution: {integrity: sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==} + '@rollup/rollup-win32-ia32-msvc@4.46.1': + resolution: {integrity: sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.0': - resolution: {integrity: sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==} + '@rollup/rollup-win32-x64-msvc@4.46.1': + resolution: {integrity: sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==} cpu: [x64] os: [win32] - '@shikijs/engine-oniguruma@3.7.0': - resolution: {integrity: sha512-5BxcD6LjVWsGu4xyaBC5bu8LdNgPCVBnAkWTtOCs/CZxcB22L8rcoWfv7Hh/3WooVjBZmFtyxhgvkQFedPGnFw==} + '@shikijs/engine-oniguruma@3.8.1': + resolution: {integrity: sha512-KGQJZHlNY7c656qPFEQpIoqOuC4LrxjyNndRdzk5WKB/Ie87+NJCF1xo9KkOUxwxylk7rT6nhlZyTGTC4fCe1g==} - '@shikijs/langs@3.7.0': - resolution: {integrity: sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==} + '@shikijs/langs@3.8.1': + resolution: {integrity: sha512-TjOFg2Wp1w07oKnXjs0AUMb4kJvujML+fJ1C5cmEj45lhjbUXtziT1x2bPQb9Db6kmPhkG5NI2tgYW1/DzhUuQ==} - '@shikijs/themes@3.7.0': - resolution: {integrity: sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==} + '@shikijs/themes@3.8.1': + resolution: {integrity: sha512-Vu3t3BBLifc0GB0UPg2Pox1naTemrrvyZv2lkiSw3QayVV60me1ujFQwPZGgUTmwXl1yhCPW8Lieesm0CYruLQ==} - '@shikijs/types@3.7.0': - resolution: {integrity: sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==} + '@shikijs/types@3.8.1': + resolution: {integrity: sha512-5C39Q8/8r1I26suLh+5TPk1DTrbY/kn3IdWA5HdizR0FhlhD05zx5nKCqhzSfDHH3p4S0ZefxWd77DLV+8FhGg==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -770,8 +730,8 @@ packages: '@types/jsdom@21.1.7': resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} - '@types/node@22.16.3': - resolution: {integrity: sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==} + '@types/node@22.16.5': + resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==} '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} @@ -1008,8 +968,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.182: - resolution: {integrity: sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==} + electron-to-chromium@1.5.191: + resolution: {integrity: sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1044,8 +1004,8 @@ packages: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} engines: {node: '>=18'} hasBin: true @@ -1229,8 +1189,8 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inquirer@12.7.0: - resolution: {integrity: sha512-KKFRc++IONSyE2UYw9CJ1V0IWx5yQKomwB+pp3cWomWs+v2+ZsG11G2OVfAjFS6WWCppKw+RfKmpqGfSzD5QBQ==} + inquirer@12.8.2: + resolution: {integrity: sha512-oBDL9f4+cDambZVJdfJu2M5JQfvaug9lbo6fKDlFV40i8t3FGA1Db67ov5Hp5DInG4zmXhHWTSnlXBntnJ7GMA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1408,8 +1368,8 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + loupe@3.2.0: + resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1501,8 +1461,8 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + nwsapi@2.2.21: + resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -1518,11 +1478,6 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - oxlint@1.6.0: - resolution: {integrity: sha512-jtaD65PqzIa1udvSxxscTKBxYKuZoFXyKGLiU1Qjo1ulq3uv/fQDtoV1yey1FrQZrQjACGPi1Widsy1TucC7Jg==} - engines: {node: '>=8.*'} - hasBin: true - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -1568,19 +1523,14 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} - hasBin: true - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -1629,16 +1579,16 @@ packages: engines: {node: '>= 0.4'} hasBin: true - rollup@4.45.0: - resolution: {integrity: sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==} + rollup@4.46.1: + resolution: {integrity: sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - run-async@4.0.4: - resolution: {integrity: sha512-2cgeRHnV11lSXBEhq7sN7a5UVjTKm9JTb9x8ApIT//16D7QL96AgnNeWSGoB4gIHc0iYw/Ha0Z+waBaCYZVNhg==} + run-async@4.0.5: + resolution: {integrity: sha512-oN9GTgxUNDBumHTTDmQ8dep6VIJbgj9S3dPP+9XylVLIK4xB9XTXtKWROd5pnhdXR9k0EgO1JRcNh0T+Ny2FsA==} engines: {node: '>=0.12.0'} rxjs@7.8.2: @@ -1833,8 +1783,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - typedoc@0.28.7: - resolution: {integrity: sha512-lpz0Oxl6aidFkmS90VQDQjk/Qf2iw0IUvFqirdONBdj7jPSN9mGXhy66BcGNDxx5ZMyKKiBVAREvPEzT6Uxipw==} + typedoc@0.28.8: + resolution: {integrity: sha512-16GfLopc8icHfdvqZDqdGBoS2AieIRP2rpf9mU+MgN+gGLyEQvAO0QgOa6NJ5QNmQi0LFrDY9in4F2fUNKgJKA==} engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: @@ -1880,19 +1830,19 @@ packages: vite: optional: true - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.0.6: + resolution: {integrity: sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -2082,11 +2032,11 @@ snapshots: '@babel/generator': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.27.6 + '@babel/helpers': 7.28.2 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -2098,7 +2048,7 @@ snapshots: '@babel/generator@7.28.0': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 @@ -2116,7 +2066,7 @@ snapshots: '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color @@ -2135,22 +2085,22 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.6': + '@babel/helpers@7.28.2': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 - '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.2': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@babel/traverse@7.28.0': dependencies: @@ -2159,12 +2109,12 @@ snapshots: '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 debug: 4.4.1 transitivePeerDependencies: - supports-color - '@babel/types@7.28.1': + '@babel/types@7.28.2': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -2237,113 +2187,113 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@esbuild/aix-ppc64@0.25.6': + '@esbuild/aix-ppc64@0.25.8': optional: true - '@esbuild/android-arm64@0.25.6': + '@esbuild/android-arm64@0.25.8': optional: true - '@esbuild/android-arm@0.25.6': + '@esbuild/android-arm@0.25.8': optional: true - '@esbuild/android-x64@0.25.6': + '@esbuild/android-x64@0.25.8': optional: true - '@esbuild/darwin-arm64@0.25.6': + '@esbuild/darwin-arm64@0.25.8': optional: true - '@esbuild/darwin-x64@0.25.6': + '@esbuild/darwin-x64@0.25.8': optional: true - '@esbuild/freebsd-arm64@0.25.6': + '@esbuild/freebsd-arm64@0.25.8': optional: true - '@esbuild/freebsd-x64@0.25.6': + '@esbuild/freebsd-x64@0.25.8': optional: true - '@esbuild/linux-arm64@0.25.6': + '@esbuild/linux-arm64@0.25.8': optional: true - '@esbuild/linux-arm@0.25.6': + '@esbuild/linux-arm@0.25.8': optional: true - '@esbuild/linux-ia32@0.25.6': + '@esbuild/linux-ia32@0.25.8': optional: true - '@esbuild/linux-loong64@0.25.6': + '@esbuild/linux-loong64@0.25.8': optional: true - '@esbuild/linux-mips64el@0.25.6': + '@esbuild/linux-mips64el@0.25.8': optional: true - '@esbuild/linux-ppc64@0.25.6': + '@esbuild/linux-ppc64@0.25.8': optional: true - '@esbuild/linux-riscv64@0.25.6': + '@esbuild/linux-riscv64@0.25.8': optional: true - '@esbuild/linux-s390x@0.25.6': + '@esbuild/linux-s390x@0.25.8': optional: true - '@esbuild/linux-x64@0.25.6': + '@esbuild/linux-x64@0.25.8': optional: true - '@esbuild/netbsd-arm64@0.25.6': + '@esbuild/netbsd-arm64@0.25.8': optional: true - '@esbuild/netbsd-x64@0.25.6': + '@esbuild/netbsd-x64@0.25.8': optional: true - '@esbuild/openbsd-arm64@0.25.6': + '@esbuild/openbsd-arm64@0.25.8': optional: true - '@esbuild/openbsd-x64@0.25.6': + '@esbuild/openbsd-x64@0.25.8': optional: true - '@esbuild/openharmony-arm64@0.25.6': + '@esbuild/openharmony-arm64@0.25.8': optional: true - '@esbuild/sunos-x64@0.25.6': + '@esbuild/sunos-x64@0.25.8': optional: true - '@esbuild/win32-arm64@0.25.6': + '@esbuild/win32-arm64@0.25.8': optional: true - '@esbuild/win32-ia32@0.25.6': + '@esbuild/win32-ia32@0.25.8': optional: true - '@esbuild/win32-x64@0.25.6': + '@esbuild/win32-x64@0.25.8': optional: true - '@gerrit0/mini-shiki@3.7.0': + '@gerrit0/mini-shiki@3.8.1': dependencies: - '@shikijs/engine-oniguruma': 3.7.0 - '@shikijs/langs': 3.7.0 - '@shikijs/themes': 3.7.0 - '@shikijs/types': 3.7.0 + '@shikijs/engine-oniguruma': 3.8.1 + '@shikijs/langs': 3.8.1 + '@shikijs/themes': 3.8.1 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 - '@inquirer/checkbox@4.1.9(@types/node@22.16.3)': + '@inquirer/checkbox@4.2.0(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@22.16.5) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/confirm@5.1.13(@types/node@22.16.3)': + '@inquirer/confirm@5.1.14(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/type': 3.0.8(@types/node@22.16.5) optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/core@10.1.14(@types/node@22.16.3)': + '@inquirer/core@10.1.15(@types/node@22.16.5)': dependencies: - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@22.16.5) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -2351,93 +2301,93 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/editor@4.2.14(@types/node@22.16.3)': + '@inquirer/editor@4.2.15(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/type': 3.0.8(@types/node@22.16.5) external-editor: 3.1.0 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/expand@4.0.16(@types/node@22.16.3)': + '@inquirer/expand@4.0.17(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/type': 3.0.8(@types/node@22.16.5) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/figures@1.0.12': {} + '@inquirer/figures@1.0.13': {} - '@inquirer/input@4.2.0(@types/node@22.16.3)': + '@inquirer/input@4.2.1(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/type': 3.0.8(@types/node@22.16.5) optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/number@3.0.16(@types/node@22.16.3)': + '@inquirer/number@3.0.17(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/type': 3.0.8(@types/node@22.16.5) optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/password@4.0.16(@types/node@22.16.3)': + '@inquirer/password@4.0.17(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/type': 3.0.8(@types/node@22.16.5) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/prompts@7.6.0(@types/node@22.16.3)': + '@inquirer/prompts@7.7.1(@types/node@22.16.5)': dependencies: - '@inquirer/checkbox': 4.1.9(@types/node@22.16.3) - '@inquirer/confirm': 5.1.13(@types/node@22.16.3) - '@inquirer/editor': 4.2.14(@types/node@22.16.3) - '@inquirer/expand': 4.0.16(@types/node@22.16.3) - '@inquirer/input': 4.2.0(@types/node@22.16.3) - '@inquirer/number': 3.0.16(@types/node@22.16.3) - '@inquirer/password': 4.0.16(@types/node@22.16.3) - '@inquirer/rawlist': 4.1.4(@types/node@22.16.3) - '@inquirer/search': 3.0.16(@types/node@22.16.3) - '@inquirer/select': 4.2.4(@types/node@22.16.3) + '@inquirer/checkbox': 4.2.0(@types/node@22.16.5) + '@inquirer/confirm': 5.1.14(@types/node@22.16.5) + '@inquirer/editor': 4.2.15(@types/node@22.16.5) + '@inquirer/expand': 4.0.17(@types/node@22.16.5) + '@inquirer/input': 4.2.1(@types/node@22.16.5) + '@inquirer/number': 3.0.17(@types/node@22.16.5) + '@inquirer/password': 4.0.17(@types/node@22.16.5) + '@inquirer/rawlist': 4.1.5(@types/node@22.16.5) + '@inquirer/search': 3.0.17(@types/node@22.16.5) + '@inquirer/select': 4.3.1(@types/node@22.16.5) optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/rawlist@4.1.4(@types/node@22.16.3)': + '@inquirer/rawlist@4.1.5(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/type': 3.0.8(@types/node@22.16.5) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/search@3.0.16(@types/node@22.16.3)': + '@inquirer/search@3.0.17(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@22.16.5) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/select@4.2.4(@types/node@22.16.3)': + '@inquirer/select@4.3.1(@types/node@22.16.5)': dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@22.16.5) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 - '@inquirer/type@3.0.7(@types/node@22.16.3)': + '@inquirer/type@3.0.8(@types/node@22.16.5)': optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 '@isaacs/cliui@8.0.2': dependencies: @@ -2468,7 +2418,7 @@ snapshots: '@material/material-color-utilities@0.2.7': {} - '@mswjs/interceptors@0.39.2': + '@mswjs/interceptors@0.39.4': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -2486,107 +2436,83 @@ snapshots: '@open-draft/until@2.1.0': {} - '@oxlint/darwin-arm64@1.6.0': - optional: true - - '@oxlint/darwin-x64@1.6.0': - optional: true - - '@oxlint/linux-arm64-gnu@1.6.0': - optional: true - - '@oxlint/linux-arm64-musl@1.6.0': - optional: true - - '@oxlint/linux-x64-gnu@1.6.0': - optional: true - - '@oxlint/linux-x64-musl@1.6.0': - optional: true - - '@oxlint/win32-arm64@1.6.0': - optional: true - - '@oxlint/win32-x64@1.6.0': - optional: true - '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/rollup-android-arm-eabi@4.45.0': + '@rollup/rollup-android-arm-eabi@4.46.1': optional: true - '@rollup/rollup-android-arm64@4.45.0': + '@rollup/rollup-android-arm64@4.46.1': optional: true - '@rollup/rollup-darwin-arm64@4.45.0': + '@rollup/rollup-darwin-arm64@4.46.1': optional: true - '@rollup/rollup-darwin-x64@4.45.0': + '@rollup/rollup-darwin-x64@4.46.1': optional: true - '@rollup/rollup-freebsd-arm64@4.45.0': + '@rollup/rollup-freebsd-arm64@4.46.1': optional: true - '@rollup/rollup-freebsd-x64@4.45.0': + '@rollup/rollup-freebsd-x64@4.46.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.0': + '@rollup/rollup-linux-arm-gnueabihf@4.46.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.0': + '@rollup/rollup-linux-arm-musleabihf@4.46.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.0': + '@rollup/rollup-linux-arm64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.0': + '@rollup/rollup-linux-arm64-musl@4.46.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.0': + '@rollup/rollup-linux-loongarch64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': + '@rollup/rollup-linux-ppc64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.0': + '@rollup/rollup-linux-riscv64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.0': + '@rollup/rollup-linux-riscv64-musl@4.46.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.0': + '@rollup/rollup-linux-s390x-gnu@4.46.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.0': + '@rollup/rollup-linux-x64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-x64-musl@4.45.0': + '@rollup/rollup-linux-x64-musl@4.46.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.0': + '@rollup/rollup-win32-arm64-msvc@4.46.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.0': + '@rollup/rollup-win32-ia32-msvc@4.46.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.0': + '@rollup/rollup-win32-x64-msvc@4.46.1': optional: true - '@shikijs/engine-oniguruma@3.7.0': + '@shikijs/engine-oniguruma@3.8.1': dependencies: - '@shikijs/types': 3.7.0 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.7.0': + '@shikijs/langs@3.8.1': dependencies: - '@shikijs/types': 3.7.0 + '@shikijs/types': 3.8.1 - '@shikijs/themes@3.7.0': + '@shikijs/themes@3.8.1': dependencies: - '@shikijs/types': 3.7.0 + '@shikijs/types': 3.8.1 - '@shikijs/types@3.7.0': + '@shikijs/types@3.8.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -2609,11 +2535,11 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 - '@types/node@22.16.3': + '@types/node@22.16.5': dependencies: undici-types: 6.21.0 @@ -2623,7 +2549,7 @@ snapshots: '@types/unist@3.0.3': {} - '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0))': + '@vitest/coverage-istanbul@3.2.4(vitest@3.2.4(@types/node@22.16.5)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(yaml@2.8.0))': dependencies: '@istanbuljs/schema': 0.1.3 debug: 4.4.1 @@ -2635,7 +2561,7 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0) + vitest: 3.2.4(@types/node@22.16.5)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -2647,14 +2573,14 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(vite@6.3.5(@types/node@22.16.3)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(vite@7.0.6(@types/node@22.16.5)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - msw: 2.10.4(@types/node@22.16.3)(typescript@5.8.3) - vite: 6.3.5(@types/node@22.16.3)(yaml@2.8.0) + msw: 2.10.4(@types/node@22.16.5)(typescript@5.8.3) + vite: 7.0.6(@types/node@22.16.5)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -2679,7 +2605,7 @@ snapshots: '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 + loupe: 3.2.0 tinyrainbow: 2.0.0 acorn-jsx-walk@2.0.0: {} @@ -2734,7 +2660,7 @@ snapshots: browserslist@4.25.1: dependencies: caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.182 + electron-to-chromium: 1.5.191 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) @@ -2764,7 +2690,7 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.4 + loupe: 3.2.0 pathval: 2.0.1 chalk@4.1.2: @@ -2863,7 +2789,7 @@ snapshots: json5: 2.2.3 memoize: 10.1.0 picocolors: 1.1.1 - picomatch: 4.0.2 + picomatch: 4.0.3 prompts: 2.4.2 rechoir: 0.8.0 safe-regex: 2.1.1 @@ -2880,7 +2806,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.182: {} + electron-to-chromium@1.5.191: {} emoji-regex@8.0.0: {} @@ -2905,34 +2831,34 @@ snapshots: dependencies: es-errors: 1.3.0 - esbuild@0.25.6: + esbuild@0.25.8: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 escalade@3.2.0: {} @@ -2958,9 +2884,9 @@ snapshots: fast-uri@3.0.6: {} - fdir@6.4.6(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 foreground-child@3.3.1: dependencies: @@ -3063,7 +2989,7 @@ snapshots: i18next-browser-languagedetector@8.2.0: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 i18next-http-backend@2.7.3: dependencies: @@ -3083,11 +3009,11 @@ snapshots: i18next@22.5.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 i18next@24.2.3(typescript@5.8.3): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 optionalDependencies: typescript: 5.8.3 @@ -3107,17 +3033,17 @@ snapshots: ini@4.1.1: {} - inquirer@12.7.0(@types/node@22.16.3): + inquirer@12.8.2(@types/node@22.16.5): dependencies: - '@inquirer/core': 10.1.14(@types/node@22.16.3) - '@inquirer/prompts': 7.6.0(@types/node@22.16.3) - '@inquirer/type': 3.0.7(@types/node@22.16.3) + '@inquirer/core': 10.1.15(@types/node@22.16.5) + '@inquirer/prompts': 7.7.1(@types/node@22.16.5) + '@inquirer/type': 3.0.8(@types/node@22.16.5) ansi-escapes: 4.3.2 mute-stream: 2.0.0 - run-async: 4.0.4 + run-async: 4.0.5 rxjs: 7.8.2 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 interpret@3.1.1: {} @@ -3203,7 +3129,7 @@ snapshots: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 + nwsapi: 2.2.21 parse5: 7.3.0 rrweb-cssom: 0.8.0 saxes: 6.0.0 @@ -3299,7 +3225,7 @@ snapshots: lodash@4.17.21: {} - loupe@3.1.4: {} + loupe@3.2.0: {} lru-cache@10.4.3: {} @@ -3316,7 +3242,7 @@ snapshots: magicast@0.3.5: dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 source-map-js: 1.2.1 make-dir@4.0.0: @@ -3356,13 +3282,13 @@ snapshots: ms@2.1.3: {} - msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3): + msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.13(@types/node@22.16.3) - '@mswjs/interceptors': 0.39.2 + '@inquirer/confirm': 5.1.14(@types/node@22.16.5) + '@mswjs/interceptors': 0.39.4 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 @@ -3393,7 +3319,7 @@ snapshots: node-releases@2.0.19: {} - nwsapi@2.2.20: {} + nwsapi@2.2.21: {} object-keys@1.1.1: {} @@ -3403,17 +3329,6 @@ snapshots: outvariant@1.4.3: {} - oxlint@1.6.0: - optionalDependencies: - '@oxlint/darwin-arm64': 1.6.0 - '@oxlint/darwin-x64': 1.6.0 - '@oxlint/linux-arm64-gnu': 1.6.0 - '@oxlint/linux-arm64-musl': 1.6.0 - '@oxlint/linux-x64-gnu': 1.6.0 - '@oxlint/linux-x64-musl': 1.6.0 - '@oxlint/win32-arm64': 1.6.0 - '@oxlint/win32-x64': 1.6.0 - package-json-from-dist@1.0.1: {} pako@1.0.11: {} @@ -3462,7 +3377,7 @@ snapshots: picocolors@1.1.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} postcss@8.5.6: dependencies: @@ -3470,8 +3385,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@3.6.2: {} - process-nextick-args@2.0.1: {} prompts@2.4.2: @@ -3517,38 +3430,35 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - rollup@4.45.0: + rollup@4.46.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.0 - '@rollup/rollup-android-arm64': 4.45.0 - '@rollup/rollup-darwin-arm64': 4.45.0 - '@rollup/rollup-darwin-x64': 4.45.0 - '@rollup/rollup-freebsd-arm64': 4.45.0 - '@rollup/rollup-freebsd-x64': 4.45.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.0 - '@rollup/rollup-linux-arm-musleabihf': 4.45.0 - '@rollup/rollup-linux-arm64-gnu': 4.45.0 - '@rollup/rollup-linux-arm64-musl': 4.45.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.0 - '@rollup/rollup-linux-riscv64-gnu': 4.45.0 - '@rollup/rollup-linux-riscv64-musl': 4.45.0 - '@rollup/rollup-linux-s390x-gnu': 4.45.0 - '@rollup/rollup-linux-x64-gnu': 4.45.0 - '@rollup/rollup-linux-x64-musl': 4.45.0 - '@rollup/rollup-win32-arm64-msvc': 4.45.0 - '@rollup/rollup-win32-ia32-msvc': 4.45.0 - '@rollup/rollup-win32-x64-msvc': 4.45.0 + '@rollup/rollup-android-arm-eabi': 4.46.1 + '@rollup/rollup-android-arm64': 4.46.1 + '@rollup/rollup-darwin-arm64': 4.46.1 + '@rollup/rollup-darwin-x64': 4.46.1 + '@rollup/rollup-freebsd-arm64': 4.46.1 + '@rollup/rollup-freebsd-x64': 4.46.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.1 + '@rollup/rollup-linux-arm-musleabihf': 4.46.1 + '@rollup/rollup-linux-arm64-gnu': 4.46.1 + '@rollup/rollup-linux-arm64-musl': 4.46.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.1 + '@rollup/rollup-linux-ppc64-gnu': 4.46.1 + '@rollup/rollup-linux-riscv64-gnu': 4.46.1 + '@rollup/rollup-linux-riscv64-musl': 4.46.1 + '@rollup/rollup-linux-s390x-gnu': 4.46.1 + '@rollup/rollup-linux-x64-gnu': 4.46.1 + '@rollup/rollup-linux-x64-musl': 4.46.1 + '@rollup/rollup-win32-arm64-msvc': 4.46.1 + '@rollup/rollup-win32-ia32-msvc': 4.46.1 + '@rollup/rollup-win32-x64-msvc': 4.46.1 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} - run-async@4.0.4: - dependencies: - oxlint: 1.6.0 - prettier: 3.6.2 + run-async@4.0.5: {} rxjs@7.8.2: dependencies: @@ -3657,8 +3567,8 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 tinypool@1.1.1: {} @@ -3716,9 +3626,9 @@ snapshots: type-fest@4.41.0: {} - typedoc@0.28.7(typescript@5.8.3): + typedoc@0.28.8(typescript@5.8.3): dependencies: - '@gerrit0/mini-shiki': 3.7.0 + '@gerrit0/mini-shiki': 3.8.1 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 @@ -3746,13 +3656,13 @@ snapshots: util-deprecate@1.0.2: {} - vite-node@3.2.4(@types/node@22.16.3)(yaml@2.8.0): + vite-node@3.2.4(@types/node@22.16.5)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.16.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.16.5)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3767,40 +3677,40 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.16.3)(yaml@2.8.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.0.6(@types/node@22.16.5)(yaml@2.8.0)): dependencies: debug: 4.4.1 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@22.16.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.16.5)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript - vite@6.3.5(@types/node@22.16.3)(yaml@2.8.0): + vite@7.0.6(@types/node@22.16.5)(yaml@2.8.0): dependencies: - esbuild: 0.25.6 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.8 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.0 + rollup: 4.46.1 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 fsevents: 2.3.3 yaml: 2.8.0 - vitest-canvas-mock@0.3.3(vitest@3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0)): + vitest-canvas-mock@0.3.3(vitest@3.2.4(@types/node@22.16.5)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(yaml@2.8.0)): dependencies: jest-canvas-mock: 2.5.2 - vitest: 3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0) + vitest: 3.2.4(@types/node@22.16.5)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(yaml@2.8.0) - vitest@3.2.4(@types/node@22.16.3)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(yaml@2.8.0): + vitest@3.2.4(@types/node@22.16.5)(jsdom@26.1.0)(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.4(@types/node@22.16.3)(typescript@5.8.3))(vite@6.3.5(@types/node@22.16.3)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(msw@2.10.4(@types/node@22.16.5)(typescript@5.8.3))(vite@7.0.6(@types/node@22.16.5)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -3811,18 +3721,18 @@ snapshots: expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.16.3)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.16.3)(yaml@2.8.0) + vite: 7.0.6(@types/node@22.16.5)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.16.5)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 jsdom: 26.1.0 transitivePeerDependencies: - jiti From b1561ce741f1a9b3c93bd09e7e6bd353bb083a3a Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 29 Jul 2025 16:15:17 -0400 Subject: [PATCH 039/106] [ME] [Bug] Disable trades in GTS ME with only 1 valid party member https://github.com/pagefaultgames/pokerogue/pull/6167 --- .../encounters/global-trade-system-encounter.ts | 7 +++++-- .../encounters/global-trade-system-encounter.test.ts | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts index b914927123a..347092fe0b4 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -39,6 +39,7 @@ import { addPokemonDataToDexAndValidateAchievements } from "#mystery-encounters/ import type { MysteryEncounter } from "#mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#mystery-encounters/mystery-encounter-option"; +import { PartySizeRequirement } from "#mystery-encounters/mystery-encounter-requirements"; import { PokemonData } from "#system/pokemon-data"; import { MusicPreference } from "#system/settings"; import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; @@ -151,7 +152,8 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil return true; }) .withOption( - MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneRequirement(new PartySizeRequirement([2, 6], true)) // Requires 2 valid party members .withHasDexProgress(true) .withDialogue({ buttonLabel: `${namespace}:option.1.label`, @@ -257,7 +259,8 @@ export const GlobalTradeSystemEncounter: MysteryEncounter = MysteryEncounterBuil .build(), ) .withOption( - MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneRequirement(new PartySizeRequirement([2, 6], true)) // Requires 2 valid party members .withHasDexProgress(true) .withDialogue({ buttonLabel: `${namespace}:option.2.label`, diff --git a/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts index 2ac55dabe1c..867a33f6ab6 100644 --- a/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts +++ b/test/mystery-encounter/encounters/global-trade-system-encounter.test.ts @@ -93,7 +93,7 @@ describe("Global Trade System - Mystery Encounter", () => { describe("Option 1 - Check Trade Offers", () => { it("should have the correct properties", () => { const option = GlobalTradeSystemEncounter.options[0]; - expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option.1.label`, @@ -154,7 +154,7 @@ describe("Global Trade System - Mystery Encounter", () => { describe("Option 2 - Wonder Trade", () => { it("should have the correct properties", () => { const option = GlobalTradeSystemEncounter.options[1]; - expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option.2.label`, From 32faab05d5605e28042eba992422d33fdfccdcd1 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:47:24 -0600 Subject: [PATCH 040/106] [Refactor] Minor refactor of battler tags (#6129) * Minor refactor battler tags * Improve documentation * Update type when loading in pokemon-data constructor for battler tags * Fix issues in tsdoc comments with Wlowscha's suggestions Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> * Apply bertie's suggestions from code review Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Remove unnecessary as const from tagType * Remove missed `as const` * Apply kev's suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/battler-tags.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update src/data/battler-tags.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --------- Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/@types/battler-tags.ts | 119 +++++ src/data/battler-tags.ts | 881 ++++++++++++++++++------------- src/data/moves/move.ts | 2 +- src/data/pokemon/pokemon-data.ts | 11 +- src/enums/battler-tag-type.ts | 1 - 5 files changed, 643 insertions(+), 371 deletions(-) create mode 100644 src/@types/battler-tags.ts diff --git a/src/@types/battler-tags.ts b/src/@types/battler-tags.ts new file mode 100644 index 00000000000..d1ff93e0400 --- /dev/null +++ b/src/@types/battler-tags.ts @@ -0,0 +1,119 @@ +// biome-ignore-start lint/correctness/noUnusedImports: Used in a TSDoc comment +import type { AbilityBattlerTag, BattlerTagTypeMap, SerializableBattlerTag, TypeBoostTag } from "#data/battler-tags"; +import type { AbilityId } from "#enums/ability-id"; +// biome-ignore-end lint/correctness/noUnusedImports: end +import type { BattlerTagType } from "#enums/battler-tag-type"; + +/** + * Subset of {@linkcode BattlerTagType}s that restrict the use of moves. + */ +export type MoveRestrictionBattlerTagType = + | BattlerTagType.THROAT_CHOPPED + | BattlerTagType.TORMENT + | BattlerTagType.TAUNT + | BattlerTagType.IMPRISON + | BattlerTagType.HEAL_BLOCK + | BattlerTagType.ENCORE + | BattlerTagType.DISABLED + | BattlerTagType.GORILLA_TACTICS; + +/** + * Subset of {@linkcode BattlerTagType}s that block damage from moves. + */ +export type FormBlockDamageBattlerTagType = BattlerTagType.ICE_FACE | BattlerTagType.DISGUISE; + +/** + * Subset of {@linkcode BattlerTagType}s that are related to trapping effects. + */ +export type TrappingBattlerTagType = + | BattlerTagType.BIND + | BattlerTagType.WRAP + | BattlerTagType.FIRE_SPIN + | BattlerTagType.WHIRLPOOL + | BattlerTagType.CLAMP + | BattlerTagType.SAND_TOMB + | BattlerTagType.MAGMA_STORM + | BattlerTagType.SNAP_TRAP + | BattlerTagType.THUNDER_CAGE + | BattlerTagType.INFESTATION + | BattlerTagType.INGRAIN + | BattlerTagType.OCTOLOCK + | BattlerTagType.NO_RETREAT; + +/** + * Subset of {@linkcode BattlerTagType}s that are related to protection effects. + */ +export type ProtectionBattlerTagType = BattlerTagType.PROTECTED | BattlerTagType.SPIKY_SHIELD | DamageProtectedTagType; +/** + * Subset of {@linkcode BattlerTagType}s related to protection effects that block damage but not status moves. + */ +export type DamageProtectedTagType = ContactSetStatusProtectedTagType | ContactStatStageChangeProtectedTagType; + +/** + * Subset of {@linkcode BattlerTagType}s related to protection effects that set a status effect on the attacker. + */ +export type ContactSetStatusProtectedTagType = BattlerTagType.BANEFUL_BUNKER | BattlerTagType.BURNING_BULWARK; + +/** + * Subset of {@linkcode BattlerTagType}s related to protection effects that change stat stages of the attacker. + */ +export type ContactStatStageChangeProtectedTagType = + | BattlerTagType.KINGS_SHIELD + | BattlerTagType.SILK_TRAP + | BattlerTagType.OBSTRUCT; + +/** Subset of {@linkcode BattlerTagType}s that provide the Endure effect */ +export type EndureTagType = BattlerTagType.ENDURE_TOKEN | BattlerTagType.ENDURING; + +/** + * Subset of {@linkcode BattlerTagType}s that are related to semi-invulnerable states. + */ +export type SemiInvulnerableTagType = + | BattlerTagType.FLYING + | BattlerTagType.UNDERGROUND + | BattlerTagType.UNDERWATER + | BattlerTagType.HIDDEN; + +/** + * Subset of {@linkcode BattlerTagType}s corresponding to {@linkcode AbilityBattlerTag}s + * + * @remarks + * ⚠️ {@linkcode AbilityId.FLASH_FIRE | Flash Fire}'s {@linkcode BattlerTagType.FIRE_BOOST} is not included as it + * subclasses {@linkcode TypeBoostTag} and not `AbilityBattlerTag`. + */ +export type AbilityBattlerTagType = + | BattlerTagType.PROTOSYNTHESIS + | BattlerTagType.QUARK_DRIVE + | BattlerTagType.UNBURDEN + | BattlerTagType.SLOW_START + | BattlerTagType.TRUANT; + +/** + * Subset of {@linkcode BattlerTagType}s related to abilities that boost the highest stat. + */ +export type HighestStatBoostTagType = + | BattlerTagType.QUARK_DRIVE // formatting + | BattlerTagType.PROTOSYNTHESIS; +/** + * Subset of {@linkcode BattlerTagType}s that are able to persist between turns and should therefore be serialized + */ +export type SerializableBattlerTagType = keyof { + [K in keyof BattlerTagTypeMap as BattlerTagTypeMap[K] extends SerializableBattlerTag + ? K + : never]: BattlerTagTypeMap[K]; +}; + +/** + * Subset of {@linkcode BattlerTagType}s that are not able to persist across waves and should therefore not be serialized + */ +export type NonSerializableBattlerTagType = Exclude; + +/** + * Dummy, typescript-only declaration to ensure that + * {@linkcode BattlerTagTypeMap} has an entry for all `BattlerTagType`s. + * + * If a battler tag is missing from the map, Typescript will throw an error on this statement. + * + * ⚠️ Does not actually exist at runtime, so it must not be used! + */ +declare const EnsureAllBattlerTagTypesAreMapped: BattlerTagTypeMap[BattlerTagType] & never; diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index c8ddfe32f0b..79c14f860b6 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -8,6 +8,7 @@ import { SpeciesFormChangeAbilityTrigger } from "#data/form-change-triggers"; import { getStatusEffectHealText } from "#data/status-effect"; import { TerrainType } from "#data/terrain"; import { AbilityId } from "#enums/ability-id"; +import type { BattlerIndex } from "#enums/battler-index"; import { BattlerTagLapseType } from "#enums/battler-tag-lapse-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { HitResult } from "#enums/hit-result"; @@ -31,41 +32,107 @@ import type { MoveEffectPhase } from "#phases/move-effect-phase"; import type { MovePhase } from "#phases/move-phase"; import type { StatStageChangeCallback } from "#phases/stat-stage-change-phase"; import i18next from "#plugins/i18n"; +import type { + AbilityBattlerTagType, + ContactSetStatusProtectedTagType, + ContactStatStageChangeProtectedTagType, + DamageProtectedTagType, + EndureTagType, + HighestStatBoostTagType, + MoveRestrictionBattlerTagType, + ProtectionBattlerTagType, + SemiInvulnerableTagType, + TrappingBattlerTagType, +} from "#types/battler-tags"; +import type { Mutable, NonFunctionProperties } from "#types/type-helpers"; import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common"; +/* +@module +BattlerTags are used to represent semi-persistent effects that can be attached to a Pokemon. +Note that before serialization, a new tag object is created, and then `loadTag` is called on the +tag with the object that was serialized. + +This means it is straightforward to avoid serializing fields. +Fields that are not set in the constructor and not set in `loadTag` will thus not be serialized. + +Any battler tag that can persist across sessions must extend SerializableBattlerTag in its class definition signature. +Only tags that persist across waves (meaning their effect can last >1 turn) should be considered +serializable. + +Serializable battler tags have strict requirements for their fields. +Properties that are not necessary to reconstruct the tag must not be serialized. This can be avoided +by using a private property. If access to the property is needed outside of the class, then +a getter (and potentially, a setter) should be used instead. + +If a property that is intended to be private must be serialized, then it should instead +be declared as a public readonly propety. Then, in the `loadTag` method (or any method inside the class that needs to adjust the property) +use `(this as Mutable).propertyName = value;` +These rules ensure that Typescript is aware of the shape of the serialized version of the class. +*/ + +/** Interface containing the serializable fields of BattlerTag */ +interface BaseBattlerTag { + /** The tag's remaining duration */ + turnCount: number; + /** The {@linkcode MoveId} that created this tag, or `undefined` if not set by a move */ + sourceMove?: MoveId; + /** The {@linkcode Pokemon.id | PID} of the Pokemon that added this tag, or `undefined` if not set by a pokemon */ + sourceId?: number; +} + /** * A {@linkcode BattlerTag} represents a semi-persistent effect that can be attached to a {@linkcode Pokemon}. * Tags can trigger various effects throughout a turn, and are cleared on switching out * or through their respective {@linkcode BattlerTag.lapse | lapse} methods. */ -export class BattlerTag { - public tagType: BattlerTagType; - public lapseTypes: BattlerTagLapseType[]; +export class BattlerTag implements BaseBattlerTag { + public readonly tagType: BattlerTagType; + public turnCount: number; - public sourceMove: MoveId; + public sourceMove?: MoveId; public sourceId?: number; - public isBatonPassable: boolean; + + //#region non-serializable fields + // Fields that should never be serialized, as they must not change after instantiation + #isBatonPassable = false; + public get isBatonPassable(): boolean { + return this.#isBatonPassable; + } + + #lapseTypes: readonly [BattlerTagLapseType, ...BattlerTagLapseType[]]; + public get lapseTypes(): readonly BattlerTagLapseType[] { + return this.#lapseTypes; + } + //#endregion non-serializable fields constructor( tagType: BattlerTagType, - lapseType: BattlerTagLapseType | BattlerTagLapseType[], + lapseType: BattlerTagLapseType | [BattlerTagLapseType, ...BattlerTagLapseType[]], turnCount: number, sourceMove?: MoveId, sourceId?: number, isBatonPassable = false, ) { this.tagType = tagType; - this.lapseTypes = coerceArray(lapseType); + this.#lapseTypes = coerceArray(lapseType); this.turnCount = turnCount; - this.sourceMove = sourceMove!; // TODO: is this bang correct? + // We intentionally don't want to set source move to `MoveId.NONE` here, so a raw boolean comparison is OK. + if (sourceMove) { + this.sourceMove = sourceMove; + } this.sourceId = sourceId; - this.isBatonPassable = isBatonPassable; + this.#isBatonPassable = isBatonPassable; } canAdd(_pokemon: Pokemon): boolean { return true; } + /** + * Apply effects that occur when the tag is added to a {@linkcode Pokemon} + * @param _pokemon - The {@linkcode Pokemon} the tag was added to + */ onAdd(_pokemon: Pokemon): void {} onRemove(_pokemon: Pokemon): void {} @@ -99,9 +166,9 @@ export class BattlerTag { /** * Load the data for a given {@linkcode BattlerTag} or JSON representation thereof. * Should be inherited from by any battler tag with custom attributes. - * @param source The battler tag to load + * @param source - An object containing the fields needed to reconstruct this tag. */ - loadTag(source: BattlerTag | any): void { + loadTag(source: BaseBattlerTag): void { this.turnCount = source.turnCount; this.sourceMove = source.sourceMove; this.sourceId = source.sourceId; @@ -116,12 +183,9 @@ export class BattlerTag { } } -export interface WeatherBattlerTag { - weatherTypes: WeatherType[]; -} - -export interface TerrainBattlerTag { - terrainTypes: TerrainType[]; +export abstract class SerializableBattlerTag extends BattlerTag { + /** Nonexistent, dummy field to allow typescript to distinguish this class from `BattlerTag` */ + private declare __SerializableBattlerTag: never; } /** @@ -132,8 +196,8 @@ export interface TerrainBattlerTag { * match a condition. A restricted move gets cancelled before it is used. * Players and enemies should not be allowed to select restricted moves. */ -export abstract class MoveRestrictionBattlerTag extends BattlerTag { - /** @override */ +export abstract class MoveRestrictionBattlerTag extends SerializableBattlerTag { + public declare readonly tagType: MoveRestrictionBattlerTagType; override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType === BattlerTagLapseType.PRE_MOVE) { // Cancel the affected pokemon's selected move @@ -154,32 +218,32 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { } /** - * Gets whether this tag is restricting a move. + * Determine whether a move's usage is restricted by this tag * - * @param move - {@linkcode MoveId} ID to check restriction for. + * @param move - The {@linkcode MoveId} being checked * @param user - The {@linkcode Pokemon} involved * @returns `true` if the move is restricted by this tag, otherwise `false`. */ public abstract isMoveRestricted(move: MoveId, user?: Pokemon): boolean; /** - * Checks if this tag is restricting a move based on a user's decisions during the target selection phase + * Check if this tag is restricting a move based on a user's decisions during the target selection phase * - * @param {MoveId} _move {@linkcode MoveId} move ID to check restriction for - * @param {Pokemon} _user {@linkcode Pokemon} the user of the above move - * @param {Pokemon} _target {@linkcode Pokemon} the target of the above move - * @returns {boolean} `false` unless overridden by the child tag + * @param _move - {@linkcode MoveId} to check restriction for + * @param _user - The user of the move + * @param _target - The pokemon targeted by the move + * @returns Whether the move is restricted by this tag */ isMoveTargetRestricted(_move: MoveId, _user: Pokemon, _target: Pokemon): boolean { return false; } /** - * Gets the text to display when the player attempts to select a move that is restricted by this tag. + * Get the text to display when the player attempts to select a move that is restricted by this tag. * - * @param {Pokemon} pokemon {@linkcode Pokemon} for which the player is attempting to select the restricted move - * @param {MoveId} move {@linkcode MoveId} ID of the move that is having its selection denied - * @returns {string} text to display when the player attempts to select the restricted move + * @param pokemon - The pokemon for which the player is attempting to select the restricted move + * @param move - The {@linkcode MoveId | ID} of the Move that is having its selection denied + * @returns The text to display when the player attempts to select the restricted move */ abstract selectionDeniedText(pokemon: Pokemon, move: MoveId): string; @@ -188,9 +252,9 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { * Because restriction effects also prevent selection of the move, this situation can only arise if a * pokemon first selects a move, then gets outsped by a pokemon using a move that restricts the selected move. * - * @param {Pokemon} _pokemon {@linkcode Pokemon} attempting to use the restricted move - * @param {MoveId} _move {@linkcode MoveId} ID of the move being interrupted - * @returns {string} text to display when the move is interrupted + * @param _pokemon - The pokemon attempting to use the restricted move + * @param _move - The {@linkcode MoveId | ID} of the move being interrupted + * @returns The text to display when the move is interrupted */ interruptedText(_pokemon: Pokemon, _move: MoveId): string { return ""; @@ -200,9 +264,10 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { /** * Tag representing the "Throat Chop" effect. Pokemon with this tag cannot use sound-based moves. * @see {@link https://bulbapedia.bulbagarden.net/wiki/Throat_Chop_(move) | Throat Chop} - * @extends MoveRestrictionBattlerTag + * @sealed */ export class ThroatChoppedTag extends MoveRestrictionBattlerTag { + public override readonly tagType = BattlerTagType.THROAT_CHOPPED; constructor() { super( BattlerTagType.THROAT_CHOPPED, @@ -213,10 +278,9 @@ export class ThroatChoppedTag extends MoveRestrictionBattlerTag { } /** - * Checks if a {@linkcode MoveId | move} is restricted by Throat Chop. - * @override - * @param {MoveId} move the {@linkcode MoveId | move} to check for sound-based restriction - * @returns true if the move is sound-based + * Check if a move is restricted by Throat Chop. + * @param move - The {@linkcode MoveId | ID } of the move to check for sound-based restriction + * @returns Whether the move is sound based */ override isMoveRestricted(move: MoveId): boolean { return allMoves[move].hasFlag(MoveFlags.SOUND_BASED); @@ -224,10 +288,9 @@ export class ThroatChoppedTag extends MoveRestrictionBattlerTag { /** * Shows a message when the player attempts to select a move that is restricted by Throat Chop. - * @override - * @param {Pokemon} _pokemon the {@linkcode Pokemon} that is attempting to select the restricted move - * @param {MoveId} move the {@linkcode MoveId | move} that is being restricted - * @returns the message to display when the player attempts to select the restricted move + * @param _pokemon - The {@linkcode Pokemon} that is attempting to select the restricted move + * @param move - The {@linkcode MoveId | move} that is being restricted + * @returns The message to display when the player attempts to select the restricted move */ override selectionDeniedText(_pokemon: Pokemon, move: MoveId): string { return i18next.t("battle:moveCannotBeSelected", { @@ -237,10 +300,9 @@ export class ThroatChoppedTag extends MoveRestrictionBattlerTag { /** * Shows a message when a move is interrupted by Throat Chop. - * @override - * @param {Pokemon} pokemon the interrupted {@linkcode Pokemon} - * @param {MoveId} _move the {@linkcode MoveId | move} that was interrupted - * @returns the message to display when the move is interrupted + * @param pokemon - The interrupted {@linkcode Pokemon} + * @param _move - The {@linkcode MoveId | ID } of the move that was interrupted + * @returns The message to display when the move is interrupted */ override interruptedText(pokemon: Pokemon, _move: MoveId): string { return i18next.t("battle:throatChopInterruptedMove", { @@ -252,10 +314,13 @@ export class ThroatChoppedTag extends MoveRestrictionBattlerTag { /** * Tag representing the "disabling" effect performed by {@linkcode MoveId.DISABLE} and {@linkcode AbilityId.CURSED_BODY}. * When the tag is added, the last-used move of the tag holder is set as the disabled move. + * + * @sealed */ export class DisabledTag extends MoveRestrictionBattlerTag { + public override readonly tagType = BattlerTagType.DISABLED; /** The move being disabled. Gets set when {@linkcode onAdd} is called for this tag. */ - private moveId: MoveId = MoveId.NONE; + public readonly moveId: MoveId = MoveId.NONE; constructor(sourceId: number) { super( @@ -267,14 +332,11 @@ export class DisabledTag extends MoveRestrictionBattlerTag { ); } - /** @override */ override isMoveRestricted(move: MoveId): boolean { return move === this.moveId; } /** - * @override - * * Attempt to disable the target's last move by setting this tag's {@linkcode moveId} * and showing a message. */ @@ -287,7 +349,7 @@ export class DisabledTag extends MoveRestrictionBattlerTag { } super.onAdd(pokemon); - this.moveId = move.move; + (this as Mutable).moveId = move.move; globalScene.phaseManager.queueMessage( i18next.t("battlerTags:disabledOnAdd", { @@ -297,7 +359,6 @@ export class DisabledTag extends MoveRestrictionBattlerTag { ); } - /** @override */ override onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); @@ -309,16 +370,14 @@ export class DisabledTag extends MoveRestrictionBattlerTag { ); } - /** @override */ override selectionDeniedText(_pokemon: Pokemon, move: MoveId): string { return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name }); } /** - * @override - * @param {Pokemon} pokemon {@linkcode Pokemon} attempting to use the restricted move - * @param {MoveId} move {@linkcode MoveId} ID of the move being interrupted - * @returns {string} text to display when the move is interrupted + * @param pokemon - {@linkcode Pokemon} attempting to use the restricted move + * @param move - {@linkcode MoveId | ID} of the move being interrupted + * @returns The text to display when the move is interrupted */ override interruptedText(pokemon: Pokemon, move: MoveId): string { return i18next.t("battle:disableInterruptedMove", { @@ -327,18 +386,21 @@ export class DisabledTag extends MoveRestrictionBattlerTag { }); } - /** @override */ - override loadTag(source: BattlerTag | any): void { + override loadTag(source: NonFunctionProperties): void { super.loadTag(source); - this.moveId = source.moveId; + (this as Mutable).moveId = source.moveId; } } /** * Tag used by Gorilla Tactics to restrict the user to using only one move. + * + * @sealed */ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { - private moveId = MoveId.NONE; + public override readonly tagType = BattlerTagType.GORILLA_TACTICS; + /** ID of the move that the user is locked into using*/ + public readonly moveId: MoveId = MoveId.NONE; constructor() { super(BattlerTagType.GORILLA_TACTICS, BattlerTagLapseType.CUSTOM, 0); @@ -367,18 +429,17 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { super.onAdd(pokemon); // Bang is justified as tag is not added if prior move doesn't exist - this.moveId = pokemon.getLastNonVirtualMove()!.move; + (this as Mutable).moveId = pokemon.getLastNonVirtualMove()!.move; pokemon.setStat(Stat.ATK, pokemon.getStat(Stat.ATK, false) * 1.5, false); } /** * Loads the Gorilla Tactics Battler Tag along with its unique class variable moveId - * @override - * @param source Gorilla Tactics' {@linkcode BattlerTag} information + * @param source - Object containing the fields needed to reconstruct this tag. */ - public override loadTag(source: BattlerTag | any): void { + override loadTag(source: NonFunctionProperties): void { super.loadTag(source); - this.moveId = source.moveId; + (this as Mutable).moveId = source.moveId; } /** @@ -397,7 +458,8 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { /** * BattlerTag that represents the "recharge" effects of moves like Hyper Beam. */ -export class RechargingTag extends BattlerTag { +export class RechargingTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.RECHARGING; constructor(sourceMove: MoveId) { super(BattlerTagType.RECHARGING, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], 2, sourceMove); } @@ -430,6 +492,8 @@ export class RechargingTag extends BattlerTag { * @see {@link https://bulbapedia.bulbagarden.net/wiki/Beak_Blast_(move) | Beak Blast} */ export class BeakBlastChargingTag extends BattlerTag { + public override readonly tagType = BattlerTagType.BEAK_BLAST_CHARGING; + public declare readonly sourceMove: MoveId.BEAK_BLAST; constructor() { super( BattlerTagType.BEAK_BLAST_CHARGING, @@ -454,8 +518,8 @@ export class BeakBlastChargingTag extends BattlerTag { /** * Inflicts `BURN` status on attackers that make contact, and causes this tag * to be removed after the source makes a move (or the turn ends, whichever comes first) - * @param pokemon {@linkcode Pokemon} the owner of this tag - * @param lapseType {@linkcode BattlerTagLapseType} the type of functionality invoked in battle + * @param pokemon - The owner of this tag + * @param lapseType - The type of functionality invoked in battle * @returns `true` if invoked with the `AFTER_HIT` lapse type */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -498,8 +562,8 @@ export class ShellTrapTag extends BattlerTag { /** * "Activates" the shell trap, causing the tag owner to move next. - * @param pokemon {@linkcode Pokemon} the owner of this tag - * @param lapseType {@linkcode BattlerTagLapseType} the type of functionality invoked in battle + * @param pokemon - The owner of this tag + * @param lapseType - The type of functionality invoked in battle * @returns `true` if invoked with the `AFTER_HIT` lapse type */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -529,7 +593,8 @@ export class ShellTrapTag extends BattlerTag { } } -export class TrappedTag extends BattlerTag { +export class TrappedTag extends SerializableBattlerTag { + public declare readonly tagType: TrappingBattlerTagType; constructor( tagType: BattlerTagType, lapseType: BattlerTagLapseType, @@ -546,13 +611,13 @@ export class TrappedTag extends BattlerTag { console.warn(`Failed to get source Pokemon for TrappedTag canAdd; id: ${this.sourceId}`); return false; } - - const move = allMoves[this.sourceMove]; + if (this.sourceMove && allMoves[this.sourceMove]?.hitsSubstitute(source, pokemon)) { + return false; + } const isGhost = pokemon.isOfType(PokemonType.GHOST); const isTrapped = pokemon.getTag(TrappedTag); - const hasSubstitute = move.hitsSubstitute(source, pokemon); - return !isTrapped && !isGhost && !hasSubstitute; + return !isTrapped && !isGhost; } onAdd(pokemon: Pokemon): void { @@ -591,9 +656,9 @@ export class TrappedTag extends BattlerTag { * BattlerTag implementing No Retreat's trapping effect. * This is treated separately from other trapping effects to prevent * Ghost-type Pokemon from being able to reuse the move. - * @extends TrappedTag */ class NoRetreatTag extends TrappedTag { + public override readonly tagType = BattlerTagType.NO_RETREAT; constructor(sourceId: number) { super(BattlerTagType.NO_RETREAT, BattlerTagLapseType.CUSTOM, 0, MoveId.NO_RETREAT, sourceId); } @@ -608,6 +673,7 @@ class NoRetreatTag extends TrappedTag { * BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Flinch Flinch} status condition */ export class FlinchedTag extends BattlerTag { + public override readonly tagType = BattlerTagType.FLINCHED; constructor(sourceMove: MoveId) { super(BattlerTagType.FLINCHED, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], 1, sourceMove); } @@ -639,6 +705,7 @@ export class FlinchedTag extends BattlerTag { } export class InterruptedTag extends BattlerTag { + public override readonly tagType = BattlerTagType.INTERRUPTED; constructor(sourceMove: MoveId) { super(BattlerTagType.INTERRUPTED, BattlerTagLapseType.PRE_MOVE, 0, sourceMove); } @@ -668,7 +735,8 @@ export class InterruptedTag extends BattlerTag { /** * BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Confusion_(status_condition) Confusion} status condition */ -export class ConfusedTag extends BattlerTag { +export class ConfusedTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.CONFUSED; constructor(turnCount: number, sourceMove: MoveId) { super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove, undefined, true); } @@ -752,10 +820,10 @@ export class ConfusedTag extends BattlerTag { /** * Tag applied to the {@linkcode Move.DESTINY_BOND} user. - * @extends BattlerTag * @see {@linkcode apply} */ -export class DestinyBondTag extends BattlerTag { +export class DestinyBondTag extends SerializableBattlerTag { + public readonly tagType = BattlerTagType.DESTINY_BOND; constructor(sourceMove: MoveId, sourceId: number) { super(BattlerTagType.DESTINY_BOND, BattlerTagLapseType.PRE_MOVE, 1, sourceMove, sourceId, true); } @@ -765,9 +833,9 @@ export class DestinyBondTag extends BattlerTag { * or after receiving fatal damage. When the damage is fatal, * the attacking Pokemon is taken down as well, unless it's a boss. * - * @param {Pokemon} pokemon Pokemon that is attacking the Destiny Bond user. - * @param {BattlerTagLapseType} lapseType CUSTOM or PRE_MOVE - * @returns false if the tag source fainted or one turn has passed since the application + * @param pokemon - The Pokemon that is attacking the Destiny Bond user. + * @param lapseType - CUSTOM or PRE_MOVE + * @returns `false` if the tag source fainted or one turn has passed since the application */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { if (lapseType !== BattlerTagLapseType.CUSTOM) { @@ -811,7 +879,9 @@ export class DestinyBondTag extends BattlerTag { } } -export class InfatuatedTag extends BattlerTag { +// Technically serializable as in a double battle, a pokemon could be infatuated by its ally +export class InfatuatedTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.INFATUATED; constructor(sourceMove: number, sourceId: number) { super(BattlerTagType.INFATUATED, BattlerTagLapseType.MOVE, 1, sourceMove, sourceId); } @@ -901,8 +971,9 @@ export class InfatuatedTag extends BattlerTag { } } -export class SeedTag extends BattlerTag { - private sourceIndex: number; +export class SeedTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.SEEDED; + public readonly sourceIndex: BattlerIndex; constructor(sourceId: number) { super(BattlerTagType.SEEDED, BattlerTagLapseType.TURN_END, 1, MoveId.LEECH_SEED, sourceId, true); @@ -910,11 +981,11 @@ export class SeedTag extends BattlerTag { /** * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag + * @param source - An object containing the fields needed to reconstruct this tag. */ - loadTag(source: BattlerTag | any): void { + override loadTag(source: NonFunctionProperties): void { super.loadTag(source); - this.sourceIndex = source.sourceIndex; + (this as Mutable).sourceIndex = source.sourceIndex; } canAdd(pokemon: Pokemon): boolean { @@ -935,7 +1006,7 @@ export class SeedTag extends BattlerTag { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), }), ); - this.sourceIndex = source.getBattlerIndex(); + (this as Mutable).sourceIndex = source.getBattlerIndex(); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -990,9 +1061,10 @@ export class SeedTag extends BattlerTag { /** * BattlerTag representing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Powder_(move) | Powder}. * When the afflicted Pokemon uses a Fire-type move, the move is cancelled, and the - * Pokemon takes damage equal to 1/4 of it's maximum HP (rounded down). + * Pokemon takes damage equal to 1/4 of its maximum HP (rounded down). */ export class PowderTag extends BattlerTag { + public override readonly tagType = BattlerTagType.POWDER; constructor() { super(BattlerTagType.POWDER, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END], 1); } @@ -1051,7 +1123,7 @@ export class PowderTag extends BattlerTag { } } -export class NightmareTag extends BattlerTag { +export class NightmareTag extends SerializableBattlerTag { constructor() { super(BattlerTagType.NIGHTMARE, BattlerTagLapseType.TURN_END, 1, MoveId.NIGHTMARE); } @@ -1104,7 +1176,7 @@ export class NightmareTag extends BattlerTag { } } -export class FrenzyTag extends BattlerTag { +export class FrenzyTag extends SerializableBattlerTag { constructor(turnCount: number, sourceMove: MoveId, sourceId: number) { super(BattlerTagType.FRENZY, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); } @@ -1124,6 +1196,8 @@ export class FrenzyTag extends BattlerTag { * Encore forces the target Pokemon to use its most-recent move for 3 turns. */ export class EncoreTag extends MoveRestrictionBattlerTag { + public override readonly tagType = BattlerTagType.ENCORE; + /** The ID of the move the user is locked into using */ public moveId: MoveId; constructor(sourceId: number) { @@ -1136,12 +1210,12 @@ export class EncoreTag extends MoveRestrictionBattlerTag { ); } - loadTag(source: BattlerTag | any): void { + override loadTag(source: NonFunctionProperties): void { super.loadTag(source); - this.moveId = source.moveId as MoveId; + this.moveId = source.moveId; } - canAdd(pokemon: Pokemon): boolean { + override canAdd(pokemon: Pokemon): boolean { const lastMove = pokemon.getLastNonVirtualMove(); if (!lastMove) { return false; @@ -1156,10 +1230,7 @@ export class EncoreTag extends MoveRestrictionBattlerTag { return true; } - onAdd(pokemon: Pokemon): void { - // TODO: shouldn't this be `onAdd`? - super.onRemove(pokemon); - + override onAdd(pokemon: Pokemon): void { globalScene.phaseManager.queueMessage( i18next.t("battlerTags:encoreOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), @@ -1199,7 +1270,7 @@ export class EncoreTag extends MoveRestrictionBattlerTag { /** * Checks if the move matches the moveId stored within the tag and returns a boolean value - * @param move {@linkcode MoveId} the move selected + * @param move - The ID of the move selected * @param user N/A * @returns `true` if the move does not match with the moveId stored and as a result, restricted */ @@ -1223,6 +1294,7 @@ export class EncoreTag extends MoveRestrictionBattlerTag { } export class HelpingHandTag extends BattlerTag { + public override readonly tagType = BattlerTagType.HELPING_HAND; constructor(sourceId: number) { super(BattlerTagType.HELPING_HAND, BattlerTagLapseType.TURN_END, 1, MoveId.HELPING_HAND, sourceId); } @@ -1245,16 +1317,16 @@ export class HelpingHandTag extends BattlerTag { /** * Applies the Ingrain tag to a pokemon - * @extends TrappedTag */ export class IngrainTag extends TrappedTag { + public override readonly tagType = BattlerTagType.INGRAIN; constructor(sourceId: number) { super(BattlerTagType.INGRAIN, BattlerTagLapseType.TURN_END, 1, MoveId.INGRAIN, sourceId); } /** * Check if the Ingrain tag can be added to the pokemon - * @param pokemon {@linkcode Pokemon} The pokemon to check if the tag can be added to + * @param pokemon - The pokemon to check if the tag can be added to * @returns boolean True if the tag can be added, false otherwise */ canAdd(pokemon: Pokemon): boolean { @@ -1295,6 +1367,7 @@ export class IngrainTag extends TrappedTag { * end of each turn. */ export class OctolockTag extends TrappedTag { + public override readonly tagType = BattlerTagType.OCTOLOCK; constructor(sourceId: number) { super(BattlerTagType.OCTOLOCK, BattlerTagLapseType.TURN_END, 1, MoveId.OCTOLOCK, sourceId); } @@ -1317,7 +1390,8 @@ export class OctolockTag extends TrappedTag { } } -export class AquaRingTag extends BattlerTag { +export class AquaRingTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.AQUA_RING; constructor() { super(BattlerTagType.AQUA_RING, BattlerTagLapseType.TURN_END, 1, MoveId.AQUA_RING, undefined, true); } @@ -1353,7 +1427,8 @@ export class AquaRingTag extends BattlerTag { } /** Tag used to allow moves that interact with {@link MoveId.MINIMIZE} to function */ -export class MinimizeTag extends BattlerTag { +export class MinimizeTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.MINIMIZED; constructor() { super(BattlerTagType.MINIMIZED, BattlerTagLapseType.TURN_END, 1, MoveId.MINIMIZE); } @@ -1371,7 +1446,8 @@ export class MinimizeTag extends BattlerTag { } } -export class DrowsyTag extends BattlerTag { +export class DrowsyTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.DROWSY; constructor() { super(BattlerTagType.DROWSY, BattlerTagLapseType.TURN_END, 2, MoveId.YAWN); } @@ -1405,7 +1481,9 @@ export class DrowsyTag extends BattlerTag { } export abstract class DamagingTrapTag extends TrappedTag { - private commonAnim: CommonAnim; + public declare readonly tagType: TrappingBattlerTagType; + /** The animation to play during the damage sequence */ + #commonAnim: CommonAnim; constructor( tagType: BattlerTagType, @@ -1416,16 +1494,7 @@ export abstract class DamagingTrapTag extends TrappedTag { ) { super(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove, sourceId); - this.commonAnim = commonAnim; - } - - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.commonAnim = source.commonAnim as CommonAnim; + this.#commonAnim = commonAnim; } canAdd(pokemon: Pokemon): boolean { @@ -1443,7 +1512,7 @@ export abstract class DamagingTrapTag extends TrappedTag { moveName: this.getMoveName(), }), ); - phaseManager.unshiftNew("CommonAnimPhase", pokemon.getBattlerIndex(), undefined, this.commonAnim); + phaseManager.unshiftNew("CommonAnimPhase", pokemon.getBattlerIndex(), undefined, this.#commonAnim); const cancelled = new BooleanHolder(false); applyAbAttrs("BlockNonDirectDamageAbAttr", { pokemon, cancelled }); @@ -1459,6 +1528,7 @@ export abstract class DamagingTrapTag extends TrappedTag { // TODO: Condense all these tags into 1 singular tag with a modified message func export class BindTag extends DamagingTrapTag { + public override readonly tagType = BattlerTagType.BIND; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.BIND, CommonAnim.BIND, turnCount, MoveId.BIND, sourceId); } @@ -1479,6 +1549,7 @@ export class BindTag extends DamagingTrapTag { } export class WrapTag extends DamagingTrapTag { + public override readonly tagType = BattlerTagType.WRAP; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.WRAP, CommonAnim.WRAP, turnCount, MoveId.WRAP, sourceId); } @@ -1507,18 +1578,21 @@ export abstract class VortexTrapTag extends DamagingTrapTag { } export class FireSpinTag extends VortexTrapTag { + public override readonly tagType = BattlerTagType.FIRE_SPIN; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.FIRE_SPIN, CommonAnim.FIRE_SPIN, turnCount, MoveId.FIRE_SPIN, sourceId); } } export class WhirlpoolTag extends VortexTrapTag { + public override readonly tagType = BattlerTagType.WHIRLPOOL; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.WHIRLPOOL, CommonAnim.WHIRLPOOL, turnCount, MoveId.WHIRLPOOL, sourceId); } } export class ClampTag extends DamagingTrapTag { + public override readonly tagType = BattlerTagType.CLAMP; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.CLAMP, CommonAnim.CLAMP, turnCount, MoveId.CLAMP, sourceId); } @@ -1538,6 +1612,7 @@ export class ClampTag extends DamagingTrapTag { } export class SandTombTag extends DamagingTrapTag { + public override readonly tagType = BattlerTagType.SAND_TOMB; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.SAND_TOMB, CommonAnim.SAND_TOMB, turnCount, MoveId.SAND_TOMB, sourceId); } @@ -1551,6 +1626,7 @@ export class SandTombTag extends DamagingTrapTag { } export class MagmaStormTag extends DamagingTrapTag { + public override readonly tagType = BattlerTagType.MAGMA_STORM; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.MAGMA_STORM, CommonAnim.MAGMA_STORM, turnCount, MoveId.MAGMA_STORM, sourceId); } @@ -1563,6 +1639,7 @@ export class MagmaStormTag extends DamagingTrapTag { } export class SnapTrapTag extends DamagingTrapTag { + public override readonly tagType = BattlerTagType.SNAP_TRAP; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.SNAP_TRAP, CommonAnim.SNAP_TRAP, turnCount, MoveId.SNAP_TRAP, sourceId); } @@ -1575,6 +1652,7 @@ export class SnapTrapTag extends DamagingTrapTag { } export class ThunderCageTag extends DamagingTrapTag { + public override readonly tagType = BattlerTagType.THUNDER_CAGE; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.THUNDER_CAGE, CommonAnim.THUNDER_CAGE, turnCount, MoveId.THUNDER_CAGE, sourceId); } @@ -1594,6 +1672,7 @@ export class ThunderCageTag extends DamagingTrapTag { } export class InfestationTag extends DamagingTrapTag { + public override readonly tagType = BattlerTagType.INFESTATION; constructor(turnCount: number, sourceId: number) { super(BattlerTagType.INFESTATION, CommonAnim.INFESTATION, turnCount, MoveId.INFESTATION, sourceId); } @@ -1613,7 +1692,8 @@ export class InfestationTag extends DamagingTrapTag { } export class ProtectedTag extends BattlerTag { - constructor(sourceMove: MoveId, tagType: BattlerTagType = BattlerTagType.PROTECTED) { + public declare readonly tagType: ProtectionBattlerTagType; + constructor(sourceMove: MoveId, tagType: ProtectionBattlerTagType = BattlerTagType.PROTECTED) { super(tagType, BattlerTagLapseType.TURN_END, 0, sourceMove); } @@ -1649,14 +1729,13 @@ export class ProtectedTag extends BattlerTag { } /** Class for `BattlerTag`s that apply some effect when hit by a contact move */ -export class ContactProtectedTag extends ProtectedTag { +export abstract class ContactProtectedTag extends ProtectedTag { /** * Function to call when a contact move hits the pokemon with this tag. * @param _attacker - The pokemon using the contact move * @param _user - The pokemon that is being attacked and has the tag - * @param _move - The move used by the attacker */ - onContact(_attacker: Pokemon, _user: Pokemon) {} + abstract onContact(_attacker: Pokemon, _user: Pokemon): void; /** * Lapse the tag and apply `onContact` if the move makes contact and @@ -1686,22 +1765,16 @@ export class ContactProtectedTag extends ProtectedTag { /** * `BattlerTag` class for moves that block damaging moves damage the enemy if the enemy's move makes contact * Used by {@linkcode MoveId.SPIKY_SHIELD} + * + * @sealed */ export class ContactDamageProtectedTag extends ContactProtectedTag { - private damageRatio: number; + public override readonly tagType = BattlerTagType.SPIKY_SHIELD; + #damageRatio: number; constructor(sourceMove: MoveId, damageRatio: number) { super(sourceMove, BattlerTagType.SPIKY_SHIELD); - this.damageRatio = damageRatio; - } - - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.damageRatio = source.damageRatio; + this.#damageRatio = damageRatio; } /** @@ -1713,7 +1786,7 @@ export class ContactDamageProtectedTag extends ContactProtectedTag { const cancelled = new BooleanHolder(false); applyAbAttrs("BlockNonDirectDamageAbAttr", { pokemon: user, cancelled }); if (!cancelled.value) { - attacker.damageAndUpdate(toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), { + attacker.damageAndUpdate(toDmgValue(attacker.getMaxHp() * (1 / this.#damageRatio)), { result: HitResult.INDIRECT, }); } @@ -1721,20 +1794,22 @@ export class ContactDamageProtectedTag extends ContactProtectedTag { } /** Base class for `BattlerTag`s that block damaging moves but not status moves */ -export class DamageProtectedTag extends ContactProtectedTag {} +export abstract class DamageProtectedTag extends ContactProtectedTag { + public declare readonly tagType: DamageProtectedTagType; +} export class ContactSetStatusProtectedTag extends DamageProtectedTag { + public declare readonly tagType: ContactSetStatusProtectedTagType; + /** The status effect applied to attackers */ + #statusEffect: StatusEffect; /** - * @param sourceMove The move that caused the tag to be applied - * @param tagType The type of the tag - * @param statusEffect The status effect to apply to the attacker + * @param sourceMove - The move that caused the tag to be applied + * @param tagType - The type of the tag + * @param statusEffect - The status effect applied to attackers */ - constructor( - sourceMove: MoveId, - tagType: BattlerTagType, - private statusEffect: StatusEffect, - ) { + constructor(sourceMove: MoveId, tagType: ContactSetStatusProtectedTagType, statusEffect: StatusEffect) { super(sourceMove, tagType); + this.#statusEffect = statusEffect; } /** @@ -1743,7 +1818,7 @@ export class ContactSetStatusProtectedTag extends DamageProtectedTag { * @param user - The pokemon that is being attacked and has the tag */ override onContact(attacker: Pokemon, user: Pokemon): void { - attacker.trySetStatus(this.statusEffect, true, user); + attacker.trySetStatus(this.#statusEffect, true, user); } } @@ -1752,24 +1827,15 @@ export class ContactSetStatusProtectedTag extends DamageProtectedTag { * Used by {@linkcode MoveId.KINGS_SHIELD}, {@linkcode MoveId.OBSTRUCT}, {@linkcode MoveId.SILK_TRAP} */ export class ContactStatStageChangeProtectedTag extends DamageProtectedTag { - private stat: BattleStat; - private levels: number; + public declare readonly tagType: ContactStatStageChangeProtectedTagType; + #stat: BattleStat; + #levels: number; - constructor(sourceMove: MoveId, tagType: BattlerTagType, stat: BattleStat, levels: number) { + constructor(sourceMove: MoveId, tagType: ContactStatStageChangeProtectedTagType, stat: BattleStat, levels: number) { super(sourceMove, tagType); - this.stat = stat; - this.levels = levels; - } - - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - override loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.stat = source.stat; - this.levels = source.levels; + this.#stat = stat; + this.#levels = levels; } /** @@ -1782,19 +1848,19 @@ export class ContactStatStageChangeProtectedTag extends DamageProtectedTag { "StatStageChangePhase", attacker.getBattlerIndex(), false, - [this.stat], - this.levels, + [this.#stat], + this.#levels, ); } } /** * `BattlerTag` class for effects that cause the affected Pokemon to survive lethal attacks at 1 HP. - * Used for {@link https://bulbapedia.bulbagarden.net/wiki/Endure_(move) | Endure} and - * Endure Tokens. + * Used for {@link https://bulbapedia.bulbagarden.net/wiki/Endure_(move) | Endure} and endure tokens. */ export class EnduringTag extends BattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: MoveId) { + public declare readonly tagType: EndureTagType; + constructor(tagType: EndureTagType, lapseType: BattlerTagLapseType, sourceMove: MoveId) { super(tagType, lapseType, 0, sourceMove); } @@ -1823,6 +1889,7 @@ export class EnduringTag extends BattlerTag { } export class SturdyTag extends BattlerTag { + public override readonly tagType = BattlerTagType.STURDY; constructor(sourceMove: MoveId) { super(BattlerTagType.STURDY, BattlerTagLapseType.TURN_END, 0, sourceMove); } @@ -1841,7 +1908,8 @@ export class SturdyTag extends BattlerTag { } } -export class PerishSongTag extends BattlerTag { +export class PerishSongTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.PERISH_SONG; constructor(turnCount: number) { super(BattlerTagType.PERISH_SONG, BattlerTagLapseType.TURN_END, turnCount, MoveId.PERISH_SONG, undefined, true); } @@ -1873,6 +1941,7 @@ export class PerishSongTag extends BattlerTag { * @see {@link https://bulbapedia.bulbagarden.net/wiki/Center_of_attention | Center of Attention} */ export class CenterOfAttentionTag extends BattlerTag { + public override readonly tagType = BattlerTagType.CENTER_OF_ATTENTION; public powder: boolean; constructor(sourceMove: MoveId) { @@ -1899,30 +1968,26 @@ export class CenterOfAttentionTag extends BattlerTag { } } -export class AbilityBattlerTag extends BattlerTag { - public ability: AbilityId; - - constructor(tagType: BattlerTagType, ability: AbilityId, lapseType: BattlerTagLapseType, turnCount: number) { - super(tagType, lapseType, turnCount); - - this.ability = ability; +export class AbilityBattlerTag extends SerializableBattlerTag { + public declare readonly tagType: AbilityBattlerTagType; + #ability: AbilityId; + /** The ability that the tag corresponds to */ + public get ability(): AbilityId { + return this.#ability; } - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.ability = source.ability as AbilityId; + constructor(tagType: AbilityBattlerTagType, ability: AbilityId, lapseType: BattlerTagLapseType, turnCount: number) { + super(tagType, lapseType, turnCount); + + this.#ability = ability; } } /** * Tag used by Unburden to double speed - * @extends AbilityBattlerTag */ export class UnburdenTag extends AbilityBattlerTag { + public override readonly tagType = BattlerTagType.UNBURDEN; constructor() { super(BattlerTagType.UNBURDEN, AbilityId.UNBURDEN, BattlerTagLapseType.CUSTOM, 1); } @@ -1935,6 +2000,7 @@ export class UnburdenTag extends AbilityBattlerTag { } export class TruantTag extends AbilityBattlerTag { + public override readonly tagType = BattlerTagType.TRUANT; constructor() { super(BattlerTagType.TRUANT, AbilityId.TRUANT, BattlerTagLapseType.MOVE, 1); } @@ -1969,6 +2035,7 @@ export class TruantTag extends AbilityBattlerTag { } export class SlowStartTag extends AbilityBattlerTag { + public override readonly tagType = BattlerTagType.SLOW_START; constructor() { super(BattlerTagType.SLOW_START, AbilityId.SLOW_START, BattlerTagLapseType.TURN_END, 5); } @@ -2006,18 +2073,19 @@ export class SlowStartTag extends AbilityBattlerTag { } export class HighestStatBoostTag extends AbilityBattlerTag { + public declare readonly tagType: HighestStatBoostTagType; public stat: Stat; public multiplier: number; - constructor(tagType: BattlerTagType, ability: AbilityId) { + constructor(tagType: HighestStatBoostTagType, ability: AbilityId) { super(tagType, ability, BattlerTagLapseType.CUSTOM, 1); } /** * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag + * @param source - An object containing the fields needed to reconstruct this tag. */ - loadTag(source: BattlerTag | any): void { + loadTag(source: NonFunctionProperties): void { super.loadTag(source); this.stat = source.stat as Stat; this.multiplier = source.multiplier; @@ -2065,43 +2133,32 @@ export class HighestStatBoostTag extends AbilityBattlerTag { } } -export class WeatherHighestStatBoostTag extends HighestStatBoostTag implements WeatherBattlerTag { - public weatherTypes: WeatherType[]; - - constructor(tagType: BattlerTagType, ability: AbilityId, ...weatherTypes: WeatherType[]) { - super(tagType, ability); - this.weatherTypes = weatherTypes; +export class WeatherHighestStatBoostTag extends HighestStatBoostTag { + #weatherTypes: WeatherType[]; + public get weatherTypes(): WeatherType[] { + return this.#weatherTypes; } - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.weatherTypes = source.weatherTypes.map(w => w as WeatherType); + constructor(tagType: HighestStatBoostTagType, ability: AbilityId, ...weatherTypes: WeatherType[]) { + super(tagType, ability); + this.#weatherTypes = weatherTypes; } } -export class TerrainHighestStatBoostTag extends HighestStatBoostTag implements TerrainBattlerTag { - public terrainTypes: TerrainType[]; - - constructor(tagType: BattlerTagType, ability: AbilityId, ...terrainTypes: TerrainType[]) { - super(tagType, ability); - this.terrainTypes = terrainTypes; +export class TerrainHighestStatBoostTag extends HighestStatBoostTag { + #terrainTypes: TerrainType[]; + public get terrainTypes(): TerrainType[] { + return this.#terrainTypes; } - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.terrainTypes = source.terrainTypes.map(w => w as TerrainType); + constructor(tagType: HighestStatBoostTagType, ability: AbilityId, ...terrainTypes: TerrainType[]) { + super(tagType, ability); + this.#terrainTypes = terrainTypes; } } -export class SemiInvulnerableTag extends BattlerTag { +export class SemiInvulnerableTag extends SerializableBattlerTag { + public declare readonly tagType: SemiInvulnerableTagType; constructor(tagType: BattlerTagType, turnCount: number, sourceMove: MoveId) { super(tagType, BattlerTagLapseType.MOVE_EFFECT, turnCount, sourceMove); } @@ -2121,22 +2178,16 @@ export class SemiInvulnerableTag extends BattlerTag { } } -export class TypeImmuneTag extends BattlerTag { - public immuneType: PokemonType; +export class TypeImmuneTag extends SerializableBattlerTag { + #immuneType: PokemonType; + public get immuneType(): PokemonType { + return this.#immuneType; + } constructor(tagType: BattlerTagType, sourceMove: MoveId, immuneType: PokemonType, length = 1) { super(tagType, BattlerTagLapseType.TURN_END, length, sourceMove, undefined, true); - this.immuneType = immuneType; - } - - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.immuneType = source.immuneType as PokemonType; + this.#immuneType = immuneType; } } @@ -2174,10 +2225,20 @@ export class FloatingTag extends TypeImmuneTag { } } -export class TypeBoostTag extends BattlerTag { - public boostedType: PokemonType; - public boostValue: number; - public oneUse: boolean; +export class TypeBoostTag extends SerializableBattlerTag { + #boostedType: PokemonType; + #boostValue: number; + #oneUse: boolean; + + public get boostedType(): PokemonType { + return this.#boostedType; + } + public get boostValue(): number { + return this.#boostValue; + } + public get oneUse(): boolean { + return this.#oneUse; + } constructor( tagType: BattlerTagType, @@ -2188,20 +2249,9 @@ export class TypeBoostTag extends BattlerTag { ) { super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove); - this.boostedType = boostedType; - this.boostValue = boostValue; - this.oneUse = oneUse; - } - - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.boostedType = source.boostedType as PokemonType; - this.boostValue = source.boostValue; - this.oneUse = source.oneUse; + this.#boostedType = boostedType; + this.#boostValue = boostValue; + this.#oneUse = oneUse; } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -2224,7 +2274,7 @@ export class TypeBoostTag extends BattlerTag { } } -export class CritBoostTag extends BattlerTag { +export class CritBoostTag extends SerializableBattlerTag { constructor(tagType: BattlerTagType, sourceMove: MoveId) { super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove, undefined, true); } @@ -2256,7 +2306,6 @@ export class CritBoostTag extends BattlerTag { /** * Tag for the effects of Dragon Cheer, which boosts the critical hit ratio of the user's allies. - * @extends {CritBoostTag} */ export class DragonCheerTag extends CritBoostTag { /** The types of the user's ally when the tag is added */ @@ -2273,22 +2322,12 @@ export class DragonCheerTag extends CritBoostTag { } } -export class SaltCuredTag extends BattlerTag { - private sourceIndex: number; - +export class SaltCuredTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.SALT_CURED; constructor(sourceId: number) { super(BattlerTagType.SALT_CURED, BattlerTagLapseType.TURN_END, 1, MoveId.SALT_CURE, sourceId); } - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.sourceIndex = source.sourceIndex; - } - onAdd(pokemon: Pokemon): void { const source = this.getSourcePokemon(); if (!source) { @@ -2302,7 +2341,6 @@ export class SaltCuredTag extends BattlerTag { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), }), ); - this.sourceIndex = source.getBattlerIndex(); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -2338,22 +2376,11 @@ export class SaltCuredTag extends BattlerTag { } } -export class CursedTag extends BattlerTag { - private sourceIndex: number; - +export class CursedTag extends SerializableBattlerTag { constructor(sourceId: number) { super(BattlerTagType.CURSED, BattlerTagLapseType.TURN_END, 1, MoveId.CURSE, sourceId, true); } - /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.sourceIndex = source.sourceIndex; - } - onAdd(pokemon: Pokemon): void { const source = this.getSourcePokemon(); if (!source) { @@ -2362,7 +2389,6 @@ export class CursedTag extends BattlerTag { } super.onAdd(pokemon); - this.sourceIndex = source.getBattlerIndex(); } lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -2392,10 +2418,11 @@ export class CursedTag extends BattlerTag { return ret; } } + /** * Battler tag for attacks that remove a type post use. */ -export class RemovedTypeTag extends BattlerTag { +export class RemovedTypeTag extends SerializableBattlerTag { constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: MoveId) { super(tagType, lapseType, 1, sourceMove); } @@ -2405,7 +2432,7 @@ export class RemovedTypeTag extends BattlerTag { * Battler tag for effects that ground the source, allowing Ground-type moves to hit them. * @description `IGNORE_FLYING`: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) */ -export class GroundedTag extends BattlerTag { +export class GroundedTag extends SerializableBattlerTag { constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: MoveId) { super(tagType, lapseType, 1, sourceMove); } @@ -2478,15 +2505,16 @@ export class RoostedTag extends BattlerTag { } /** Common attributes of form change abilities that block damage */ -export class FormBlockDamageTag extends BattlerTag { - constructor(tagType: BattlerTagType) { +export class FormBlockDamageTag extends SerializableBattlerTag { + public declare readonly tagType: BattlerTagType.ICE_FACE | BattlerTagType.DISGUISE; + constructor(tagType: BattlerTagType.ICE_FACE | BattlerTagType.DISGUISE) { super(tagType, BattlerTagLapseType.CUSTOM, 1); } /** * Determines if the tag can be added to the Pokémon. - * @param {Pokemon} pokemon The Pokémon to which the tag might be added. - * @returns {boolean} True if the tag can be added, false otherwise. + * @param pokemon - The Pokémon to which the tag might be added. + * @returns `true` if the tag can be added, `false` otherwise. */ canAdd(pokemon: Pokemon): boolean { return pokemon.formIndex === 0; @@ -2508,7 +2536,7 @@ export class FormBlockDamageTag extends BattlerTag { /** * Removes the tag from the Pokémon. * Triggers a form change when the tag is removed. - * @param {Pokemon} pokemon The Pokémon from which the tag is removed. + * @param pokemon - The Pokémon from which the tag is removed. */ onRemove(pokemon: Pokemon): void { super.onRemove(pokemon); @@ -2516,12 +2544,14 @@ export class FormBlockDamageTag extends BattlerTag { globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeAbilityTrigger); } } + /** Provides the additional weather-based effects of the Ice Face ability */ export class IceFaceBlockDamageTag extends FormBlockDamageTag { + public override readonly tagType = BattlerTagType.ICE_FACE; /** * Determines if the tag can be added to the Pokémon. - * @param {Pokemon} pokemon The Pokémon to which the tag might be added. - * @returns {boolean} True if the tag can be added, false otherwise. + * @param pokemon - The Pokémon to which the tag might be added. + * @returns `true` if the tag can be added, `false` otherwise. */ canAdd(pokemon: Pokemon): boolean { const weatherType = globalScene.arena.weather?.weatherType; @@ -2535,20 +2565,17 @@ export class IceFaceBlockDamageTag extends FormBlockDamageTag { * Battler tag indicating a Tatsugiri with {@link https://bulbapedia.bulbagarden.net/wiki/Commander_(Ability) | Commander} * has entered the tagged Pokemon's mouth. */ -export class CommandedTag extends BattlerTag { - private _tatsugiriFormKey: string; +export class CommandedTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.COMMANDED; + public readonly tatsugiriFormKey: string; constructor(sourceId: number) { super(BattlerTagType.COMMANDED, BattlerTagLapseType.CUSTOM, 0, MoveId.NONE, sourceId); } - public get tatsugiriFormKey(): string { - return this._tatsugiriFormKey; - } - /** Caches the Tatsugiri's form key and sharply boosts the tagged Pokemon's stats */ override onAdd(pokemon: Pokemon): void { - this._tatsugiriFormKey = this.getSourcePokemon()?.getFormKey() ?? "curly"; + (this as Mutable).tatsugiriFormKey = this.getSourcePokemon()?.getFormKey() ?? "curly"; globalScene.phaseManager.unshiftNew( "StatStageChangePhase", pokemon.getBattlerIndex(), @@ -2565,9 +2592,9 @@ export class CommandedTag extends BattlerTag { } } - override loadTag(source: BattlerTag | any): void { + override loadTag(source: NonFunctionProperties): void { super.loadTag(source); - this._tatsugiriFormKey = source._tatsugiriFormKey; + (this as Mutable).tatsugiriFormKey = source.tatsugiriFormKey; } } @@ -2581,7 +2608,8 @@ export class CommandedTag extends BattlerTag { * - Removing stacks decreases DEF and SPDEF, independently, by one stage for each stack that successfully changed * the stat when added. */ -export class StockpilingTag extends BattlerTag { +export class StockpilingTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.STOCKPILING; public stockpiledCount = 0; public statChangeCounts: { [Stat.DEF]: number; [Stat.SPDEF]: number } = { [Stat.DEF]: 0, @@ -2604,7 +2632,7 @@ export class StockpilingTag extends BattlerTag { } }; - loadTag(source: BattlerTag | any): void { + override loadTag(source: NonFunctionProperties): void { super.loadTag(source); this.stockpiledCount = source.stockpiledCount || 0; this.statChangeCounts = { @@ -2687,10 +2715,10 @@ export class StockpilingTag extends BattlerTag { /** * Battler tag for Gulp Missile used by Cramorant. - * @extends BattlerTag */ -export class GulpMissileTag extends BattlerTag { - constructor(tagType: BattlerTagType, sourceMove: MoveId) { +export class GulpMissileTag extends SerializableBattlerTag { + public declare readonly tagType: BattlerTagType.GULP_MISSILE_ARROKUDA | BattlerTagType.GULP_MISSILE_PIKACHU; + constructor(tagType: BattlerTagType.GULP_MISSILE_ARROKUDA | BattlerTagType.GULP_MISSILE_PIKACHU, sourceMove: MoveId) { super(tagType, BattlerTagLapseType.HIT, 0, sourceMove); } @@ -2729,11 +2757,12 @@ export class GulpMissileTag extends BattlerTag { /** * Gulp Missile's initial form changes are triggered by using Surf and Dive. - * @param {Pokemon} pokemon The Pokemon with Gulp Missile ability. + * @param pokemon - The Pokemon with Gulp Missile ability. * @returns Whether the BattlerTag can be added. */ canAdd(pokemon: Pokemon): boolean { - const isSurfOrDive = [MoveId.SURF, MoveId.DIVE].includes(this.sourceMove); + // Bang here is OK as if sourceMove was undefined, this would just evaluate to false + const isSurfOrDive = [MoveId.SURF, MoveId.DIVE].includes(this.sourceMove!); const isNormalForm = pokemon.formIndex === 0 && !pokemon.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA) && @@ -2755,52 +2784,46 @@ export class GulpMissileTag extends BattlerTag { } /** - * Tag that makes the target drop all of it type immunities + * Tag that makes the target drop the immunities granted by a particular type * and all accuracy checks ignore its evasiveness stat. * * Applied by moves: {@linkcode MoveId.ODOR_SLEUTH | Odor Sleuth}, * {@linkcode MoveId.MIRACLE_EYE | Miracle Eye} and {@linkcode MoveId.FORESIGHT | Foresight}. * - * @extends BattlerTag * @see {@linkcode ignoreImmunity} */ -export class ExposedTag extends BattlerTag { - private defenderType: PokemonType; - private allowedTypes: PokemonType[]; +export class ExposedTag extends SerializableBattlerTag { + public declare readonly tagType: BattlerTagType.IGNORE_DARK | BattlerTagType.IGNORE_GHOST; + #defenderType: PokemonType; + #allowedTypes: readonly PokemonType[]; - constructor(tagType: BattlerTagType, sourceMove: MoveId, defenderType: PokemonType, allowedTypes: PokemonType[]) { + constructor( + tagType: BattlerTagType.IGNORE_DARK | BattlerTagType.IGNORE_GHOST, + sourceMove: MoveId, + defenderType: PokemonType, + allowedTypes: PokemonType[], + ) { super(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove); - this.defenderType = defenderType; - this.allowedTypes = allowedTypes; + this.#defenderType = defenderType; + this.#allowedTypes = allowedTypes; } /** - * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag - */ - loadTag(source: BattlerTag | any): void { - super.loadTag(source); - this.defenderType = source.defenderType as PokemonType; - this.allowedTypes = source.allowedTypes as PokemonType[]; - } - - /** - * @param types {@linkcode PokemonType} of the defending Pokemon - * @param moveType {@linkcode PokemonType} of the move targetting it + * @param type - The defending type to check against + * @param moveType - The pokemon type of the move being used * @returns `true` if the move should be allowed to target the defender. */ ignoreImmunity(type: PokemonType, moveType: PokemonType): boolean { - return type === this.defenderType && this.allowedTypes.includes(moveType); + return type === this.#defenderType && this.#allowedTypes.includes(moveType); } } /** * Tag that prevents HP recovery from held items and move effects. It also blocks the usage of recovery moves. * Applied by moves: {@linkcode MoveId.HEAL_BLOCK | Heal Block (5 turns)}, {@linkcode MoveId.PSYCHIC_NOISE | Psychic Noise (2 turns)} - * - * @extends MoveRestrictionBattlerTag */ export class HealBlockTag extends MoveRestrictionBattlerTag { + public override readonly tagType = BattlerTagType.HEAL_BLOCK; constructor(turnCount: number, sourceMove: MoveId) { super( BattlerTagType.HEAL_BLOCK, @@ -2818,7 +2841,7 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { /** * Checks if a move is disabled under Heal Block - * @param {MoveId} move {@linkcode MoveId} the move ID + * @param move - {@linkcode MoveId | ID} of the move being used * @returns `true` if the move has a TRIAGE_MOVE flag and is a status move */ override isMoveRestricted(move: MoveId): boolean { @@ -2828,9 +2851,9 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { /** * Checks if a move is disabled under Heal Block because of its choice of target * Implemented b/c of Pollen Puff - * @param {MoveId} move {@linkcode MoveId} the move ID - * @param {Pokemon} user {@linkcode Pokemon} the move user - * @param {Pokemon} target {@linkcode Pokemon} the target of the move + * @param move - {@linkcode MoveId | ID} of the move being used + * @param user - The pokemon using the move + * @param target - The target of the move * @returns `true` if the move cannot be used because the target is an ally */ override isMoveTargetRestricted(move: MoveId, user: Pokemon, target: Pokemon) { @@ -2851,10 +2874,9 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { } /** - * @override - * @param {Pokemon} pokemon {@linkcode Pokemon} attempting to use the restricted move - * @param {MoveId} move {@linkcode MoveId} ID of the move being interrupted - * @returns {string} text to display when the move is interrupted + * @param pokemon - {@linkcode Pokemon} attempting to use the restricted move + * @param move - {@linkcode MoveId | ID} of the move being interrupted + * @returns Text to display when the move is interrupted */ override interruptedText(pokemon: Pokemon, move: MoveId): string { return i18next.t("battle:moveDisabledHealBlock", { @@ -2880,17 +2902,17 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { /** * Tag that doubles the type effectiveness of Fire-type moves. - * @extends BattlerTag */ -export class TarShotTag extends BattlerTag { +export class TarShotTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.TAR_SHOT; constructor() { super(BattlerTagType.TAR_SHOT, BattlerTagLapseType.CUSTOM, 0); } /** * If the Pokemon is terastallized, the tag cannot be added. - * @param {Pokemon} pokemon the {@linkcode Pokemon} to which the tag is added - * @returns whether the tag is applied + * @param pokemon - The pokemon to check + * @returns Whether the tag can be added */ override canAdd(pokemon: Pokemon): boolean { return !pokemon.isTerastallized; @@ -2910,6 +2932,7 @@ export class TarShotTag extends BattlerTag { * While this tag is in effect, the afflicted Pokemon's moves are changed to Electric type. */ export class ElectrifiedTag extends BattlerTag { + public override readonly tagType = BattlerTagType.ELECTRIFIED; constructor() { super(BattlerTagType.ELECTRIFIED, BattlerTagLapseType.TURN_END, 1, MoveId.ELECTRIFY); } @@ -2928,7 +2951,8 @@ export class ElectrifiedTag extends BattlerTag { * Battler Tag that keeps track of how many times the user has Autotomized * Each count of Autotomization reduces the weight by 100kg */ -export class AutotomizedTag extends BattlerTag { +export class AutotomizedTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.AUTOTOMIZED; public autotomizeCount = 0; constructor(sourceMove: MoveId = MoveId.AUTOTOMIZE) { super(BattlerTagType.AUTOTOMIZED, BattlerTagLapseType.CUSTOM, 1, sourceMove); @@ -2954,20 +2978,45 @@ export class AutotomizedTag extends BattlerTag { onOverlap(pokemon: Pokemon): void { this.onAdd(pokemon); } + + loadTag(source: NonFunctionProperties): void { + super.loadTag(source); + this.autotomizeCount = source.autotomizeCount; + } } /** * Tag implementing the {@link https://bulbapedia.bulbagarden.net/wiki/Substitute_(doll)#Effect | Substitute Doll} effect, * for use with the moves Substitute and Shed Tail. Pokemon with this tag deflect most forms of received attack damage * onto the tag. This tag also grants immunity to most Status moves and several move effects. + * + * @sealed */ -export class SubstituteTag extends BattlerTag { +export class SubstituteTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.SUBSTITUTE; /** The substitute's remaining HP. If HP is depleted, the Substitute fades. */ public hp: number; + + //#region non-serializable properties /** A reference to the sprite representing the Substitute doll */ - public sprite: Phaser.GameObjects.Sprite; + #sprite: Phaser.GameObjects.Sprite; + /** A reference to the sprite representing the Substitute doll */ + public get sprite(): Phaser.GameObjects.Sprite { + return this.#sprite; + } + public set sprite(value: Phaser.GameObjects.Sprite) { + this.#sprite = value; + } /** Is the source Pokemon "in focus," i.e. is it fully visible on the field? */ - public sourceInFocus: boolean; + #sourceInFocus: boolean; + /** Is the source Pokemon "in focus," i.e. is it fully visible on the field? */ + public get sourceInFocus(): boolean { + return this.#sourceInFocus; + } + public set sourceInFocus(value: boolean) { + this.#sourceInFocus = value; + } + //#endregion non-serializable properties constructor(sourceMove: MoveId, sourceId: number) { super( @@ -3078,9 +3127,9 @@ export class SubstituteTag extends BattlerTag { /** * When given a battler tag or json representing one, load the data for it. - * @param {BattlerTag | any} source A battler tag + * @param source - An object containing the necessary properties to load the tag */ - loadTag(source: BattlerTag | any): void { + override loadTag(source: NonFunctionProperties): void { super.loadTag(source); this.hp = source.hp; } @@ -3093,6 +3142,7 @@ export class SubstituteTag extends BattlerTag { * Currently used only in MysteryEncounters to provide start of fight stat buffs. */ export class MysteryEncounterPostSummonTag extends BattlerTag { + public override readonly tagType = BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON; constructor() { super(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, BattlerTagLapseType.CUSTOM, 1); } @@ -3126,15 +3176,11 @@ export class MysteryEncounterPostSummonTag extends BattlerTag { * Torment does not interrupt the move if the move is performed consecutively in the same turn and right after Torment is applied */ export class TormentTag extends MoveRestrictionBattlerTag { + public override readonly tagType = BattlerTagType.TORMENT; constructor(sourceId: number) { super(BattlerTagType.TORMENT, BattlerTagLapseType.AFTER_MOVE, 1, MoveId.TORMENT, sourceId); } - /** - * Adds the battler tag to the target Pokemon and defines the private class variable 'target' - * 'Target' is used to track the Pokemon's current status - * @param {Pokemon} pokemon the Pokemon tormented - */ override onAdd(pokemon: Pokemon) { super.onAdd(pokemon); globalScene.phaseManager.queueMessage( @@ -3147,7 +3193,7 @@ export class TormentTag extends MoveRestrictionBattlerTag { /** * Torment only ends when the affected Pokemon leaves the battle field - * @param {Pokemon} pokemon the Pokemon under the effects of Torment + * @param pokemon - The Pokemon under the effects of Torment * @param _tagType * @returns `true` if still present | `false` if not */ @@ -3156,8 +3202,8 @@ export class TormentTag extends MoveRestrictionBattlerTag { } /** - * This checks if the current move used is identical to the last used move with a {@linkcode MoveResult} of `SUCCESS`/`MISS` - * @param {MoveId} move the move under investigation + * Check if the current move used is identical to the last used move with a {@linkcode MoveResult} of `SUCCESS`/`MISS` + * @param move - The move under investigation * @returns `true` if there is valid consecutive usage | `false` if the moves are different from each other */ public override isMoveRestricted(move: MoveId, user: Pokemon): boolean { @@ -3189,6 +3235,7 @@ export class TormentTag extends MoveRestrictionBattlerTag { * The tag is removed after 4 turns. */ export class TauntTag extends MoveRestrictionBattlerTag { + public override readonly tagType = BattlerTagType.TAUNT; constructor() { super(BattlerTagType.TAUNT, [BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.AFTER_MOVE], 4, MoveId.TAUNT); } @@ -3214,8 +3261,8 @@ export class TauntTag extends MoveRestrictionBattlerTag { } /** - * Checks if a move is a status move and determines its restriction status on that basis - * @param {MoveId} move the move under investigation + * Check if a move is a status move and determines its restriction status on that basis + * @param move - The move under investigation * @returns `true` if the move is a status move */ override isMoveRestricted(move: MoveId): boolean { @@ -3243,6 +3290,7 @@ export class TauntTag extends MoveRestrictionBattlerTag { * The tag is only removed when the source-user is removed from the field. */ export class ImprisonTag extends MoveRestrictionBattlerTag { + public override readonly tagType = BattlerTagType.IMPRISON; constructor(sourceId: number) { super( BattlerTagType.IMPRISON, @@ -3255,8 +3303,7 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { /** * Checks if the source of Imprison is still active - * @override - * @param pokemon The pokemon this tag is attached to + * @param pokemon - The pokemon this tag is attached to * @returns `true` if the source is still active */ public override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { @@ -3273,8 +3320,7 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { /** * Checks if the source of the tag has the parameter move in its moveset and that the source is still active - * @override - * @param {MoveId} move the move under investigation + * @param move - The move under investigation * @returns `false` if either condition is not met */ public override isMoveRestricted(move: MoveId, _user: Pokemon): boolean { @@ -3306,7 +3352,8 @@ export class ImprisonTag extends MoveRestrictionBattlerTag { * For three turns, starting from the turn of hit, at the end of each turn, the target Pokemon's speed will decrease by 1. * The tag can also expire by taking the target Pokemon off the field, or the Pokemon that originally used the move. */ -export class SyrupBombTag extends BattlerTag { +export class SyrupBombTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.SYRUP_BOMB; constructor(sourceId: number) { super(BattlerTagType.SYRUP_BOMB, BattlerTagLapseType.TURN_END, 3, MoveId.SYRUP_BOMB, sourceId); } @@ -3368,7 +3415,8 @@ export class SyrupBombTag extends BattlerTag { * The effects of Telekinesis can be baton passed to a teammate. * @see {@link https://bulbapedia.bulbagarden.net/wiki/Telekinesis_(move) | MoveId.TELEKINESIS} */ -export class TelekinesisTag extends BattlerTag { +export class TelekinesisTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.TELEKINESIS; constructor(sourceMove: MoveId) { super( BattlerTagType.TELEKINESIS, @@ -3391,9 +3439,9 @@ export class TelekinesisTag extends BattlerTag { /** * Tag that swaps the user's base ATK stat with its base DEF stat. - * @extends BattlerTag */ -export class PowerTrickTag extends BattlerTag { +export class PowerTrickTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.POWER_TRICK; constructor(sourceMove: MoveId, sourceId: number) { super(BattlerTagType.POWER_TRICK, BattlerTagLapseType.CUSTOM, 0, sourceMove, sourceId, true); } @@ -3418,7 +3466,7 @@ export class PowerTrickTag extends BattlerTag { /** * Removes the Power Trick tag and reverts any stat changes if the tag is already applied. - * @param {Pokemon} pokemon The {@linkcode Pokemon} that already has the Power Trick tag. + * @param pokemon - The {@linkcode Pokemon} that already has the Power Trick tag. */ onOverlap(pokemon: Pokemon): void { pokemon.removeTag(this.tagType); @@ -3426,7 +3474,7 @@ export class PowerTrickTag extends BattlerTag { /** * Swaps the user's base ATK stat with its base DEF stat. - * @param {Pokemon} pokemon The {@linkcode Pokemon} whose stats will be swapped. + * @param pokemon - The {@linkcode Pokemon} whose stats will be swapped. */ swapStat(pokemon: Pokemon): void { const temp = pokemon.getStat(Stat.ATK, false); @@ -3440,7 +3488,8 @@ export class PowerTrickTag extends BattlerTag { * If this tag is active when the bearer faints from an opponent's move, the tag reduces that move's PP to 0. * Otherwise, it lapses when the bearer makes another move. */ -export class GrudgeTag extends BattlerTag { +export class GrudgeTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.GRUDGE; constructor() { super(BattlerTagType.GRUDGE, [BattlerTagLapseType.CUSTOM, BattlerTagLapseType.PRE_MOVE], 1, MoveId.GRUDGE); } @@ -3458,7 +3507,7 @@ export class GrudgeTag extends BattlerTag { * Activates Grudge's special effect on the attacking Pokemon and lapses the tag. * @param pokemon * @param lapseType - * @param sourcePokemon {@linkcode Pokemon} the source of the move that fainted the tag's bearer + * @param sourcePokemon - The source of the move that fainted the tag's bearer * @returns `false` if Grudge activates its effect or lapses */ override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType, sourcePokemon?: Pokemon): boolean { @@ -3486,6 +3535,7 @@ export class GrudgeTag extends BattlerTag { * Tag used to heal the user of Psycho Shift of its status effect if Psycho Shift succeeds in transferring its status effect to the target Pokemon */ export class PsychoShiftTag extends BattlerTag { + public override readonly tagType = BattlerTagType.PSYCHO_SHIFT; constructor() { super(BattlerTagType.PSYCHO_SHIFT, BattlerTagLapseType.AFTER_MOVE, 1, MoveId.PSYCHO_SHIFT); } @@ -3510,6 +3560,7 @@ export class PsychoShiftTag extends BattlerTag { * Tag associated with the move Magic Coat. */ export class MagicCoatTag extends BattlerTag { + public override readonly tagType = BattlerTagType.MAGIC_COAT; constructor() { super(BattlerTagType.MAGIC_COAT, BattlerTagLapseType.TURN_END, 1, MoveId.MAGIC_COAT); } @@ -3729,19 +3780,18 @@ export function getBattlerTag( return new PsychoShiftTag(); case BattlerTagType.MAGIC_COAT: return new MagicCoatTag(); - case BattlerTagType.NONE: - default: - return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); } } /** * When given a battler tag or json representing one, creates an actual BattlerTag object with the same data. - * @param {BattlerTag | any} source A battler tag - * @return {BattlerTag} The valid battler tag + * @param source - An object containing the data necessary to reconstruct the BattlerTag. + * @returns The valid battler tag */ -export function loadBattlerTag(source: BattlerTag | any): BattlerTag { - const tag = getBattlerTag(source.tagType, source.turnCount, source.sourceMove, source.sourceId); +export function loadBattlerTag(source: SerializableBattlerTag): BattlerTag { + // TODO: Remove this bang by fixing the signature of `getBattlerTag` + // to allow undefined sourceIds and sourceMoves (with appropriate fallback for tags that require it) + const tag = getBattlerTag(source.tagType, source.turnCount, source.sourceMove!, source.sourceId!); tag.loadTag(source); return tag; } @@ -3749,8 +3799,8 @@ export function loadBattlerTag(source: BattlerTag | any): BattlerTag { /** * Helper function to verify that the current phase is a MoveEffectPhase and provide quick access to commonly used fields * - * @param _pokemon {@linkcode Pokemon} The Pokémon used to access the current phase - * @returns null if current phase is not MoveEffectPhase, otherwise Object containing the {@linkcode MoveEffectPhase}, and its + * @param _pokemon - The Pokémon used to access the current phase (unused) + * @returns `null` if current phase is not MoveEffectPhase, otherwise Object containing the {@linkcode MoveEffectPhase}, and its * corresponding {@linkcode Move} and user {@linkcode Pokemon} */ function getMoveEffectPhaseData(_pokemon: Pokemon): { phase: MoveEffectPhase; attacker: Pokemon; move: Move } | null { @@ -3764,3 +3814,104 @@ function getMoveEffectPhaseData(_pokemon: Pokemon): { phase: MoveEffectPhase; at } return null; } + +/** + * Map from {@linkcode BattlerTagType} to the corresponding {@linkcode BattlerTag} class. + */ +export type BattlerTagTypeMap = { + [BattlerTagType.RECHARGING]: RechargingTag; + [BattlerTagType.SHELL_TRAP]: ShellTrapTag; + [BattlerTagType.FLINCHED]: FlinchedTag; + [BattlerTagType.INTERRUPTED]: InterruptedTag; + [BattlerTagType.CONFUSED]: ConfusedTag; + [BattlerTagType.INFATUATED]: InfatuatedTag; + [BattlerTagType.SEEDED]: SeedTag; + [BattlerTagType.POWDER]: PowderTag; + [BattlerTagType.NIGHTMARE]: NightmareTag; + [BattlerTagType.FRENZY]: FrenzyTag; + [BattlerTagType.CHARGING]: BattlerTag; + [BattlerTagType.ENCORE]: EncoreTag; + [BattlerTagType.HELPING_HAND]: HelpingHandTag; + [BattlerTagType.INGRAIN]: IngrainTag; + [BattlerTagType.AQUA_RING]: AquaRingTag; + [BattlerTagType.DROWSY]: DrowsyTag; + [BattlerTagType.TRAPPED]: TrappedTag; + [BattlerTagType.NO_RETREAT]: NoRetreatTag; + [BattlerTagType.BIND]: BindTag; + [BattlerTagType.WRAP]: WrapTag; + [BattlerTagType.FIRE_SPIN]: FireSpinTag; + [BattlerTagType.WHIRLPOOL]: WhirlpoolTag; + [BattlerTagType.CLAMP]: ClampTag; + [BattlerTagType.SAND_TOMB]: SandTombTag; + [BattlerTagType.MAGMA_STORM]: MagmaStormTag; + [BattlerTagType.SNAP_TRAP]: SnapTrapTag; + [BattlerTagType.THUNDER_CAGE]: ThunderCageTag; + [BattlerTagType.INFESTATION]: InfestationTag; + [BattlerTagType.PROTECTED]: ProtectedTag; + [BattlerTagType.SPIKY_SHIELD]: ContactDamageProtectedTag; + [BattlerTagType.KINGS_SHIELD]: ContactStatStageChangeProtectedTag; + [BattlerTagType.OBSTRUCT]: ContactStatStageChangeProtectedTag; + [BattlerTagType.SILK_TRAP]: ContactStatStageChangeProtectedTag; + [BattlerTagType.BANEFUL_BUNKER]: ContactSetStatusProtectedTag; + [BattlerTagType.BURNING_BULWARK]: ContactSetStatusProtectedTag; + [BattlerTagType.ENDURING]: EnduringTag; + [BattlerTagType.ENDURE_TOKEN]: EnduringTag; + [BattlerTagType.STURDY]: SturdyTag; + [BattlerTagType.PERISH_SONG]: PerishSongTag; + [BattlerTagType.CENTER_OF_ATTENTION]: CenterOfAttentionTag; + [BattlerTagType.TRUANT]: TruantTag; + [BattlerTagType.SLOW_START]: SlowStartTag; + [BattlerTagType.PROTOSYNTHESIS]: WeatherHighestStatBoostTag; + [BattlerTagType.QUARK_DRIVE]: TerrainHighestStatBoostTag; + [BattlerTagType.FLYING]: SemiInvulnerableTag; + [BattlerTagType.UNDERGROUND]: SemiInvulnerableTag; + [BattlerTagType.UNDERWATER]: SemiInvulnerableTag; + [BattlerTagType.HIDDEN]: SemiInvulnerableTag; + [BattlerTagType.FIRE_BOOST]: TypeBoostTag; + [BattlerTagType.CRIT_BOOST]: CritBoostTag; + [BattlerTagType.DRAGON_CHEER]: DragonCheerTag; + [BattlerTagType.ALWAYS_CRIT]: BattlerTag; + [BattlerTagType.IGNORE_ACCURACY]: BattlerTag; + [BattlerTagType.ALWAYS_GET_HIT]: BattlerTag; + [BattlerTagType.RECEIVE_DOUBLE_DAMAGE]: BattlerTag; + [BattlerTagType.BYPASS_SLEEP]: BattlerTag; + [BattlerTagType.IGNORE_FLYING]: GroundedTag; + [BattlerTagType.ROOSTED]: RoostedTag; + [BattlerTagType.BURNED_UP]: RemovedTypeTag; + [BattlerTagType.DOUBLE_SHOCKED]: RemovedTypeTag; + [BattlerTagType.SALT_CURED]: SaltCuredTag; + [BattlerTagType.CURSED]: CursedTag; + [BattlerTagType.CHARGED]: TypeBoostTag; + [BattlerTagType.FLOATING]: FloatingTag; + [BattlerTagType.MINIMIZED]: MinimizeTag; + [BattlerTagType.DESTINY_BOND]: DestinyBondTag; + [BattlerTagType.ICE_FACE]: IceFaceBlockDamageTag; + [BattlerTagType.DISGUISE]: FormBlockDamageTag; + [BattlerTagType.COMMANDED]: CommandedTag; + [BattlerTagType.STOCKPILING]: StockpilingTag; + [BattlerTagType.OCTOLOCK]: OctolockTag; + [BattlerTagType.DISABLED]: DisabledTag; + [BattlerTagType.IGNORE_GHOST]: ExposedTag; + [BattlerTagType.IGNORE_DARK]: ExposedTag; + [BattlerTagType.GULP_MISSILE_ARROKUDA]: GulpMissileTag; + [BattlerTagType.GULP_MISSILE_PIKACHU]: GulpMissileTag; + [BattlerTagType.BEAK_BLAST_CHARGING]: BeakBlastChargingTag; + [BattlerTagType.TAR_SHOT]: TarShotTag; + [BattlerTagType.ELECTRIFIED]: ElectrifiedTag; + [BattlerTagType.THROAT_CHOPPED]: ThroatChoppedTag; + [BattlerTagType.GORILLA_TACTICS]: GorillaTacticsTag; + [BattlerTagType.UNBURDEN]: UnburdenTag; + [BattlerTagType.SUBSTITUTE]: SubstituteTag; + [BattlerTagType.AUTOTOMIZED]: AutotomizedTag; + [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]: MysteryEncounterPostSummonTag; + [BattlerTagType.HEAL_BLOCK]: HealBlockTag; + [BattlerTagType.TORMENT]: TormentTag; + [BattlerTagType.TAUNT]: TauntTag; + [BattlerTagType.IMPRISON]: ImprisonTag; + [BattlerTagType.SYRUP_BOMB]: SyrupBombTag; + [BattlerTagType.TELEKINESIS]: TelekinesisTag; + [BattlerTagType.POWER_TRICK]: PowerTrickTag; + [BattlerTagType.GRUDGE]: GrudgeTag; + [BattlerTagType.PSYCHO_SHIFT]: PsychoShiftTag; + [BattlerTagType.MAGIC_COAT]: MagicCoatTag; +}; diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 965ab23a692..e6673f31826 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -10800,7 +10800,7 @@ export function initMoves() { new SelfStatusMove(MoveId.NO_RETREAT, PokemonType.FIGHTING, -1, 5, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .attr(AddBattlerTagAttr, BattlerTagType.NO_RETREAT, true, false) - .condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== MoveId.NO_RETREAT), // fails if the user is currently trapped by No Retreat + .condition((user, target, move) => user.getTag(TrappedTag)?.tagType !== BattlerTagType.NO_RETREAT), // fails if the user is currently trapped by No Retreat new StatusMove(MoveId.TAR_SHOT, PokemonType.ROCK, 100, 15, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false) diff --git a/src/data/pokemon/pokemon-data.ts b/src/data/pokemon/pokemon-data.ts index a2a0138a17a..972d7627bcd 100644 --- a/src/data/pokemon/pokemon-data.ts +++ b/src/data/pokemon/pokemon-data.ts @@ -1,4 +1,5 @@ -import { type BattlerTag, loadBattlerTag } from "#data/battler-tags"; +import type { BattlerTag } from "#data/battler-tags"; +import { loadBattlerTag, SerializableBattlerTag } from "#data/battler-tags"; import { allSpecies } from "#data/data-lists"; import type { Gender } from "#data/gender"; import { PokemonMove } from "#data/moves/pokemon-move"; @@ -187,9 +188,11 @@ export class PokemonSummonData { continue; } - if (key === "tags") { - // load battler tags - this.tags = value.map((t: BattlerTag) => loadBattlerTag(t)); + if (key === "tags" && Array.isArray(value)) { + // load battler tags, discarding any that are not serializable + this.tags = value + .map((t: SerializableBattlerTag) => loadBattlerTag(t)) + .filter((t): t is SerializableBattlerTag => t instanceof SerializableBattlerTag); continue; } this[key] = value; diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 719b08c5b81..6d9d2dd4a92 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -1,5 +1,4 @@ export enum BattlerTagType { - NONE = "NONE", RECHARGING = "RECHARGING", FLINCHED = "FLINCHED", INTERRUPTED = "INTERRUPTED", From ede2a947cacb07700515dfb941230b781f57f659 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:31:44 -0700 Subject: [PATCH 041/106] [Docs] Adjust `@module` doc comment in `battler-tags.ts` Note that currently Typedoc is not parsing `@module` docs, but this comment adjustment would be required if and when it gets fixed --- src/data/battler-tags.ts | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 79c14f860b6..9dfd43eccb3 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -47,29 +47,29 @@ import type { import type { Mutable, NonFunctionProperties } from "#types/type-helpers"; import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common"; -/* -@module -BattlerTags are used to represent semi-persistent effects that can be attached to a Pokemon. -Note that before serialization, a new tag object is created, and then `loadTag` is called on the -tag with the object that was serialized. - -This means it is straightforward to avoid serializing fields. -Fields that are not set in the constructor and not set in `loadTag` will thus not be serialized. - -Any battler tag that can persist across sessions must extend SerializableBattlerTag in its class definition signature. -Only tags that persist across waves (meaning their effect can last >1 turn) should be considered -serializable. - -Serializable battler tags have strict requirements for their fields. -Properties that are not necessary to reconstruct the tag must not be serialized. This can be avoided -by using a private property. If access to the property is needed outside of the class, then -a getter (and potentially, a setter) should be used instead. - -If a property that is intended to be private must be serialized, then it should instead -be declared as a public readonly propety. Then, in the `loadTag` method (or any method inside the class that needs to adjust the property) -use `(this as Mutable).propertyName = value;` -These rules ensure that Typescript is aware of the shape of the serialized version of the class. -*/ +/** + * @module + * BattlerTags are used to represent semi-persistent effects that can be attached to a Pokemon. + * Note that before serialization, a new tag object is created, and then `loadTag` is called on the + * tag with the object that was serialized. + * + * This means it is straightforward to avoid serializing fields. + * Fields that are not set in the constructor and not set in `loadTag` will thus not be serialized. + * + * Any battler tag that can persist across sessions must extend SerializableBattlerTag in its class definition signature. + * Only tags that persist across waves (meaning their effect can last >1 turn) should be considered + * serializable. + * + * Serializable battler tags have strict requirements for their fields. + * Properties that are not necessary to reconstruct the tag must not be serialized. This can be avoided + * by using a private property. If access to the property is needed outside of the class, then + * a getter (and potentially, a setter) should be used instead. + * + * If a property that is intended to be private must be serialized, then it should instead + * be declared as a public readonly propety. Then, in the `loadTag` method (or any method inside the class that needs to adjust the property) + * use `(this as Mutable).propertyName = value;` + * These rules ensure that Typescript is aware of the shape of the serialized version of the class. + */ /** Interface containing the serializable fields of BattlerTag */ interface BaseBattlerTag { From 10b9cfcdb0b30db35e452117b3ca25f6f26da2f2 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 29 Jul 2025 15:50:57 -0700 Subject: [PATCH 042/106] [Balance] End of turn triggers won't occur when you end a biome (#6169) * [Balance] End of turn triggers won't occur when you end a biome * Add tests * Move phase manipulation logic into `PhaseManager` * Rename "biome end" to "interlude" * Rename `TurnEndPhase#endOfBiome` to `upcomingInterlude` --------- Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> --- src/phase-manager.ts | 13 +++++ src/phases/check-interlude-phase.ts | 18 +++++++ src/phases/turn-end-phase.ts | 8 ++- src/phases/turn-start-phase.ts | 9 ++-- test/phases/check-biome-end-phase.test.ts | 62 +++++++++++++++++++++++ 5 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 src/phases/check-interlude-phase.ts create mode 100644 test/phases/check-biome-end-phase.test.ts diff --git a/src/phase-manager.ts b/src/phase-manager.ts index 73ea373904f..c56afe446ed 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -9,6 +9,7 @@ import { AttemptCapturePhase } from "#phases/attempt-capture-phase"; import { AttemptRunPhase } from "#phases/attempt-run-phase"; import { BattleEndPhase } from "#phases/battle-end-phase"; import { BerryPhase } from "#phases/berry-phase"; +import { CheckInterludePhase } from "#phases/check-interlude-phase"; import { CheckStatusEffectPhase } from "#phases/check-status-effect-phase"; import { CheckSwitchPhase } from "#phases/check-switch-phase"; import { CommandPhase } from "#phases/command-phase"; @@ -121,6 +122,7 @@ const PHASES = Object.freeze({ AttemptRunPhase, BattleEndPhase, BerryPhase, + CheckInterludePhase, CheckStatusEffectPhase, CheckSwitchPhase, CommandPhase, @@ -665,4 +667,15 @@ export class PhaseManager { ): void { this.startDynamicPhase(this.create(phase, ...args)); } + + /** Prevents end of turn effects from triggering when transitioning to a new biome on a X0 wave */ + public onInterlude(): void { + const phasesToRemove = ["WeatherEffectPhase", "BerryPhase", "CheckStatusEffectPhase"]; + this.phaseQueue = this.phaseQueue.filter(p => !phasesToRemove.includes(p.phaseName)); + + const turnEndPhase = this.findPhase(p => p.phaseName === "TurnEndPhase"); + if (turnEndPhase) { + turnEndPhase.upcomingInterlude = true; + } + } } diff --git a/src/phases/check-interlude-phase.ts b/src/phases/check-interlude-phase.ts new file mode 100644 index 00000000000..1589f74f058 --- /dev/null +++ b/src/phases/check-interlude-phase.ts @@ -0,0 +1,18 @@ +import { globalScene } from "#app/global-scene"; +import { Phase } from "#app/phase"; + +export class CheckInterludePhase extends Phase { + public override readonly phaseName = "CheckInterludePhase"; + + public override start(): void { + super.start(); + const { phaseManager } = globalScene; + const { waveIndex } = globalScene.currentBattle; + + if (waveIndex % 10 === 0 && globalScene.getEnemyParty().every(p => p.isFainted())) { + phaseManager.onInterlude(); + } + + this.end(); + } +} diff --git a/src/phases/turn-end-phase.ts b/src/phases/turn-end-phase.ts index ce3b2958c23..463f26e73a2 100644 --- a/src/phases/turn-end-phase.ts +++ b/src/phases/turn-end-phase.ts @@ -18,6 +18,8 @@ import i18next from "i18next"; export class TurnEndPhase extends FieldPhase { public readonly phaseName = "TurnEndPhase"; + public upcomingInterlude = false; + start() { super.start(); @@ -59,9 +61,11 @@ export class TurnEndPhase extends FieldPhase { pokemon.tempSummonData.waveTurnCount++; }; - this.executeForAll(handlePokemon); + if (!this.upcomingInterlude) { + this.executeForAll(handlePokemon); - globalScene.arena.lapseTags(); + globalScene.arena.lapseTags(); + } if (globalScene.arena.weather && !globalScene.arena.weather.lapse()) { globalScene.arena.trySetWeather(WeatherType.NONE); diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 0fc126801ec..9fdac65bb10 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -218,6 +218,7 @@ export class TurnStartPhase extends FieldPhase { break; } } + phaseManager.pushNew("CheckInterludePhase"); phaseManager.pushNew("WeatherEffectPhase"); phaseManager.pushNew("BerryPhase"); @@ -227,10 +228,10 @@ export class TurnStartPhase extends FieldPhase { phaseManager.pushNew("TurnEndPhase"); - /** - * this.end() will call shiftPhase(), which dumps everything from PrependQueue (aka everything that is unshifted()) to the front - * of the queue and dequeues to start the next phase - * this is important since stuff like SwitchSummon, AttemptRun, AttemptCapture Phases break the "flow" and should take precedence + /* + * `this.end()` will call `PhaseManager#shiftPhase()`, which dumps everything from `phaseQueuePrepend` + * (aka everything that is queued via `unshift()`) to the front of the queue and dequeues to start the next phase. + * This is important since stuff like `SwitchSummonPhase`, `AttemptRunPhase`, and `AttemptCapturePhase` break the "flow" and should take precedence */ this.end(); } diff --git a/test/phases/check-biome-end-phase.test.ts b/test/phases/check-biome-end-phase.test.ts new file mode 100644 index 00000000000..06957af9011 --- /dev/null +++ b/test/phases/check-biome-end-phase.test.ts @@ -0,0 +1,62 @@ +import { AbilityId } from "#enums/ability-id"; +import { BerryType } from "#enums/berry-type"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { WeatherType } from "#enums/weather-type"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Check Biome End Phase", () => { + 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 + .enemySpecies(SpeciesId.MAGIKARP) + .enemyMoveset(MoveId.SPLASH) + .enemyAbility(AbilityId.BALL_FETCH) + .ability(AbilityId.BALL_FETCH) + .startingLevel(100); + }); + + it("should not trigger end of turn effects when defeating the final pokemon of a biome in classic", async () => { + game.override + .startingWave(10) + .weather(WeatherType.SANDSTORM) + .startingHeldItems([{ name: "BERRY", type: BerryType.SITRUS }]); + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const player = game.field.getPlayerPokemon(); + + player.hp = 1; + + game.move.use(MoveId.EXTREME_SPEED); + await game.toEndOfTurn(); + + expect(player.hp).toBe(1); + }); + + it("should not prevent end of turn effects when transitioning waves within a biome", async () => { + game.override.weather(WeatherType.SANDSTORM); + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const player = game.field.getPlayerPokemon(); + + game.move.use(MoveId.EXTREME_SPEED); + await game.toEndOfTurn(); + + expect(player.hp).toBeLessThan(player.getMaxHp()); + }); +}); From 6ae2bd70cfbe6d97cae4941d4d27fa61403c36a0 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 29 Jul 2025 20:02:30 -0700 Subject: [PATCH 043/106] [Test] Add missing single battle override to `CheckInterludePhase` test --- ...k-biome-end-phase.test.ts => check-interlude-phase.test.ts} | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename test/phases/{check-biome-end-phase.test.ts => check-interlude-phase.test.ts} (97%) diff --git a/test/phases/check-biome-end-phase.test.ts b/test/phases/check-interlude-phase.test.ts similarity index 97% rename from test/phases/check-biome-end-phase.test.ts rename to test/phases/check-interlude-phase.test.ts index 06957af9011..d5413d1db35 100644 --- a/test/phases/check-biome-end-phase.test.ts +++ b/test/phases/check-interlude-phase.test.ts @@ -28,7 +28,8 @@ describe("Check Biome End Phase", () => { .enemyMoveset(MoveId.SPLASH) .enemyAbility(AbilityId.BALL_FETCH) .ability(AbilityId.BALL_FETCH) - .startingLevel(100); + .startingLevel(100) + .battleStyle("single"); }); it("should not trigger end of turn effects when defeating the final pokemon of a biome in classic", async () => { From 17eeceb4f348b87582986f77a6129874cb3ad53d Mon Sep 17 00:00:00 2001 From: fabske0 <192151969+fabske0@users.noreply.github.com> Date: Wed, 30 Jul 2025 19:58:10 +0200 Subject: [PATCH 044/106] [UI/UX] Fix button and input field overlaps (#6013) * [Fix] Fix button overlap * [Fix] Fix input field overlaps * use getWidth to determine if label should be shortened --------- Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Co-authored-by: damocleas --- src/ui/form-modal-ui-handler.ts | 20 ++++++++++++---- src/ui/modal-ui-handler.ts | 19 +++++++++++---- src/ui/pokedex-scan-ui-handler.ts | 7 ++++-- src/ui/registration-form-ui-handler.ts | 32 +++----------------------- 4 files changed, 38 insertions(+), 40 deletions(-) diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 7ae545a7292..203d98a86c7 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -72,6 +72,10 @@ export abstract class FormModalUiHandler extends ModalUiHandler { (hasTitle ? 31 : 5) + 20 * (config.length - 1) + 16 + this.getButtonTopMargin(), "", TextStyle.TOOLTIP_CONTENT, + { + fontSize: "42px", + wordWrap: { width: 850 }, + }, ); this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); @@ -84,20 +88,28 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.inputs = []; this.formLabels = []; fieldsConfig.forEach((config, f) => { - const label = addTextObject(10, (hasTitle ? 31 : 5) + 20 * f, config.label, TextStyle.TOOLTIP_CONTENT); + // The Pokédex Scan Window uses width `300` instead of `160` like the other forms + // Therefore, the label does not need to be shortened + const label = addTextObject( + 10, + (hasTitle ? 31 : 5) + 20 * f, + config.label.length > 25 && this.getWidth() < 200 ? config.label.slice(0, 20) + "..." : config.label, + TextStyle.TOOLTIP_CONTENT, + ); label.name = "formLabel" + f; this.formLabels.push(label); this.modalContainer.add(this.formLabels[this.formLabels.length - 1]); - const inputContainer = globalScene.add.container(70, (hasTitle ? 28 : 2) + 20 * f); + const inputWidth = label.width < 320 ? 80 : 80 - (label.width - 320) / 5.5; + const inputContainer = globalScene.add.container(70 + (80 - inputWidth), (hasTitle ? 28 : 2) + 20 * f); inputContainer.setVisible(false); - const inputBg = addWindow(0, 0, 80, 16, false, false, 0, 0, WindowVariant.XTHIN); + const inputBg = addWindow(0, 0, inputWidth, 16, false, false, 0, 0, WindowVariant.XTHIN); const isPassword = config?.isPassword; const isReadOnly = config?.isReadOnly; - const input = addTextInputObject(4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { + const input = addTextInputObject(4, -2, inputWidth * 5.5, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 20, readOnly: isReadOnly, diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index c93b713831e..228d80968b9 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -152,7 +152,12 @@ export abstract class ModalUiHandler extends UiHandler { updateContainer(config?: ModalConfig): void { const [marginTop, marginRight, marginBottom, marginLeft] = this.getMargin(config); - const [width, height] = [this.getWidth(config), this.getHeight(config)]; + /** + * If the total amount of characters for the 2 buttons exceeds ~30 characters, + * the width in `registration-form-ui-handler.ts` and `login-form-ui-handler.ts` needs to be increased. + */ + const width = this.getWidth(config); + const height = this.getHeight(config); this.modalContainer.setPosition( (globalScene.game.canvas.width / 6 - (width + (marginRight - marginLeft))) / 2, (-globalScene.game.canvas.height / 6 - (height + (marginBottom - marginTop))) / 2, @@ -166,10 +171,14 @@ export abstract class ModalUiHandler extends UiHandler { this.titleText.setX(width / 2); this.titleText.setVisible(!!title); - for (let b = 0; b < this.buttonContainers.length; b++) { - const sliceWidth = width / (this.buttonContainers.length + 1); - - this.buttonContainers[b].setPosition(sliceWidth * (b + 1), this.modalBg.height - (this.buttonBgs[b].height + 8)); + if (this.buttonContainers.length > 0) { + const spacing = 12; + const totalWidth = this.buttonBgs.reduce((sum, bg) => sum + bg.width, 0) + spacing * (this.buttonBgs.length - 1); + let x = (this.modalBg.width - totalWidth) / 2; + this.buttonContainers.forEach((container, i) => { + container.setPosition(x + this.buttonBgs[i].width / 2, this.modalBg.height - (this.buttonBgs[i].height + 8)); + x += this.buttonBgs[i].width + spacing; + }); } } diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts index bcf869f6f39..ab3258a03de 100644 --- a/src/ui/pokedex-scan-ui-handler.ts +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -158,8 +158,11 @@ export class PokedexScanUiHandler extends FormModalUiHandler { if (super.show(args)) { const config = args[0] as ModalConfig; - this.inputs[0].resize(1150, 116); - this.inputContainers[0].list[0].width = 200; + const label = this.formLabels[0]; + + const inputWidth = label.width < 420 ? 200 : 200 - (label.width - 420) / 5.75; + this.inputs[0].resize(inputWidth * 5.75, 116); + this.inputContainers[0].list[0].width = inputWidth; if (args[1] && typeof (args[1] as PlayerPokemon).getNameToRender === "function") { this.inputs[0].text = (args[1] as PlayerPokemon).getNameToRender(); } else { diff --git a/src/ui/registration-form-ui-handler.ts b/src/ui/registration-form-ui-handler.ts index 60f8d1d987f..2c8080d534d 100644 --- a/src/ui/registration-form-ui-handler.ts +++ b/src/ui/registration-form-ui-handler.ts @@ -8,19 +8,6 @@ import type { ModalConfig } from "#ui/modal-ui-handler"; import { addTextObject } from "#ui/text"; import i18next from "i18next"; -interface LanguageSetting { - inputFieldFontSize?: string; - warningMessageFontSize?: string; - errorMessageFontSize?: string; -} - -const languageSettings: { [key: string]: LanguageSetting } = { - "es-ES": { - inputFieldFontSize: "50px", - errorMessageFontSize: "40px", - }, -}; - export class RegistrationFormUiHandler extends FormModalUiHandler { getModalTitle(_config?: ModalConfig): string { return i18next.t("menu:register"); @@ -35,7 +22,7 @@ export class RegistrationFormUiHandler extends FormModalUiHandler { } getButtonTopMargin(): number { - return 8; + return 12; } getButtonLabels(_config?: ModalConfig): string[] { @@ -76,18 +63,9 @@ export class RegistrationFormUiHandler extends FormModalUiHandler { setup(): void { super.setup(); - this.modalContainer.list.forEach((child: Phaser.GameObjects.GameObject) => { - if (child instanceof Phaser.GameObjects.Text && child !== this.titleText) { - const inputFieldFontSize = languageSettings[i18next.resolvedLanguage!]?.inputFieldFontSize; - if (inputFieldFontSize) { - child.setFontSize(inputFieldFontSize); - } - } - }); - - const warningMessageFontSize = languageSettings[i18next.resolvedLanguage!]?.warningMessageFontSize ?? "42px"; const label = addTextObject(10, 87, i18next.t("menu:registrationAgeWarning"), TextStyle.TOOLTIP_CONTENT, { - fontSize: warningMessageFontSize, + fontSize: "42px", + wordWrap: { width: 850 }, }); this.modalContainer.add(label); @@ -107,10 +85,6 @@ export class RegistrationFormUiHandler extends FormModalUiHandler { const onFail = error => { globalScene.ui.setMode(UiMode.REGISTRATION_FORM, Object.assign(config, { errorMessage: error?.trim() })); globalScene.ui.playError(); - const errorMessageFontSize = languageSettings[i18next.resolvedLanguage!]?.errorMessageFontSize; - if (errorMessageFontSize) { - this.errorMessage.setFontSize(errorMessageFontSize); - } }; if (!this.inputs[0].text) { return onFail(i18next.t("menu:emptyUsername")); From 1ae69a4183bca6deffbf0a2356a6b47477670d1b Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Wed, 30 Jul 2025 21:17:17 -0400 Subject: [PATCH 045/106] [Dev] Moved type helpers to separate directory; (#6123) * [Dev] Moved type helpers to separate directory; renamed `EnumValues` to `ObjectValues` and enforced usage * Update tsconfig.json Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Fixed import issue * Updated documentation slightly --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Dean <69436131+emdeann@users.noreply.github.com> --- src/@types/arena-tags.ts | 2 +- src/@types/{ => helpers}/enum-types.ts | 10 ++--- src/@types/{ => helpers}/type-helpers.ts | 18 +++++--- src/@types/modifier-types.ts | 3 +- src/@types/phase-types.ts | 3 +- src/enums/ability-attr.ts | 4 +- src/enums/dex-attr.ts | 4 +- src/enums/gacha-types.ts | 4 +- src/enums/hit-check-result.ts | 4 +- src/utils/enums.ts | 6 +-- test/types/enum-types.test-d.ts | 53 +++++++++++++++--------- tsconfig.json | 2 +- 12 files changed, 70 insertions(+), 43 deletions(-) rename src/@types/{ => helpers}/enum-types.ts (68%) rename src/@types/{ => helpers}/type-helpers.ts (81%) diff --git a/src/@types/arena-tags.ts b/src/@types/arena-tags.ts index ab4339b2fef..9ccccb1df5c 100644 --- a/src/@types/arena-tags.ts +++ b/src/@types/arena-tags.ts @@ -1,6 +1,6 @@ import type { ArenaTagTypeMap } from "#data/arena-tag"; import type { ArenaTagType } from "#enums/arena-tag-type"; -import type { NonFunctionProperties } from "./type-helpers"; +import type { NonFunctionProperties } from "#types/type-helpers"; /** Subset of {@linkcode ArenaTagType}s that apply some negative effect to pokemon that switch in ({@link https://bulbapedia.bulbagarden.net/wiki/List_of_moves_that_cause_entry_hazards#List_of_traps | entry hazards} and Imprison. */ export type ArenaTrapTagType = diff --git a/src/@types/enum-types.ts b/src/@types/helpers/enum-types.ts similarity index 68% rename from src/@types/enum-types.ts rename to src/@types/helpers/enum-types.ts index 84df0a96505..2461f900c6b 100644 --- a/src/@types/enum-types.ts +++ b/src/@types/helpers/enum-types.ts @@ -1,18 +1,14 @@ +import type { ObjectValues } from "#types/type-helpers"; + /** Union type accepting any TS Enum or `const object`, with or without reverse mapping. */ export type EnumOrObject = Record; -/** - * Utility type to extract the enum values from a `const object`, - * or convert an `enum` interface produced by `typeof Enum` into the union type representing its values. - */ -export type EnumValues = E[keyof E]; - /** * Generic type constraint representing a TS numeric enum with reverse mappings. * @example * TSNumericEnum */ -export type TSNumericEnum = number extends EnumValues ? T : never; +export type TSNumericEnum = number extends ObjectValues ? T : never; /** Generic type constraint representing a non reverse-mapped TS enum or `const object`. */ export type NormalEnum = Exclude>; diff --git a/src/@types/type-helpers.ts b/src/@types/helpers/type-helpers.ts similarity index 81% rename from src/@types/type-helpers.ts rename to src/@types/helpers/type-helpers.ts index b3e5b1cfc07..37f97fcf08c 100644 --- a/src/@types/type-helpers.ts +++ b/src/@types/helpers/type-helpers.ts @@ -6,8 +6,6 @@ import type { AbAttr } from "#abilities/ability"; // biome-ignore-end lint/correctness/noUnusedImports: Used in a tsdoc comment -import type { EnumValues } from "#types/enum-types"; - /** * Exactly matches the type of the argument, preventing adding additional properties. * @@ -37,16 +35,25 @@ export type Mutable = { }; /** - * Type helper to obtain the keys associated with a given value inside a `const object`. + * Type helper to obtain the keys associated with a given value inside an object. * @typeParam O - The type of the object * @typeParam V - The type of one of O's values */ -export type InferKeys, V extends EnumValues> = { +export type InferKeys> = { [K in keyof O]: O[K] extends V ? K : never; }[keyof O]; /** - * Type helper that matches any `Function` type. Equivalent to `Function`, but will not raise a warning from Biome. + * Utility type to obtain the values of a given object. \ + * Functions similar to `keyof E`, except producing the values instead of the keys. + * @remarks + * This can be used to convert an `enum` interface produced by `typeof Enum` into the union type representing its members. + */ +export type ObjectValues = E[keyof E]; + +/** + * Type helper that matches any `Function` type. + * Equivalent to `Function`, but will not raise a warning from Biome. */ export type AnyFn = (...args: any[]) => any; @@ -65,6 +72,7 @@ export type NonFunctionProperties = { /** * Type helper to extract out non-function properties from a type, recursively applying to nested properties. + * This can be used to mimic the effects of JSON serialization and de-serialization on a given type. */ export type NonFunctionPropertiesRecursive = { [K in keyof Class as Class[K] extends AnyFn ? never : K]: Class[K] extends Array diff --git a/src/@types/modifier-types.ts b/src/@types/modifier-types.ts index 28b39d1a151..13a84a984e2 100644 --- a/src/@types/modifier-types.ts +++ b/src/@types/modifier-types.ts @@ -3,6 +3,7 @@ import type { Pokemon } from "#field/pokemon"; import type { ModifierConstructorMap } from "#modifiers/modifier"; import type { ModifierType, WeightedModifierType } from "#modifiers/modifier-type"; +import type { ObjectValues } from "#types/type-helpers"; export type ModifierTypeFunc = () => ModifierType; export type WeightedModifierTypeWeightFunc = (party: Pokemon[], rerollCount?: number) => number; @@ -19,7 +20,7 @@ export type ModifierInstanceMap = { /** * Union type of all modifier constructors. */ -export type ModifierClass = ModifierConstructorMap[keyof ModifierConstructorMap]; +export type ModifierClass = ObjectValues; /** * Union type of all modifier names as strings. diff --git a/src/@types/phase-types.ts b/src/@types/phase-types.ts index 1d68c7921dd..91673053747 100644 --- a/src/@types/phase-types.ts +++ b/src/@types/phase-types.ts @@ -1,4 +1,5 @@ import type { PhaseConstructorMap } from "#app/phase-manager"; +import type { ObjectValues } from "#types/type-helpers"; // Intentionally export the types of everything in phase-manager, as this file is meant to be // the centralized place for type definitions for the phase system. @@ -17,7 +18,7 @@ export type PhaseMap = { /** * Union type of all phase constructors. */ -export type PhaseClass = PhaseConstructorMap[keyof PhaseConstructorMap]; +export type PhaseClass = ObjectValues; /** * Union type of all phase names as strings. diff --git a/src/enums/ability-attr.ts b/src/enums/ability-attr.ts index 5f7d107f2d1..a3b9511ad02 100644 --- a/src/enums/ability-attr.ts +++ b/src/enums/ability-attr.ts @@ -1,3 +1,5 @@ +import type { ObjectValues } from "#types/type-helpers"; + /** * Not to be confused with an Ability Attribute. * This is an object literal storing the slot that an ability can occupy. @@ -8,4 +10,4 @@ export const AbilityAttr = Object.freeze({ ABILITY_HIDDEN: 4, }); -export type AbilityAttr = typeof AbilityAttr[keyof typeof AbilityAttr]; \ No newline at end of file +export type AbilityAttr = ObjectValues; \ No newline at end of file diff --git a/src/enums/dex-attr.ts b/src/enums/dex-attr.ts index ee5ceb43ef2..1a98167b4a1 100644 --- a/src/enums/dex-attr.ts +++ b/src/enums/dex-attr.ts @@ -1,3 +1,5 @@ +import type { ObjectValues } from "#types/type-helpers"; + export const DexAttr = Object.freeze({ NON_SHINY: 1n, SHINY: 2n, @@ -8,4 +10,4 @@ export const DexAttr = Object.freeze({ VARIANT_3: 64n, DEFAULT_FORM: 128n, }); -export type DexAttr = typeof DexAttr[keyof typeof DexAttr]; +export type DexAttr = ObjectValues; diff --git a/src/enums/gacha-types.ts b/src/enums/gacha-types.ts index cd0bc67eae0..08f147b27b1 100644 --- a/src/enums/gacha-types.ts +++ b/src/enums/gacha-types.ts @@ -1,7 +1,9 @@ +import type { ObjectValues } from "#types/type-helpers"; + export const GachaType = Object.freeze({ MOVE: 0, LEGENDARY: 1, SHINY: 2 }); -export type GachaType = typeof GachaType[keyof typeof GachaType]; +export type GachaType = ObjectValues; diff --git a/src/enums/hit-check-result.ts b/src/enums/hit-check-result.ts index cf8a2b17194..0866050341e 100644 --- a/src/enums/hit-check-result.ts +++ b/src/enums/hit-check-result.ts @@ -1,3 +1,5 @@ +import type { ObjectValues } from "#types/type-helpers"; + /** The result of a hit check calculation */ export const HitCheckResult = { /** Hit checks haven't been evaluated yet in this pass */ @@ -20,4 +22,4 @@ export const HitCheckResult = { ERROR: 8, } as const; -export type HitCheckResult = typeof HitCheckResult[keyof typeof HitCheckResult]; +export type HitCheckResult = ObjectValues; diff --git a/src/utils/enums.ts b/src/utils/enums.ts index 98cb4272ee9..25ee864794c 100644 --- a/src/utils/enums.ts +++ b/src/utils/enums.ts @@ -1,5 +1,5 @@ -import type { EnumOrObject, EnumValues, NormalEnum, TSNumericEnum } from "#app/@types/enum-types"; -import type { InferKeys } from "#app/@types/type-helpers"; +import type { EnumOrObject, NormalEnum, TSNumericEnum } from "#types/enum-types"; +import type { InferKeys, ObjectValues } from "#types/type-helpers"; /** * Return the string keys of an Enum object, excluding reverse-mapped numbers. @@ -61,7 +61,7 @@ export function getEnumValues(enumType: TSNumericEnum * If multiple keys map to the same value, the first one (in insertion order) will be retrieved, * but the return type will be the union of ALL their corresponding keys. */ -export function enumValueToKey>( +export function enumValueToKey>( object: NormalEnum, val: V, ): InferKeys { diff --git a/test/types/enum-types.test-d.ts b/test/types/enum-types.test-d.ts index 396c479e85a..3d03098c2ad 100644 --- a/test/types/enum-types.test-d.ts +++ b/test/types/enum-types.test-d.ts @@ -1,5 +1,6 @@ -import type { EnumOrObject, EnumValues, NormalEnum, TSNumericEnum } from "#app/@types/enum-types"; import type { enumValueToKey, getEnumKeys, getEnumValues } from "#app/utils/enums"; +import type { EnumOrObject, NormalEnum, TSNumericEnum } from "#types/enum-types"; +import type { ObjectValues } from "#types/type-helpers"; import { describe, expectTypeOf, it } from "vitest"; enum testEnumNum { @@ -16,21 +17,33 @@ const testObjNum = { testON1: 1, testON2: 2 } as const; const testObjString = { testOS1: "apple", testOS2: "banana" } as const; -describe("Enum Type Helpers", () => { - describe("EnumValues", () => { - it("should go from enum object type to value type", () => { - expectTypeOf>().toEqualTypeOf(); - expectTypeOf>().branded.toEqualTypeOf<1 | 2>(); +interface testObject { + key_1: "1"; + key_2: "2"; + key_3: "3"; +} - expectTypeOf>().toEqualTypeOf(); - expectTypeOf>().toEqualTypeOf(); - expectTypeOf>().toMatchTypeOf<"apple" | "banana">(); +describe("Enum Type Helpers", () => { + describe("ObjectValues", () => { + it("should produce a union of an object's values", () => { + expectTypeOf>().toEqualTypeOf<"1" | "2" | "3">(); + }); + + it("should go from enum object type to value type", () => { + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().branded.toEqualTypeOf<1 | 2>(); + + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf< + testEnumString.testS1 | testEnumString.testS2 + >(); + + expectTypeOf>().toExtend<"apple" | "banana">(); }); it("should produce union of const object values as type", () => { - expectTypeOf>().toEqualTypeOf<1 | 2>(); - - expectTypeOf>().toEqualTypeOf<"apple" | "banana">(); + expectTypeOf>().toEqualTypeOf<1 | 2>(); + expectTypeOf>().toEqualTypeOf<"apple" | "banana">(); }); }); @@ -38,7 +51,6 @@ describe("Enum Type Helpers", () => { it("should match numeric enums", () => { expectTypeOf>().toEqualTypeOf(); }); - it("should not match string enums or const objects", () => { expectTypeOf>().toBeNever(); expectTypeOf>().toBeNever(); @@ -59,19 +71,19 @@ describe("Enum Type Helpers", () => { describe("EnumOrObject", () => { it("should match any enum or const object", () => { - expectTypeOf().toMatchTypeOf(); - expectTypeOf().toMatchTypeOf(); - expectTypeOf().toMatchTypeOf(); - expectTypeOf().toMatchTypeOf(); + expectTypeOf().toExtend(); + expectTypeOf().toExtend(); + expectTypeOf().toExtend(); + expectTypeOf().toExtend(); }); it("should not match an enum value union w/o typeof", () => { - expectTypeOf().not.toMatchTypeOf(); - expectTypeOf().not.toMatchTypeOf(); + expectTypeOf().not.toExtend(); + expectTypeOf().not.toExtend(); }); it("should be equivalent to `TSNumericEnum | NormalEnum`", () => { - expectTypeOf().branded.toEqualTypeOf | NormalEnum>(); + expectTypeOf().toEqualTypeOf | NormalEnum>(); }); }); }); @@ -80,6 +92,7 @@ describe("Enum Functions", () => { describe("getEnumKeys", () => { it("should retrieve keys of numeric enum", () => { expectTypeOf>().returns.toEqualTypeOf<("testN1" | "testN2")[]>(); + expectTypeOf>().returns.toEqualTypeOf<("testON1" | "testON2")[]>(); }); }); diff --git a/tsconfig.json b/tsconfig.json index 9aa06829789..dcbf7456df8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -49,7 +49,7 @@ "./system/*.ts" ], "#trainers/*": ["./data/trainers/*.ts"], - "#types/*": ["./@types/*.ts", "./typings/phaser/*.ts"], + "#types/*": ["./@types/helpers/*.ts", "./@types/*.ts", "./typings/phaser/*.ts"], "#ui/*": ["./ui/battle-info/*.ts", "./ui/settings/*.ts", "./ui/*.ts"], "#utils/*": ["./utils/*.ts"], "#data/*": ["./data/pokemon-forms/*.ts", "./data/pokemon/*.ts", "./data/*.ts"], From 9475505cd221d87cf3774bae4a1830d1201b4ffa Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Wed, 30 Jul 2025 20:59:14 -0600 Subject: [PATCH 046/106] [Misc] Improve type signatures of serialized arena/battler tags (#6180) * Improve type signatures of serialized arena/battler tags * Minor adjustments to tsdocs from code review Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --------- Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/@types/arena-tags.ts | 9 ++-- src/@types/battler-tags.ts | 9 ++++ src/data/arena-tag.ts | 90 ++++++++++++++++++++++++-------------- src/data/battler-tags.ts | 45 +++++++++++++++---- 4 files changed, 105 insertions(+), 48 deletions(-) diff --git a/src/@types/arena-tags.ts b/src/@types/arena-tags.ts index 9ccccb1df5c..cfdce4350da 100644 --- a/src/@types/arena-tags.ts +++ b/src/@types/arena-tags.ts @@ -1,6 +1,5 @@ import type { ArenaTagTypeMap } from "#data/arena-tag"; import type { ArenaTagType } from "#enums/arena-tag-type"; -import type { NonFunctionProperties } from "#types/type-helpers"; /** Subset of {@linkcode ArenaTagType}s that apply some negative effect to pokemon that switch in ({@link https://bulbapedia.bulbagarden.net/wiki/List_of_moves_that_cause_entry_hazards#List_of_traps | entry hazards} and Imprison. */ export type ArenaTrapTagType = @@ -30,13 +29,13 @@ export type NonSerializableArenaTagType = ArenaTagType.NONE | TurnProtectArenaTa export type SerializableArenaTagType = Exclude; /** - * Type-safe representation of the serializable data of an ArenaTag + * Type-safe representation of an arbitrary, serialized Arena Tag */ -export type ArenaTagTypeData = NonFunctionProperties< +export type ArenaTagTypeData = Parameters< ArenaTagTypeMap[keyof { [K in keyof ArenaTagTypeMap as K extends SerializableArenaTagType ? K : never]: ArenaTagTypeMap[K]; - }] ->; + }]["loadTag"] +>[0]; /** Dummy, typescript-only declaration to ensure that * {@linkcode ArenaTagTypeMap} has a map for all ArenaTagTypes. diff --git a/src/@types/battler-tags.ts b/src/@types/battler-tags.ts index d1ff93e0400..0057280e4e5 100644 --- a/src/@types/battler-tags.ts +++ b/src/@types/battler-tags.ts @@ -108,6 +108,15 @@ export type SerializableBattlerTagType = keyof { */ export type NonSerializableBattlerTagType = Exclude; +/** + * Type-safe representation of an arbitrary, serialized Battler Tag + */ +export type BattlerTagTypeData = Parameters< + BattlerTagTypeMap[keyof { + [K in keyof BattlerTagTypeMap as K extends SerializableBattlerTagType ? K : never]: BattlerTagTypeMap[K]; + }]["loadTag"] +>[0]; + /** * Dummy, typescript-only declaration to ensure that * {@linkcode BattlerTagTypeMap} has an entry for all `BattlerTagType`s. diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 2c4c8a04282..b24fd17e0e3 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -26,38 +26,58 @@ import type { ArenaTrapTagType, SerializableArenaTagType, } from "#types/arena-tags"; -import type { Mutable, NonFunctionProperties } from "#types/type-helpers"; +import type { Mutable } from "#types/type-helpers"; import { BooleanHolder, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common"; import i18next from "i18next"; -/* -ArenaTags are are meant for effects that are tied to the arena (as opposed to a specific pokemon). -Examples include (but are not limited to) -- Cross-turn effects that persist even if the user/target switches out, such as Wish, Future Sight, and Happy Hour -- Effects that are applied to a specific side of the field, such as Crafty Shield, Reflect, and Spikes -- Field-Effects, like Gravity and Trick Room - -Any arena tag that persists across turns *must* extend from `SerializableArenaTag` in the class definition signature. - -Serializable ArenaTags have strict rules for their fields. -These rules ensure that only the data necessary to reconstruct the tag is serialized, and that the -session loader is able to deserialize saved tags correctly. - -If the data is static (i.e. it is always the same for all instances of the class, such as the -type that is weakened by Mud Sport/Water Sport), then it must not be defined as a field, and must -instead be defined as a getter. -A static property is also acceptable, though static properties are less ergonomic with inheritance. - -If the data is mutable (i.e. it can change over the course of the tag's lifetime), then it *must* -be defined as a field, and it must be set in the `loadTag` method. -Such fields cannot be marked as `private/protected`, as if they were, typescript would omit them from -types that are based off of the class, namely, `ArenaTagTypeData`. It is preferrable to trade the -type-safety of private/protected fields for the type safety when deserializing arena tags from save data. - -For data that is mutable only within a turn (e.g. SuppressAbilitiesTag's beingRemoved field), -where it does not make sense to be serialized, the field should use ES2020's private field syntax (a `#` prepended to the field name). -If the field should be accessible outside of the class, then a public getter should be used. -*/ +/** + * @module + * ArenaTags are are meant for effects that are tied to the arena (as opposed to a specific pokemon). + * Examples include (but are not limited to) + * - Cross-turn effects that persist even if the user/target switches out, such as Wish, Future Sight, and Happy Hour + * - Effects that are applied to a specific side of the field, such as Crafty Shield, Reflect, and Spikes + * - Field-Effects, like Gravity and Trick Room + * + * Any arena tag that persists across turns *must* extend from `SerializableArenaTag` in the class definition signature. + * + * Serializable ArenaTags have strict rules for their fields. + * These rules ensure that only the data necessary to reconstruct the tag is serialized, and that the + * session loader is able to deserialize saved tags correctly. + * + * If the data is static (i.e. it is always the same for all instances of the class, such as the + * type that is weakened by Mud Sport/Water Sport), then it must not be defined as a field, and must + * instead be defined as a getter. + * A static property is also acceptable, though static properties are less ergonomic with inheritance. + * + * If the data is mutable (i.e. it can change over the course of the tag's lifetime), then it *must* + * be defined as a field, and it must be set in the `loadTag` method. + * Such fields cannot be marked as `private`/`protected`; if they were, Typescript would omit them from + * types that are based off of the class, namely, `ArenaTagTypeData`. It is preferrable to trade the + * type-safety of private/protected fields for the type safety when deserializing arena tags from save data. + * + * For data that is mutable only within a turn (e.g. SuppressAbilitiesTag's beingRemoved field), + * where it does not make sense to be serialized, the field should use ES2020's + * [private field syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_elements#private_fields). + * If the field should be accessible outside of the class, then a public getter should be used. + * + * If any new serializable fields *are* added, then the class *must* override the + * `loadTag` method to set the new fields. Its signature *must* match the example below, + * ``` + * class ExampleTag extends SerializableArenaTag { + * // Example, if we add 2 new fields that should be serialized: + * public a: string; + * public b: number; + * // Then we must also define a loadTag method with one of the following signatures + * public override loadTag(source: BaseArenaTag & Pick(source: BaseArenaTag & Pick): void; + * public override loadTag(source: NonFunctionProperties): void; + * } + * ``` + * Notes + * - If the class has any subclasses, then the second form of `loadTag` *must* be used. + * - The third form *must not* be used if the class has any getters, as typescript would expect such fields to be + * present in `source`. + */ /** Interface containing the serializable fields of ArenaTagData. */ interface BaseArenaTag { @@ -141,9 +161,9 @@ export abstract class ArenaTag implements BaseArenaTag { /** * When given a arena tag or json representing one, load the data for it. * This is meant to be inherited from by any arena tag with custom attributes - * @param source - The {@linkcode BaseArenaTag} being loaded + * @param source - The arena tag being loaded */ - loadTag(source: BaseArenaTag): void { + loadTag(source: BaseArenaTag & Pick): void { this.turnCount = source.turnCount; this.sourceMove = source.sourceMove; this.sourceId = source.sourceId; @@ -646,7 +666,9 @@ class WishTag extends SerializableArenaTag { } } - override loadTag(source: NonFunctionProperties): void { + public override loadTag( + source: BaseArenaTag & Pick, + ): void { super.loadTag(source); (this as Mutable).battlerIndex = source.battlerIndex; (this as Mutable).healHp = source.healHp; @@ -813,7 +835,7 @@ export abstract class ArenaTrapTag extends SerializableArenaTag { : Phaser.Math.Linear(0, 1 / Math.pow(2, this.layers), Math.min(pokemon.getHpRatio(), 0.5) * 2); } - loadTag(source: NonFunctionProperties): void { + public loadTag(source: BaseArenaTag & Pick): void { super.loadTag(source); this.layers = source.layers; this.maxLayers = source.maxLayers; @@ -1581,7 +1603,7 @@ export class SuppressAbilitiesTag extends SerializableArenaTag { this.#beingRemoved = false; } - public override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: BaseArenaTag & Pick): void { super.loadTag(source); (this as Mutable).sourceCount = source.sourceCount; } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 9dfd43eccb3..e21065c184f 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -69,6 +69,24 @@ import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder * be declared as a public readonly propety. Then, in the `loadTag` method (or any method inside the class that needs to adjust the property) * use `(this as Mutable).propertyName = value;` * These rules ensure that Typescript is aware of the shape of the serialized version of the class. + * + * If any new serializable fields *are* added, then the class *must* override the + * `loadTag` method to set the new fields. Its signature *must* match the example below: + * ``` + * class ExampleTag extends SerializableBattlerTag { + * // Example, if we add 2 new fields that should be serialized: + * public a: string; + * public b: number; + * // Then we must also define a loadTag method with one of the following signatures + * public override loadTag(source: BaseBattlerTag & Pick(source: BaseBattlerTag & Pick): void; + * public override loadTag(source: NonFunctionProperties): void; + * } + * ``` + * Notes + * - If the class has any subclasses, then the second form of `loadTag` *must* be used. + * - The third form *must not* be used if the class has any getters, as typescript would expect such fields to be + * present in `source`. */ /** Interface containing the serializable fields of BattlerTag */ @@ -168,7 +186,7 @@ export class BattlerTag implements BaseBattlerTag { * Should be inherited from by any battler tag with custom attributes. * @param source - An object containing the fields needed to reconstruct this tag. */ - loadTag(source: BaseBattlerTag): void { + public loadTag(source: BaseBattlerTag & Pick): void { this.turnCount = source.turnCount; this.sourceMove = source.sourceMove; this.sourceId = source.sourceId; @@ -386,7 +404,7 @@ export class DisabledTag extends MoveRestrictionBattlerTag { }); } - override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); (this as Mutable).moveId = source.moveId; } @@ -437,7 +455,7 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { * Loads the Gorilla Tactics Battler Tag along with its unique class variable moveId * @param source - Object containing the fields needed to reconstruct this tag. */ - override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); (this as Mutable).moveId = source.moveId; } @@ -971,6 +989,12 @@ export class InfatuatedTag extends SerializableBattlerTag { } } +/** + * Battler tag for the "Seeded" effect applied by {@linkcode MoveId.LEECH_SEED | Leech Seed} and + * {@linkcode MoveId.SAPPY_SEED | Sappy Seed} + * + * @sealed + */ export class SeedTag extends SerializableBattlerTag { public override readonly tagType = BattlerTagType.SEEDED; public readonly sourceIndex: BattlerIndex; @@ -983,7 +1007,7 @@ export class SeedTag extends SerializableBattlerTag { * When given a battler tag or json representing one, load the data for it. * @param source - An object containing the fields needed to reconstruct this tag. */ - override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); (this as Mutable).sourceIndex = source.sourceIndex; } @@ -1194,6 +1218,7 @@ export class FrenzyTag extends SerializableBattlerTag { /** * Applies the effects of {@linkcode MoveId.ENCORE} onto the target Pokemon. * Encore forces the target Pokemon to use its most-recent move for 3 turns. + * @sealed */ export class EncoreTag extends MoveRestrictionBattlerTag { public override readonly tagType = BattlerTagType.ENCORE; @@ -1210,7 +1235,7 @@ export class EncoreTag extends MoveRestrictionBattlerTag { ); } - override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: NonFunctionProperties): void { super.loadTag(source); this.moveId = source.moveId; } @@ -2085,7 +2110,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag { * When given a battler tag or json representing one, load the data for it. * @param source - An object containing the fields needed to reconstruct this tag. */ - loadTag(source: NonFunctionProperties): void { + public override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); this.stat = source.stat as Stat; this.multiplier = source.multiplier; @@ -2564,6 +2589,7 @@ export class IceFaceBlockDamageTag extends FormBlockDamageTag { /** * Battler tag indicating a Tatsugiri with {@link https://bulbapedia.bulbagarden.net/wiki/Commander_(Ability) | Commander} * has entered the tagged Pokemon's mouth. + * @sealed */ export class CommandedTag extends SerializableBattlerTag { public override readonly tagType = BattlerTagType.COMMANDED; @@ -2607,6 +2633,7 @@ export class CommandedTag extends SerializableBattlerTag { * - Stat changes on removal of (all) stacks. * - Removing stacks decreases DEF and SPDEF, independently, by one stage for each stack that successfully changed * the stat when added. + * @sealed */ export class StockpilingTag extends SerializableBattlerTag { public override readonly tagType = BattlerTagType.STOCKPILING; @@ -2632,7 +2659,7 @@ export class StockpilingTag extends SerializableBattlerTag { } }; - override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: NonFunctionProperties): void { super.loadTag(source); this.stockpiledCount = source.stockpiledCount || 0; this.statChangeCounts = { @@ -2979,7 +3006,7 @@ export class AutotomizedTag extends SerializableBattlerTag { this.onAdd(pokemon); } - loadTag(source: NonFunctionProperties): void { + public override loadTag(source: NonFunctionProperties): void { super.loadTag(source); this.autotomizeCount = source.autotomizeCount; } @@ -3129,7 +3156,7 @@ export class SubstituteTag extends SerializableBattlerTag { * When given a battler tag or json representing one, load the data for it. * @param source - An object containing the necessary properties to load the tag */ - override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); this.hp = source.hp; } From 12acaa959048e0604fe3529a3be2ba0f53bf8184 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Wed, 30 Jul 2025 23:55:52 -0400 Subject: [PATCH 047/106] [Balance] Updated SF/Triage interactions for moves (#6179) * Fixed move flags * Disabled order up interactionn with sheer force * Update src/data/moves/move.ts * Removed order up test that no longer applies shouldn't have been there in the first place --- src/data/moves/move.ts | 24 ++++++++++++------------ src/enums/move-flags.ts | 14 +++++++++----- test/moves/order-up.test.ts | 19 ------------------- 3 files changed, 21 insertions(+), 36 deletions(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index e6673f31826..8557768bc03 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -423,9 +423,8 @@ export abstract class Move implements Localizable { /** * Sets the {@linkcode MoveFlags.MAKES_CONTACT} flag for the calling Move - * @param setFlag Default `true`, set to `false` if the move doesn't make contact - * @see {@linkcode AbilityId.STATIC} - * @returns The {@linkcode Move} that called this function + * @param setFlag - Whether the move should make contact; default `true` + * @returns `this` */ makesContact(setFlag: boolean = true): this { this.setFlag(MoveFlags.MAKES_CONTACT, setFlag); @@ -3576,8 +3575,7 @@ export class CutHpStatStageBoostAttr extends StatStageChangeAttr { /** * Attribute implementing the stat boosting effect of {@link https://bulbapedia.bulbagarden.net/wiki/Order_Up_(move) | Order Up}. * If the user has a Pokemon with {@link https://bulbapedia.bulbagarden.net/wiki/Commander_(Ability) | Commander} in their mouth, - * one of the user's stats are increased by 1 stage, depending on the "commanding" Pokemon's form. This effect does not respect - * effect chance, but Order Up itself may be boosted by Sheer Force. + * one of the user's stats are increased by 1 stage, depending on the "commanding" Pokemon's form. */ export class OrderUpStatBoostAttr extends MoveEffectAttr { constructor() { @@ -9228,7 +9226,7 @@ export function initMoves() { new SelfStatusMove(MoveId.STOCKPILE, PokemonType.NORMAL, -1, 20, -1, 0, 3) .condition(user => (user.getTag(StockpilingTag)?.stockpiledCount ?? 0) < 3) .attr(AddBattlerTagAttr, BattlerTagType.STOCKPILING, true), - new AttackMove(MoveId.SPIT_UP, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, -1, 10, -1, 0, 3) + new AttackMove(MoveId.SPIT_UP, PokemonType.NORMAL, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 3) .condition(hasStockpileStacksCondition) .attr(SpitUpPowerAttr, 100) .attr(RemoveBattlerTagAttr, [ BattlerTagType.STOCKPILING ], true), @@ -9471,7 +9469,7 @@ export function initMoves() { new AttackMove(MoveId.SAND_TOMB, PokemonType.GROUND, MoveCategory.PHYSICAL, 35, 85, 15, -1, 0, 3) .attr(TrapAttr, BattlerTagType.SAND_TOMB) .makesContact(false), - new AttackMove(MoveId.SHEER_COLD, PokemonType.ICE, MoveCategory.SPECIAL, 200, 20, 5, -1, 0, 3) + new AttackMove(MoveId.SHEER_COLD, PokemonType.ICE, MoveCategory.SPECIAL, 200, 30, 5, -1, 0, 3) .attr(IceNoEffectTypeAttr) .attr(OneHitKOAttr) .attr(SheerColdAccuracyAttr), @@ -10393,7 +10391,7 @@ export function initMoves() { .attr(RemoveBattlerTagAttr, [ BattlerTagType.FLYING, BattlerTagType.FLOATING, BattlerTagType.TELEKINESIS ]) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(MoveId.THOUSAND_WAVES, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + new AttackMove(MoveId.THOUSAND_WAVES, PokemonType.GROUND, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 6) .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), @@ -10928,7 +10926,8 @@ export function initMoves() { new StatusMove(MoveId.LIFE_DEW, PokemonType.WATER, -1, 10, -1, 0, 8) .attr(HealAttr, 0.25, true, false) .target(MoveTarget.USER_AND_ALLIES) - .ignoresProtect(), + .ignoresProtect() + .triageMove(), new SelfStatusMove(MoveId.OBSTRUCT, PokemonType.DARK, 100, 10, -1, 4, 8) .attr(ProtectAttr, BattlerTagType.OBSTRUCT) .condition(failIfLastCondition), @@ -11006,7 +11005,8 @@ export function initMoves() { new StatusMove(MoveId.JUNGLE_HEALING, PokemonType.GRASS, -1, 10, -1, 0, 8) .attr(HealAttr, 0.25, true, false) .attr(HealStatusEffectAttr, false, getNonVolatileStatusEffects()) - .target(MoveTarget.USER_AND_ALLIES), + .target(MoveTarget.USER_AND_ALLIES) + .triageMove(), new AttackMove(MoveId.WICKED_BLOW, PokemonType.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8) .attr(CritOnlyAttr) .punchingMove(), @@ -11234,7 +11234,7 @@ export function initMoves() { .makesContact(false), new AttackMove(MoveId.LUMINA_CRASH, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2), - new AttackMove(MoveId.ORDER_UP, PokemonType.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9) + new AttackMove(MoveId.ORDER_UP, PokemonType.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 9) .attr(OrderUpStatBoostAttr) .makesContact(false), new AttackMove(MoveId.JET_PUNCH, PokemonType.WATER, MoveCategory.PHYSICAL, 60, 100, 15, -1, 1, 9) @@ -11417,7 +11417,7 @@ export function initMoves() { .attr(IvyCudgelTypeAttr) .attr(HighCritAttr) .makesContact(false), - new ChargingAttackMove(MoveId.ELECTRO_SHOT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 130, 100, 10, 100, 0, 9) + new ChargingAttackMove(MoveId.ELECTRO_SHOT, PokemonType.ELECTRIC, MoveCategory.SPECIAL, 130, 100, 10, -1, 0, 9) .chargeText(i18next.t("moveTriggers:absorbedElectricity", { pokemonName: "{USER}" })) .chargeAttr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.RAIN, WeatherType.HEAVY_RAIN ]), diff --git a/src/enums/move-flags.ts b/src/enums/move-flags.ts index 06de265df09..6cdc1e5f8cc 100644 --- a/src/enums/move-flags.ts +++ b/src/enums/move-flags.ts @@ -4,15 +4,19 @@ */ export enum MoveFlags { NONE = 0, + /** + * Whether the move makes contact. + * Set by default on all contact moves, and unset by default on all special moves. + */ MAKES_CONTACT = 1 << 0, IGNORE_PROTECT = 1 << 1, /** * Sound-based moves have the following effects: - * - Pokemon with the {@linkcode AbilityId.SOUNDPROOF Soundproof Ability} are unaffected by other Pokemon's sound-based moves. - * - Pokemon affected by {@linkcode MoveId.THROAT_CHOP Throat Chop} cannot use sound-based moves for two turns. - * - Sound-based moves used by a Pokemon with {@linkcode AbilityId.LIQUID_VOICE Liquid Voice} become Water-type moves. - * - Sound-based moves used by a Pokemon with {@linkcode AbilityId.PUNK_ROCK Punk Rock} are boosted by 30%. Pokemon with Punk Rock also take half damage from sound-based moves. - * - All sound-based moves (except Howl) can hit Pokemon behind an active {@linkcode MoveId.SUBSTITUTE Substitute}. + * - Pokemon with the {@linkcode AbilityId.SOUNDPROOF | Soundproof} Ability are unaffected by other Pokemon's sound-based moves. + * - Pokemon affected by {@linkcode MoveId.THROAT_CHOP | Throat Chop} cannot use sound-based moves for two turns. + * - Sound-based moves used by a Pokemon with {@linkcode AbilityId.LIQUID_VOICE | Liquid Voice} become Water-type moves. + * - Sound-based moves used by a Pokemon with {@linkcode AbilityId.PUNK_ROCK | Punk Rock} are boosted by 30%. Pokemon with Punk Rock also take half damage from sound-based moves. + * - All sound-based moves (except Howl) can hit Pokemon behind an active {@linkcode MoveId.SUBSTITUTE | Substitute}. * * cf https://bulbapedia.bulbagarden.net/wiki/Sound-based_move */ diff --git a/test/moves/order-up.test.ts b/test/moves/order-up.test.ts index 2e77d4b2fa7..2da7cc5daf8 100644 --- a/test/moves/order-up.test.ts +++ b/test/moves/order-up.test.ts @@ -65,23 +65,4 @@ describe("Moves - Order Up", () => { affectedStats.forEach(st => expect(dondozo.getStatStage(st)).toBe(st === stat ? 3 : 2)); }, ); - - it("should be boosted by Sheer Force while still applying a stat boost", async () => { - game.override.passiveAbility(AbilityId.SHEER_FORCE).starterForms({ [SpeciesId.TATSUGIRI]: 0 }); - - await game.classicMode.startBattle([SpeciesId.TATSUGIRI, SpeciesId.DONDOZO]); - - const [tatsugiri, dondozo] = game.scene.getPlayerField(); - - expect(game.scene.triggerPokemonBattleAnim).toHaveBeenLastCalledWith(tatsugiri, PokemonAnimType.COMMANDER_APPLY); - expect(dondozo.getTag(BattlerTagType.COMMANDED)).toBeDefined(); - - game.move.select(MoveId.ORDER_UP, 1, BattlerIndex.ENEMY); - expect(game.scene.currentBattle.turnCommands[0]?.skip).toBeTruthy(); - - await game.phaseInterceptor.to("BerryPhase", false); - - expect(dondozo.waveData.abilitiesApplied.has(AbilityId.SHEER_FORCE)).toBeTruthy(); - expect(dondozo.getStatStage(Stat.ATK)).toBe(3); - }); }); From f7b87f3d1e330f4fa20c85fc116f5021b4ce60ab Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Thu, 31 Jul 2025 00:43:06 -0400 Subject: [PATCH 048/106] [Move Bug] Fully implemented Future Sight, Doom Desire; fixed Wish Double battle oversight (#5862) * Mostly implemented Future Sight/Doom Desire * Fixed a few docs * Fixed com * Update magic_guard.test.ts * Update documentation * Update documentation on arena-tag.ts * Update arena-tag.ts docs * Update arena-tag.ts * Update turn-end-phase.ts * Update move.ts documentation * Fixed tpyo * Update move.ts documentation * Add assorted TODO test cases * Refactored FS to use a positional tag manager * Added strong typing to the manager, finished save load stufff * Fixed locales + tests * Fixed tests and documentation * sh Fixed tests for good * Fixed MEP * Reverted overrides changse * Fixed issues with merging * Fixed locales update & heal block test * Fixed wish tests * Fixed test typo * Fixed wish test flaking out due to speed ties * Fixed tests fr fr * actually fixed tests bc i'm stupid * Fixed tests for real * Remove locales update * Update arena-tag.ts Co-authored-by: Dean <69436131+emdeann@users.noreply.github.com> * Update move.ts Co-authored-by: Dean <69436131+emdeann@users.noreply.github.com> * Update arena-tag.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Applied review suggestions and added a _wee_ bit more docs * fixed wish condition * Applied kev's reviews * Minor nits * Minor formatting change in `heal-block.test.ts` --------- Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Co-authored-by: Dean <69436131+emdeann@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/@types/arena-tags.ts | 3 - src/data/arena-tag.ts | 128 +----- src/data/moves/move.ts | 134 ++++-- .../positional-tags/load-positional-tag.ts | 70 ++++ .../positional-tags/positional-tag-manager.ts | 55 +++ src/data/positional-tags/positional-tag.ts | 174 ++++++++ src/enums/arena-tag-type.ts | 3 - src/enums/move-use-mode.ts | 79 ++-- src/enums/positional-tag-type.ts | 10 + src/field/arena.ts | 51 ++- src/phase-manager.ts | 2 + src/phases/move-effect-phase.ts | 33 +- src/phases/move-phase.ts | 17 - src/phases/positional-tag-phase.ts | 21 + src/phases/turn-start-phase.ts | 4 + src/system/arena-data.ts | 7 + src/system/game-data.ts | 5 + test/moves/delayed-attack.test.ts | 389 ++++++++++++++++++ test/moves/future-sight.test.ts | 45 -- test/moves/heal-block.test.ts | 26 +- test/moves/wish.test.ts | 183 ++++++++ test/test-utils/helpers/field-helper.ts | 12 +- test/test-utils/helpers/move-helper.ts | 12 +- test/test-utils/phase-interceptor.ts | 2 + test/types/positional-tags.test-d.ts | 29 ++ 25 files changed, 1175 insertions(+), 319 deletions(-) create mode 100644 src/data/positional-tags/load-positional-tag.ts create mode 100644 src/data/positional-tags/positional-tag-manager.ts create mode 100644 src/data/positional-tags/positional-tag.ts create mode 100644 src/enums/positional-tag-type.ts create mode 100644 src/phases/positional-tag-phase.ts create mode 100644 test/moves/delayed-attack.test.ts delete mode 100644 test/moves/future-sight.test.ts create mode 100644 test/moves/wish.test.ts create mode 100644 test/types/positional-tags.test-d.ts diff --git a/src/@types/arena-tags.ts b/src/@types/arena-tags.ts index cfdce4350da..afcc8a0f924 100644 --- a/src/@types/arena-tags.ts +++ b/src/@types/arena-tags.ts @@ -9,9 +9,6 @@ export type ArenaTrapTagType = | ArenaTagType.STEALTH_ROCK | ArenaTagType.IMPRISON; -/** Subset of {@linkcode ArenaTagType}s that are considered delayed attacks */ -export type ArenaDelayedAttackTagType = ArenaTagType.FUTURE_SIGHT | ArenaTagType.DOOM_DESIRE; - /** Subset of {@linkcode ArenaTagType}s that create {@link https://bulbapedia.bulbagarden.net/wiki/Category:Screen-creating_moves | screens}. */ export type ArenaScreenTagType = ArenaTagType.REFLECT | ArenaTagType.LIGHT_SCREEN | ArenaTagType.AURORA_VEIL; diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index b24fd17e0e3..9f2a5e09667 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1,3 +1,7 @@ +/** biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports */ +import type { BattlerTag } from "#app/data/battler-tags"; +/** biome-ignore-end lint/correctness/noUnusedImports: TSDoc imports */ + import { applyAbAttrs, applyOnGainAbAttrs, applyOnLoseAbAttrs } from "#abilities/apply-ab-attrs"; import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; @@ -6,35 +10,32 @@ import { allMoves } from "#data/data-lists"; import { AbilityId } from "#enums/ability-id"; import { ArenaTagSide } from "#enums/arena-tag-side"; import { ArenaTagType } from "#enums/arena-tag-type"; -import type { BattlerIndex } from "#enums/battler-index"; import { BattlerTagType } from "#enums/battler-tag-type"; import { HitResult } from "#enums/hit-result"; import { CommonAnim } from "#enums/move-anims-common"; import { MoveCategory } from "#enums/move-category"; import { MoveId } from "#enums/move-id"; import { MoveTarget } from "#enums/move-target"; -import { MoveUseMode } from "#enums/move-use-mode"; import { PokemonType } from "#enums/pokemon-type"; import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; import type { Arena } from "#field/arena"; import type { Pokemon } from "#field/pokemon"; import type { - ArenaDelayedAttackTagType, ArenaScreenTagType, ArenaTagTypeData, ArenaTrapTagType, SerializableArenaTagType, } from "#types/arena-tags"; import type { Mutable } from "#types/type-helpers"; -import { BooleanHolder, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common"; +import { BooleanHolder, NumberHolder, toDmgValue } from "#utils/common"; import i18next from "i18next"; /** * @module * ArenaTags are are meant for effects that are tied to the arena (as opposed to a specific pokemon). * Examples include (but are not limited to) - * - Cross-turn effects that persist even if the user/target switches out, such as Wish, Future Sight, and Happy Hour + * - Cross-turn effects that persist even if the user/target switches out, such as Happy Hour * - Effects that are applied to a specific side of the field, such as Crafty Shield, Reflect, and Spikes * - Field-Effects, like Gravity and Trick Room * @@ -624,58 +625,6 @@ export class NoCritTag extends SerializableArenaTag { } } -/** - * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Wish_(move) | Wish}. - * Heals the Pokémon in the user's position the turn after Wish is used. - */ -class WishTag extends SerializableArenaTag { - // The following fields are meant to be inwardly mutable, but outwardly immutable. - readonly battlerIndex: BattlerIndex; - readonly healHp: number; - readonly sourceName: string; - // End inwardly mutable fields - - public readonly tagType = ArenaTagType.WISH; - - constructor(turnCount: number, sourceId: number | undefined, side: ArenaTagSide) { - super(turnCount, MoveId.WISH, sourceId, side); - } - - onAdd(_arena: Arena): void { - const source = this.getSourcePokemon(); - if (!source) { - console.warn(`Failed to get source Pokemon for WishTag on add message; id: ${this.sourceId}`); - return; - } - - (this as Mutable).sourceName = getPokemonNameWithAffix(source); - (this as Mutable).healHp = toDmgValue(source.getMaxHp() / 2); - (this as Mutable).battlerIndex = source.getBattlerIndex(); - } - - onRemove(_arena: Arena): void { - const target = globalScene.getField()[this.battlerIndex]; - if (target?.isActive(true)) { - globalScene.phaseManager.queueMessage( - // TODO: Rename key as it triggers on activation - i18next.t("arenaTag:wishTagOnAdd", { - pokemonNameWithAffix: this.sourceName, - }), - ); - globalScene.phaseManager.unshiftNew("PokemonHealPhase", target.getBattlerIndex(), this.healHp, null, true, false); - } - } - - public override loadTag( - source: BaseArenaTag & Pick, - ): void { - super.loadTag(source); - (this as Mutable).battlerIndex = source.battlerIndex; - (this as Mutable).healHp = source.healHp; - (this as Mutable).sourceName = source.sourceName; - } -} - /** * Abstract class to implement weakened moves of a specific type. */ @@ -1148,48 +1097,6 @@ class StickyWebTag extends ArenaTrapTag { } } -/** - * Arena Tag class for delayed attacks, such as {@linkcode MoveId.FUTURE_SIGHT} or {@linkcode MoveId.DOOM_DESIRE}. - * Delays the attack's effect by a set amount of turns, usually 3 (including the turn the move is used), - * and deals damage after the turn count is reached. - */ -export class DelayedAttackTag extends SerializableArenaTag { - public targetIndex: BattlerIndex; - public readonly tagType: ArenaDelayedAttackTagType; - - constructor( - tagType: ArenaTagType.DOOM_DESIRE | ArenaTagType.FUTURE_SIGHT, - sourceMove: MoveId | undefined, - sourceId: number | undefined, - targetIndex: BattlerIndex, - side: ArenaTagSide = ArenaTagSide.BOTH, - ) { - super(3, sourceMove, sourceId, side); - this.tagType = tagType; - this.targetIndex = targetIndex; - this.side = side; - } - - lapse(arena: Arena): boolean { - const ret = super.lapse(arena); - - if (!ret) { - // TODO: This should not add to move history (for Spite) - globalScene.phaseManager.unshiftNew( - "MoveEffectPhase", - this.sourceId!, - [this.targetIndex], - allMoves[this.sourceMove!], - MoveUseMode.FOLLOW_UP, - ); // TODO: are those bangs correct? - } - - return ret; - } - - onRemove(_arena: Arena): void {} -} - /** * Arena Tag class for {@link https://bulbapedia.bulbagarden.net/wiki/Trick_Room_(move) Trick Room}. * Reverses the Speed stats for all Pokémon on the field as long as this arena tag is up, @@ -1685,7 +1592,6 @@ export function getArenaTag( turnCount: number, sourceMove: MoveId | undefined, sourceId: number | undefined, - targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH, ): ArenaTag | null { switch (tagType) { @@ -1711,14 +1617,6 @@ export function getArenaTag( return new SpikesTag(sourceId, side); case ArenaTagType.TOXIC_SPIKES: return new ToxicSpikesTag(sourceId, side); - case ArenaTagType.FUTURE_SIGHT: - case ArenaTagType.DOOM_DESIRE: - if (isNullOrUndefined(targetIndex)) { - return null; // If missing target index, no tag is created - } - return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex, side); - case ArenaTagType.WISH: - return new WishTag(turnCount, sourceId, side); case ArenaTagType.STEALTH_ROCK: return new StealthRockTag(sourceId, side); case ArenaTagType.STICKY_WEB: @@ -1761,16 +1659,9 @@ export function getArenaTag( * @param source - An arena tag * @returns The valid arena tag */ -export function loadArenaTag(source: (ArenaTag | ArenaTagTypeData) & { targetIndex?: BattlerIndex }): ArenaTag { +export function loadArenaTag(source: ArenaTag | ArenaTagTypeData): ArenaTag { const tag = - getArenaTag( - source.tagType, - source.turnCount, - source.sourceMove, - source.sourceId, - source.targetIndex, - source.side, - ) ?? new NoneTag(); + getArenaTag(source.tagType, source.turnCount, source.sourceMove, source.sourceId, source.side) ?? new NoneTag(); tag.loadTag(source); return tag; } @@ -1787,9 +1678,6 @@ export type ArenaTagTypeMap = { [ArenaTagType.CRAFTY_SHIELD]: CraftyShieldTag; [ArenaTagType.NO_CRIT]: NoCritTag; [ArenaTagType.TOXIC_SPIKES]: ToxicSpikesTag; - [ArenaTagType.FUTURE_SIGHT]: DelayedAttackTag; - [ArenaTagType.DOOM_DESIRE]: DelayedAttackTag; - [ArenaTagType.WISH]: WishTag; [ArenaTagType.STEALTH_ROCK]: StealthRockTag; [ArenaTagType.STICKY_WEB]: StickyWebTag; [ArenaTagType.TRICK_ROOM]: TrickRoomTag; diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 8557768bc03..bde5f2977d8 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -25,6 +25,7 @@ import { getBerryEffectFunc } from "#data/berry"; import { applyChallenges } from "#data/challenge"; import { allAbilities, allMoves } from "#data/data-lists"; import { SpeciesFormChangeRevertWeatherFormTrigger } from "#data/form-change-triggers"; +import { DelayedAttackTag } from "#data/positional-tags/positional-tag"; import { getNonVolatileStatusEffects, getStatusEffectHealText, @@ -54,6 +55,7 @@ import { MoveFlags } from "#enums/move-flags"; import { MoveTarget } from "#enums/move-target"; import { MultiHitType } from "#enums/multi-hit-type"; import { PokemonType } from "#enums/pokemon-type"; +import { PositionalTagType } from "#enums/positional-tag-type"; import { SpeciesId } from "#enums/species-id"; import { BATTLE_STATS, @@ -3122,54 +3124,110 @@ export class OverrideMoveEffectAttr extends MoveAttr { * Its sole purpose is to ensure that typescript is able to properly narrow when the `is` method is called. */ declare private _: never; - override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + /** + * Apply the move attribute to override other effects of this move. + * @param user - The {@linkcode Pokemon} using the move + * @param target - The {@linkcode Pokemon} targeted by the move + * @param move - The {@linkcode Move} being used + * @param args - + * `[0]`: A {@linkcode BooleanHolder} containing whether move effects were successfully overridden; should be set to `true` on success \ + * `[1]`: The {@linkcode MoveUseMode} dictating how this move was used. + * @returns `true` if the move effect was successfully overridden. + */ + public override apply(_user: Pokemon, _target: Pokemon, _move: Move, _args: [overridden: BooleanHolder, useMode: MoveUseMode]): boolean { return true; } } +/** Abstract class for moves that add {@linkcode PositionalTag}s to the field. */ +abstract class AddPositionalTagAttr extends OverrideMoveEffectAttr { + protected abstract readonly tagType: PositionalTagType; + + public override getCondition(): MoveConditionFunc { + // Check the arena if another similar positional tag is active and affecting the same slot + return (_user, target, move) => globalScene.arena.positionalTagManager.canAddTag(this.tagType, target.getBattlerIndex()) + } +} + /** - * Attack Move that doesn't hit the turn it is played and doesn't allow for multiple - * uses on the same target. Examples are Future Sight or Doom Desire. - * @extends OverrideMoveEffectAttr - * @param tagType The {@linkcode ArenaTagType} that will be placed on the field when the move is used - * @param chargeAnim The {@linkcode ChargeAnim | Charging Animation} used for the move - * @param chargeText The text to display when the move is used + * Attribute to implement delayed attacks, such as {@linkcode MoveId.FUTURE_SIGHT} or {@linkcode MoveId.DOOM_DESIRE}. + * Delays the attack's effect with a {@linkcode DelayedAttackTag}, + * activating against the given slot after the given turn count has elapsed. */ export class DelayedAttackAttr extends OverrideMoveEffectAttr { - public tagType: ArenaTagType; public chargeAnim: ChargeAnim; private chargeText: string; - constructor(tagType: ArenaTagType, chargeAnim: ChargeAnim, chargeText: string) { + /** + * @param chargeAnim - The {@linkcode ChargeAnim | charging animation} used for the move's charging phase. + * @param chargeKey - The `i18next` locales **key** to show when the delayed attack is used. + * In the displayed text, `{{pokemonName}}` will be populated with the user's name. + */ + constructor(chargeAnim: ChargeAnim, chargeKey: string) { super(); - this.tagType = tagType; this.chargeAnim = chargeAnim; - this.chargeText = chargeText; + this.chargeText = chargeKey; } - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - // Edge case for the move applied on a pokemon that has fainted - if (!target) { - return true; + public override apply(user: Pokemon, target: Pokemon, move: Move, args: [overridden: BooleanHolder, useMode: MoveUseMode]): boolean { + const useMode = args[1]; + if (useMode === MoveUseMode.DELAYED_ATTACK) { + // don't trigger if already queueing an indirect attack + return false; } - const overridden = args[0] as BooleanHolder; - const virtual = args[1] as boolean; + const overridden = args[0]; + overridden.value = true; - if (!virtual) { - overridden.value = true; - globalScene.phaseManager.unshiftNew("MoveAnimPhase", new MoveChargeAnim(this.chargeAnim, move.id, user)); - globalScene.phaseManager.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); - user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER, useMode: MoveUseMode.NORMAL }); - const side = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - globalScene.arena.addTag(this.tagType, 3, move.id, user.id, side, false, target.getBattlerIndex()); - } else { - globalScene.phaseManager.queueMessage(i18next.t("moveTriggers:tookMoveAttack", { pokemonName: getPokemonNameWithAffix(globalScene.getPokemonById(target.id) ?? undefined), moveName: move.name })); - } + // Display the move animation to foresee an attack + globalScene.phaseManager.unshiftNew("MoveAnimPhase", new MoveChargeAnim(this.chargeAnim, move.id, user)); + globalScene.phaseManager.queueMessage( + i18next.t( + this.chargeText, + { pokemonName: getPokemonNameWithAffix(user) } + ) + ) + user.pushMoveHistory({move: move.id, targets: [target.getBattlerIndex()], result: MoveResult.OTHER, useMode, turn: globalScene.currentBattle.turn}) + user.pushMoveHistory({move: move.id, targets: [target.getBattlerIndex()], result: MoveResult.OTHER, useMode, turn: globalScene.currentBattle.turn}) + // Queue up an attack on the given slot. + globalScene.arena.positionalTagManager.addTag({ + tagType: PositionalTagType.DELAYED_ATTACK, + sourceId: user.id, + targetIndex: target.getBattlerIndex(), + sourceMove: move.id, + turnCount: 3 + }) return true; } + + public override getCondition(): MoveConditionFunc { + // Check the arena if another similar attack is active and affecting the same slot + return (_user, target) => globalScene.arena.positionalTagManager.canAddTag(PositionalTagType.DELAYED_ATTACK, target.getBattlerIndex()) + } +} + +/** + * Attribute to queue a {@linkcode WishTag} to activate in 2 turns. + * The tag whill heal + */ +export class WishAttr extends MoveEffectAttr { + public override apply(user: Pokemon, target: Pokemon, _move: Move): boolean { + globalScene.arena.positionalTagManager.addTag({ + tagType: PositionalTagType.WISH, + healHp: toDmgValue(user.getMaxHp() / 2), + targetIndex: target.getBattlerIndex(), + turnCount: 2, + pokemonName: getPokemonNameWithAffix(user), + }); + return true; + } + + public override getCondition(): MoveConditionFunc { + // Check the arena if another wish is active and affecting the same slot + return (_user, target) => globalScene.arena.positionalTagManager.canAddTag(PositionalTagType.WISH, target.getBattlerIndex()) + } } /** @@ -3187,8 +3245,8 @@ export class AwaitCombinedPledgeAttr extends OverrideMoveEffectAttr { * @param user the {@linkcode Pokemon} using this move * @param target n/a * @param move the {@linkcode Move} being used - * @param args - * - [0] a {@linkcode BooleanHolder} indicating whether the move's base + * @param args - + * `[0]`: A {@linkcode BooleanHolder} indicating whether the move's base * effects should be overridden this turn. * @returns `true` if base move effects were overridden; `false` otherwise */ @@ -9203,9 +9261,12 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1) .ballBombMove(), new AttackMove(MoveId.FUTURE_SIGHT, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2) - .partial() // cannot be used on multiple Pokemon on the same side in a double battle, hits immediately when called by Metronome/etc, should not apply abilities or held items if user is off the field + .attr(DelayedAttackAttr, ChargeAnim.FUTURE_SIGHT_CHARGING, "moveTriggers:foresawAnAttack") .ignoresProtect() - .attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, i18next.t("moveTriggers:foresawAnAttack", { pokemonName: "{USER}" })), + /* + * Should not apply abilities or held items if user is off the field + */ + .edgeCase(), new AttackMove(MoveId.ROCK_SMASH, PokemonType.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 15, 50, 0, 2) .attr(StatStageChangeAttr, [ Stat.DEF ], -1), new AttackMove(MoveId.WHIRLPOOL, PokemonType.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2) @@ -9291,8 +9352,8 @@ export function initMoves() { .ignoresSubstitute() .attr(AbilityCopyAttr), new SelfStatusMove(MoveId.WISH, PokemonType.NORMAL, -1, 10, -1, 0, 3) - .triageMove() - .attr(AddArenaTagAttr, ArenaTagType.WISH, 2, true), + .attr(WishAttr) + .triageMove(), new SelfStatusMove(MoveId.ASSIST, PokemonType.NORMAL, -1, 20, -1, 0, 3) .attr(RandomMovesetMoveAttr, invalidAssistMoves, true), new SelfStatusMove(MoveId.INGRAIN, PokemonType.GRASS, -1, 20, -1, 0, 3) @@ -9541,9 +9602,12 @@ export function initMoves() { .attr(ConfuseAttr) .pulseMove(), new AttackMove(MoveId.DOOM_DESIRE, PokemonType.STEEL, MoveCategory.SPECIAL, 140, 100, 5, -1, 0, 3) - .partial() // cannot be used on multiple Pokemon on the same side in a double battle, hits immediately when called by Metronome/etc, should not apply abilities or held items if user is off the field + .attr(DelayedAttackAttr, ChargeAnim.DOOM_DESIRE_CHARGING, "moveTriggers:choseDoomDesireAsDestiny") .ignoresProtect() - .attr(DelayedAttackAttr, ArenaTagType.DOOM_DESIRE, ChargeAnim.DOOM_DESIRE_CHARGING, i18next.t("moveTriggers:choseDoomDesireAsDestiny", { pokemonName: "{USER}" })), + /* + * Should not apply abilities or held items if user is off the field + */ + .edgeCase(), new AttackMove(MoveId.PSYCHO_BOOST, PokemonType.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true), new SelfStatusMove(MoveId.ROOST, PokemonType.FLYING, -1, 5, -1, 0, 4) diff --git a/src/data/positional-tags/load-positional-tag.ts b/src/data/positional-tags/load-positional-tag.ts new file mode 100644 index 00000000000..ef3609d93e7 --- /dev/null +++ b/src/data/positional-tags/load-positional-tag.ts @@ -0,0 +1,70 @@ +import { DelayedAttackTag, type PositionalTag, WishTag } from "#data/positional-tags/positional-tag"; +import { PositionalTagType } from "#enums/positional-tag-type"; +import type { ObjectValues } from "#types/type-helpers"; +import type { Constructor } from "#utils/common"; + +/** + * Load the attributes of a {@linkcode PositionalTag}. + * @param tagType - The {@linkcode PositionalTagType} to create + * @param args - The arguments needed to instantize the given tag + * @returns The newly created tag. + * @remarks + * This function does not perform any checking if the added tag is valid. + */ +export function loadPositionalTag({ + tagType, + ...args +}: serializedPosTagMap[T]): posTagInstanceMap[T]; +/** + * Load the attributes of a {@linkcode PositionalTag}. + * @param tag - The {@linkcode SerializedPositionalTag} to instantiate + * @returns The newly created tag. + * @remarks + * This function does not perform any checking if the added tag is valid. + */ +export function loadPositionalTag(tag: SerializedPositionalTag): PositionalTag; +export function loadPositionalTag({ + tagType, + ...rest +}: serializedPosTagMap[T]): posTagInstanceMap[T] { + // Note: We need 2 type assertions here: + // 1 because TS doesn't narrow the type of TagClass correctly based on `T`. + // It converts it into `new (DelayedAttackTag | WishTag) => DelayedAttackTag & WishTag` + const tagClass = posTagConstructorMap[tagType] as new (args: posTagParamMap[T]) => posTagInstanceMap[T]; + // 2 because TS doesn't narrow the type of `rest` correctly + // (from `Omit into `posTagParamMap[T]`) + return new tagClass(rest as unknown as posTagParamMap[T]); +} + +/** Const object mapping tag types to their constructors. */ +const posTagConstructorMap = Object.freeze({ + [PositionalTagType.DELAYED_ATTACK]: DelayedAttackTag, + [PositionalTagType.WISH]: WishTag, +}) satisfies { + // NB: This `satisfies` block ensures that all tag types have corresponding entries in the map. + [k in PositionalTagType]: Constructor; +}; + +/** Type mapping positional tag types to their constructors. */ +type posTagMap = typeof posTagConstructorMap; + +/** Type mapping all positional tag types to their instances. */ +type posTagInstanceMap = { + [k in PositionalTagType]: InstanceType; +}; + +/** Type mapping all positional tag types to their constructors' parameters. */ +type posTagParamMap = { + [k in PositionalTagType]: ConstructorParameters[0]; +}; + +/** + * Type mapping all positional tag types to their constructors' parameters, alongside the `tagType` selector. + * Equivalent to their serialized representations. + */ +export type serializedPosTagMap = { + [k in PositionalTagType]: posTagParamMap[k] & { tagType: k }; +}; + +/** Union type containing all serialized {@linkcode PositionalTag}s. */ +export type SerializedPositionalTag = ObjectValues; diff --git a/src/data/positional-tags/positional-tag-manager.ts b/src/data/positional-tags/positional-tag-manager.ts new file mode 100644 index 00000000000..7bf4d4995c6 --- /dev/null +++ b/src/data/positional-tags/positional-tag-manager.ts @@ -0,0 +1,55 @@ +import { loadPositionalTag } from "#data/positional-tags/load-positional-tag"; +import type { PositionalTag } from "#data/positional-tags/positional-tag"; +import type { BattlerIndex } from "#enums/battler-index"; +import type { PositionalTagType } from "#enums/positional-tag-type"; + +/** A manager for the {@linkcode PositionalTag}s in the arena. */ +export class PositionalTagManager { + /** + * Array containing all pending unactivated {@linkcode PositionalTag}s, + * sorted by order of creation (oldest first). + */ + public tags: PositionalTag[] = []; + + /** + * Add a new {@linkcode PositionalTag} to the arena. + * @remarks + * This function does not perform any checking if the added tag is valid. + */ + public addTag(tag: Parameters>[0]): void { + this.tags.push(loadPositionalTag(tag)); + } + + /** + * Check whether a new {@linkcode PositionalTag} can be added to the battlefield. + * @param tagType - The {@linkcode PositionalTagType} being created + * @param targetIndex - The {@linkcode BattlerIndex} being targeted + * @returns Whether the tag can be added. + */ + public canAddTag(tagType: PositionalTagType, targetIndex: BattlerIndex): boolean { + return !this.tags.some(t => t.tagType === tagType && t.targetIndex === targetIndex); + } + + /** + * Decrement turn counts of and trigger all pending {@linkcode PositionalTag}s on field. + * @remarks + * If multiple tags trigger simultaneously, they will activate in order of **initial creation**, regardless of current speed order. + * (Source: [Smogon]()) + */ + public activateAllTags(): void { + const leftoverTags: PositionalTag[] = []; + for (const tag of this.tags) { + // Check for silent removal, immediately removing invalid tags. + if (--tag.turnCount > 0) { + // tag still cooking + leftoverTags.push(tag); + continue; + } + + if (tag.shouldTrigger()) { + tag.trigger(); + } + } + this.tags = leftoverTags; + } +} diff --git a/src/data/positional-tags/positional-tag.ts b/src/data/positional-tags/positional-tag.ts new file mode 100644 index 00000000000..77ca6f0e9eb --- /dev/null +++ b/src/data/positional-tags/positional-tag.ts @@ -0,0 +1,174 @@ +import { globalScene } from "#app/global-scene"; +import { getPokemonNameWithAffix } from "#app/messages"; +// biome-ignore-start lint/correctness/noUnusedImports: TSDoc +import type { ArenaTag } from "#data/arena-tag"; +// biome-ignore-end lint/correctness/noUnusedImports: TSDoc +import { allMoves } from "#data/data-lists"; +import type { BattlerIndex } from "#enums/battler-index"; +import type { MoveId } from "#enums/move-id"; +import { MoveUseMode } from "#enums/move-use-mode"; +import { PositionalTagType } from "#enums/positional-tag-type"; +import type { Pokemon } from "#field/pokemon"; +import i18next from "i18next"; + +/** + * Baseline arguments used to construct all {@linkcode PositionalTag}s, + * the contents of which are serialized and used to construct new tags. \ + * Does not contain the `tagType` parameter (which is used to select the proper class constructor during tag loading). + * @privateRemarks + * All {@linkcode PositionalTag}s are intended to implement a sub-interface of this containing their respective parameters, + * and should refrain from adding extra serializable fields not contained in said interface. + * This ensures that all tags truly "become" their respective interfaces when converted to and from JSON. + */ +export interface PositionalTagBaseArgs { + /** + * The number of turns remaining until this tag's activation. \ + * Decremented by 1 at the end of each turn until reaching 0, at which point it will + * {@linkcode PositionalTag.trigger | trigger} the tag's effects and be removed. + */ + turnCount: number; + /** + * The {@linkcode BattlerIndex} targeted by this effect. + */ + targetIndex: BattlerIndex; +} + +/** + * A {@linkcode PositionalTag} is a variant of an {@linkcode ArenaTag} that targets a single *slot* of the battlefield. + * Each tag can last one or more turns, triggering various effects on removal. + * Multiple tags of the same kind can stack with one another, provided they are affecting different targets. + */ +export abstract class PositionalTag implements PositionalTagBaseArgs { + /** This tag's {@linkcode PositionalTagType | type} */ + public abstract readonly tagType: PositionalTagType; + // These arguments have to be public to implement the interface, but are functionally private + // outside this and the tag manager. + // Left undocumented to inherit doc comments from the interface + public turnCount: number; + public readonly targetIndex: BattlerIndex; + + constructor({ turnCount, targetIndex }: PositionalTagBaseArgs) { + this.turnCount = turnCount; + this.targetIndex = targetIndex; + } + + /** Trigger this tag's effects prior to removal. */ + public abstract trigger(): void; + + /** + * Check whether this tag should be allowed to {@linkcode trigger} and activate its effects + * upon its duration elapsing. + * @returns Whether this tag should be allowed to trigger prior to being removed. + */ + public abstract shouldTrigger(): boolean; + + /** + * Get the {@linkcode Pokemon} currently targeted by this tag. + * @returns The {@linkcode Pokemon} located in this tag's target position, or `undefined` if none exist in it. + */ + protected getTarget(): Pokemon | undefined { + return globalScene.getField()[this.targetIndex]; + } +} + +/** Interface containing additional properties used to construct a {@linkcode DelayedAttackTag}. */ +interface DelayedAttackArgs extends PositionalTagBaseArgs { + /** + * The {@linkcode Pokemon.id | PID} of the {@linkcode Pokemon} having created this effect. + */ + sourceId: number; + /** The {@linkcode MoveId} that created this attack. */ + sourceMove: MoveId; +} + +/** + * Tag to manage execution of delayed attacks, such as {@linkcode MoveId.FUTURE_SIGHT} or {@linkcode MoveId.DOOM_DESIRE}. \ + * Delayed attacks do nothing for the first several turns after use (including the turn the move is used), + * triggering against a certain slot after the turn count has elapsed. + */ +export class DelayedAttackTag extends PositionalTag implements DelayedAttackArgs { + public override readonly tagType = PositionalTagType.DELAYED_ATTACK; + public readonly sourceMove: MoveId; + public readonly sourceId: number; + + constructor({ sourceId, turnCount, targetIndex, sourceMove }: DelayedAttackArgs) { + super({ turnCount, targetIndex }); + this.sourceId = sourceId; + this.sourceMove = sourceMove; + } + + public override trigger(): void { + // Bangs are justified as the `shouldTrigger` method will queue the tag for removal + // if the source or target no longer exist + const source = globalScene.getPokemonById(this.sourceId)!; + const target = this.getTarget()!; + + source.turnData.extraTurns++; + globalScene.phaseManager.queueMessage( + i18next.t("moveTriggers:tookMoveAttack", { + pokemonName: getPokemonNameWithAffix(target), + moveName: allMoves[this.sourceMove].name, + }), + ); + + globalScene.phaseManager.unshiftNew( + "MoveEffectPhase", + this.sourceId, // TODO: Find an alternate method of passing the source pokemon without a source ID + [this.targetIndex], + allMoves[this.sourceMove], + MoveUseMode.DELAYED_ATTACK, + ); + } + + public override shouldTrigger(): boolean { + const source = globalScene.getPokemonById(this.sourceId); + const target = this.getTarget(); + // Silently disappear if either source or target are missing or happen to be the same pokemon + // (i.e. targeting oneself) + // We also need to check for fainted targets as they don't technically leave the field until _after_ the turn ends + return !!source && !!target && source !== target && !target.isFainted(); + } +} + +/** Interface containing arguments used to construct a {@linkcode WishTag}. */ +interface WishArgs extends PositionalTagBaseArgs { + /** The amount of {@linkcode Stat.HP | HP} to heal; set to 50% of the user's max HP during move usage. */ + healHp: number; + /** The name of the {@linkcode Pokemon} having created the tag. */ + pokemonName: string; +} + +/** + * Tag to implement {@linkcode MoveId.WISH | Wish}. + */ +export class WishTag extends PositionalTag implements WishArgs { + public override readonly tagType = PositionalTagType.WISH; + + public readonly pokemonName: string; + public readonly healHp: number; + + constructor({ turnCount, targetIndex, healHp, pokemonName }: WishArgs) { + super({ turnCount, targetIndex }); + this.healHp = healHp; + this.pokemonName = pokemonName; + } + + public override trigger(): void { + // TODO: Rename this locales key - wish shows a message on REMOVAL, not addition + globalScene.phaseManager.queueMessage( + i18next.t("arenaTag:wishTagOnAdd", { + pokemonNameWithAffix: this.pokemonName, + }), + ); + + globalScene.phaseManager.unshiftNew("PokemonHealPhase", this.targetIndex, this.healHp, null, true, false); + } + + public override shouldTrigger(): boolean { + // Disappear if no target or target is fainted. + // The source need not exist at the time of activation (since all we need is a simple message) + // TODO: Verify whether Wish shows a message if the Pokemon it would affect is KO'd on the turn of activation + const target = this.getTarget(); + return !!target && !target.isFainted(); + } +} diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts index 214826993b3..7f9364395c0 100644 --- a/src/enums/arena-tag-type.ts +++ b/src/enums/arena-tag-type.ts @@ -15,9 +15,6 @@ export enum ArenaTagType { SPIKES = "SPIKES", TOXIC_SPIKES = "TOXIC_SPIKES", MIST = "MIST", - FUTURE_SIGHT = "FUTURE_SIGHT", - DOOM_DESIRE = "DOOM_DESIRE", - WISH = "WISH", STEALTH_ROCK = "STEALTH_ROCK", STICKY_WEB = "STICKY_WEB", TRICK_ROOM = "TRICK_ROOM", diff --git a/src/enums/move-use-mode.ts b/src/enums/move-use-mode.ts index 1bb9d6374b7..13ea5248853 100644 --- a/src/enums/move-use-mode.ts +++ b/src/enums/move-use-mode.ts @@ -1,5 +1,7 @@ import type { PostDancingMoveAbAttr } from "#abilities/ability"; +import type { DelayedAttackAttr } from "#app/@types/move-types"; import type { BattlerTagLapseType } from "#enums/battler-tag-lapse-type"; +import type { ObjectValues } from "#types/type-helpers"; /** * Enum representing all the possible means through which a given move can be executed. @@ -59,11 +61,20 @@ export const MoveUseMode = { * and retain the same copy prevention as {@linkcode MoveUseMode.FOLLOW_UP}, but additionally * **cannot be reflected by other reflecting effects**. */ - REFLECTED: 5 - // TODO: Add use type TRANSPARENT for Future Sight and Doom Desire to prevent move history pushing + REFLECTED: 5, + /** + * This "move" was created by a transparent effect that **does not count as using a move**, + * such as {@linkcode DelayedAttackAttr | Future Sight/Doom Desire}. + * + * In addition to inheriting the cancellation ignores and copy prevention from {@linkcode MoveUseMode.REFLECTED}, + * transparent moves are ignored by **all forms of move usage checks** due to **not pushing to move history**. + * @todo Consider other means of implementing FS/DD than this - we currently only use it + * to prevent pushing to move history and avoid re-delaying the attack portion + */ + DELAYED_ATTACK: 6 } as const; -export type MoveUseMode = (typeof MoveUseMode)[keyof typeof MoveUseMode]; +export type MoveUseMode = ObjectValues; // # HELPER FUNCTIONS // Please update the markdown tables if any new `MoveUseMode`s get added. @@ -75,13 +86,14 @@ export type MoveUseMode = (typeof MoveUseMode)[keyof typeof MoveUseMode]; * @remarks * This function is equivalent to the following truth table: * - * | Use Type | Returns | - * |------------------------------------|---------| - * | {@linkcode MoveUseMode.NORMAL} | `false` | - * | {@linkcode MoveUseMode.IGNORE_PP} | `false` | - * | {@linkcode MoveUseMode.INDIRECT} | `true` | - * | {@linkcode MoveUseMode.FOLLOW_UP} | `true` | - * | {@linkcode MoveUseMode.REFLECTED} | `true` | + * | Use Type | Returns | + * |----------------------------------------|---------| + * | {@linkcode MoveUseMode.NORMAL} | `false` | + * | {@linkcode MoveUseMode.IGNORE_PP} | `false` | + * | {@linkcode MoveUseMode.INDIRECT} | `true` | + * | {@linkcode MoveUseMode.FOLLOW_UP} | `true` | + * | {@linkcode MoveUseMode.REFLECTED} | `true` | + * | {@linkcode MoveUseMode.DELAYED_ATTACK} | `true` | */ export function isVirtual(useMode: MoveUseMode): boolean { return useMode >= MoveUseMode.INDIRECT @@ -95,13 +107,14 @@ export function isVirtual(useMode: MoveUseMode): boolean { * @remarks * This function is equivalent to the following truth table: * - * | Use Type | Returns | - * |------------------------------------|---------| - * | {@linkcode MoveUseMode.NORMAL} | `false` | - * | {@linkcode MoveUseMode.IGNORE_PP} | `false` | - * | {@linkcode MoveUseMode.INDIRECT} | `false` | - * | {@linkcode MoveUseMode.FOLLOW_UP} | `true` | - * | {@linkcode MoveUseMode.REFLECTED} | `true` | + * | Use Type | Returns | + * |----------------------------------------|---------| + * | {@linkcode MoveUseMode.NORMAL} | `false` | + * | {@linkcode MoveUseMode.IGNORE_PP} | `false` | + * | {@linkcode MoveUseMode.INDIRECT} | `false` | + * | {@linkcode MoveUseMode.FOLLOW_UP} | `true` | + * | {@linkcode MoveUseMode.REFLECTED} | `true` | + * | {@linkcode MoveUseMode.DELAYED_ATTACK} | `true` | */ export function isIgnoreStatus(useMode: MoveUseMode): boolean { return useMode >= MoveUseMode.FOLLOW_UP; @@ -115,13 +128,14 @@ export function isIgnoreStatus(useMode: MoveUseMode): boolean { * @remarks * This function is equivalent to the following truth table: * - * | Use Type | Returns | - * |------------------------------------|---------| - * | {@linkcode MoveUseMode.NORMAL} | `false` | - * | {@linkcode MoveUseMode.IGNORE_PP} | `true` | - * | {@linkcode MoveUseMode.INDIRECT} | `true` | - * | {@linkcode MoveUseMode.FOLLOW_UP} | `true` | - * | {@linkcode MoveUseMode.REFLECTED} | `true` | + * | Use Type | Returns | + * |----------------------------------------|---------| + * | {@linkcode MoveUseMode.NORMAL} | `false` | + * | {@linkcode MoveUseMode.IGNORE_PP} | `true` | + * | {@linkcode MoveUseMode.INDIRECT} | `true` | + * | {@linkcode MoveUseMode.FOLLOW_UP} | `true` | + * | {@linkcode MoveUseMode.REFLECTED} | `true` | + * | {@linkcode MoveUseMode.DELAYED_ATTACK} | `true` | */ export function isIgnorePP(useMode: MoveUseMode): boolean { return useMode >= MoveUseMode.IGNORE_PP; @@ -136,14 +150,15 @@ export function isIgnorePP(useMode: MoveUseMode): boolean { * @remarks * This function is equivalent to the following truth table: * - * | Use Type | Returns | - * |------------------------------------|---------| - * | {@linkcode MoveUseMode.NORMAL} | `false` | - * | {@linkcode MoveUseMode.IGNORE_PP} | `false` | - * | {@linkcode MoveUseMode.INDIRECT} | `false` | - * | {@linkcode MoveUseMode.FOLLOW_UP} | `false` | - * | {@linkcode MoveUseMode.REFLECTED} | `true` | + * | Use Type | Returns | + * |----------------------------------------|---------| + * | {@linkcode MoveUseMode.NORMAL} | `false` | + * | {@linkcode MoveUseMode.IGNORE_PP} | `false` | + * | {@linkcode MoveUseMode.INDIRECT} | `false` | + * | {@linkcode MoveUseMode.FOLLOW_UP} | `false` | + * | {@linkcode MoveUseMode.REFLECTED} | `true` | + * | {@linkcode MoveUseMode.DELAYED_ATTACK} | `false` | */ export function isReflected(useMode: MoveUseMode): boolean { return useMode === MoveUseMode.REFLECTED; -} +} \ No newline at end of file diff --git a/src/enums/positional-tag-type.ts b/src/enums/positional-tag-type.ts new file mode 100644 index 00000000000..254503d0de6 --- /dev/null +++ b/src/enums/positional-tag-type.ts @@ -0,0 +1,10 @@ +/** + * Enum representing all positional tag types. + * @privateRemarks + * When adding new tag types, please update `positionalTagConstructorMap` in `src/data/positionalTags` + * with the new tag type. + */ +export enum PositionalTagType { + DELAYED_ATTACK = "DELAYED_ATTACK", + WISH = "WISH", +} diff --git a/src/field/arena.ts b/src/field/arena.ts index 8f27ddb22e9..484450cc5df 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -1,3 +1,7 @@ +// biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports +import type { PositionalTag } from "#data/positional-tags/positional-tag"; +// biome-ignore-end lint/correctness/noUnusedImports: TSDoc imports + import { applyAbAttrs } from "#abilities/apply-ab-attrs"; import { globalScene } from "#app/global-scene"; import Overrides from "#app/overrides"; @@ -7,6 +11,7 @@ import type { ArenaTag } from "#data/arena-tag"; import { ArenaTrapTag, getArenaTag } from "#data/arena-tag"; import { SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "#data/form-change-triggers"; import type { PokemonSpecies } from "#data/pokemon-species"; +import { PositionalTagManager } from "#data/positional-tags/positional-tag-manager"; import { getTerrainClearMessage, getTerrainStartMessage, Terrain, TerrainType } from "#data/terrain"; import { getLegendaryWeatherContinuesMessage, @@ -38,7 +43,14 @@ export class Arena { public biomeType: BiomeId; public weather: Weather | null; public terrain: Terrain | null; - public tags: ArenaTag[]; + /** All currently-active {@linkcode ArenaTag}s on both sides of the field. */ + public tags: ArenaTag[] = []; + /** + * All currently-active {@linkcode PositionalTag}s on both sides of the field, + * sorted by tag type. + */ + public positionalTagManager: PositionalTagManager = new PositionalTagManager(); + public bgm: string; public ignoreAbilities: boolean; public ignoringEffectSource: BattlerIndex | null; @@ -58,7 +70,6 @@ export class Arena { constructor(biome: BiomeId, bgm: string, playerFaints = 0) { this.biomeType = biome; - this.tags = []; this.bgm = bgm; this.trainerPool = biomeTrainerPools[biome]; this.updatePoolsForTimeOfDay(); @@ -676,15 +687,15 @@ export class Arena { } /** - * Adds a new tag to the arena - * @param tagType {@linkcode ArenaTagType} the tag being added - * @param turnCount How many turns the tag lasts - * @param sourceMove {@linkcode MoveId} the move the tag came from, or `undefined` if not from a move - * @param sourceId The ID of the pokemon in play the tag came from (see {@linkcode BattleScene.getPokemonById}) - * @param side {@linkcode ArenaTagSide} which side(s) the tag applies to - * @param quiet If a message should be queued on screen to announce the tag being added - * @param targetIndex The {@linkcode BattlerIndex} of the target pokemon - * @returns `false` if there already exists a tag of this type in the Arena + * Add a new {@linkcode ArenaTag} to the arena, triggering overlap effects on existing tags as applicable. + * @param tagType - The {@linkcode ArenaTagType} of the tag to add. + * @param turnCount - The number of turns the newly-added tag should last. + * @param sourceId - The {@linkcode Pokemon.id | PID} of the Pokemon creating the tag. + * @param sourceMove - The {@linkcode MoveId} of the move creating the tag, or `undefined` if not from a move. + * @param side - The {@linkcode ArenaTagSide}(s) to which the tag should apply; default `ArenaTagSide.BOTH`. + * @param quiet - Whether to suppress messages produced by tag addition; default `false`. + * @returns `true` if the tag was successfully added without overlapping. + // TODO: Do we need the return value here? literally nothing uses it */ addTag( tagType: ArenaTagType, @@ -693,7 +704,6 @@ export class Arena { sourceId: number, side: ArenaTagSide = ArenaTagSide.BOTH, quiet = false, - targetIndex?: BattlerIndex, ): boolean { const existingTag = this.getTagOnSide(tagType, side); if (existingTag) { @@ -708,7 +718,7 @@ export class Arena { } // creates a new tag object - const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, targetIndex, side); + const newTag = getArenaTag(tagType, turnCount || 0, sourceMove, sourceId, side); if (newTag) { newTag.onAdd(this, quiet); this.tags.push(newTag); @@ -724,10 +734,19 @@ export class Arena { } /** - * Attempts to get a tag from the Arena via {@linkcode getTagOnSide} that applies to both sides - * @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get - * @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there + * Attempt to get a tag from the Arena via {@linkcode getTagOnSide} that applies to both sides + * @param tagType - The {@linkcode ArenaTagType} to retrieve + * @returns The existing {@linkcode ArenaTag}, or `undefined` if not present. + * @overload */ + getTag(tagType: ArenaTagType): ArenaTag | undefined; + /** + * Attempt to get a tag from the Arena via {@linkcode getTagOnSide} that applies to both sides + * @param tagType - The constructor of the {@linkcode ArenaTag} to retrieve + * @returns The existing {@linkcode ArenaTag}, or `undefined` if not present. + * @overload + */ + getTag(tagType: Constructor | AbstractConstructor): T | undefined; getTag(tagType: ArenaTagType | Constructor | AbstractConstructor): ArenaTag | undefined { return this.getTagOnSide(tagType, ArenaTagSide.BOTH); } diff --git a/src/phase-manager.ts b/src/phase-manager.ts index c56afe446ed..37edeae7e42 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -61,6 +61,7 @@ import { PartyHealPhase } from "#phases/party-heal-phase"; import { PokemonAnimPhase } from "#phases/pokemon-anim-phase"; import { PokemonHealPhase } from "#phases/pokemon-heal-phase"; import { PokemonTransformPhase } from "#phases/pokemon-transform-phase"; +import { PositionalTagPhase } from "#phases/positional-tag-phase"; import { PostGameOverPhase } from "#phases/post-game-over-phase"; import { PostSummonPhase } from "#phases/post-summon-phase"; import { PostTurnStatusEffectPhase } from "#phases/post-turn-status-effect-phase"; @@ -172,6 +173,7 @@ const PHASES = Object.freeze({ PokemonAnimPhase, PokemonHealPhase, PokemonTransformPhase, + PositionalTagPhase, PostGameOverPhase, PostSummonPhase, PostTurnStatusEffectPhase, diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index b1cb9e48d51..c57e0f6cead 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -19,7 +19,7 @@ import { MoveFlags } from "#enums/move-flags"; import { MoveId } from "#enums/move-id"; import { MoveResult } from "#enums/move-result"; import { MoveTarget } from "#enums/move-target"; -import { isReflected, isVirtual, MoveUseMode } from "#enums/move-use-mode"; +import { isReflected, MoveUseMode } from "#enums/move-use-mode"; import { PokemonType } from "#enums/pokemon-type"; import type { Pokemon } from "#field/pokemon"; import { @@ -244,43 +244,19 @@ export class MoveEffectPhase extends PokemonPhase { globalScene.currentBattle.lastPlayerInvolved = this.fieldIndex; } - const isDelayedAttack = this.move.hasAttr("DelayedAttackAttr"); - /** If the user was somehow removed from the field and it's not a delayed attack, end this phase */ - if (!user.isOnField()) { - if (!isDelayedAttack) { - super.end(); - return; - } - if (!user.scene) { - /* - * This happens if the Pokemon that used the delayed attack gets caught and released - * on the turn the attack would have triggered. Having access to the global scene - * in the future may solve this entirely, so for now we just cancel the hit - */ - super.end(); - return; - } - } + const move = this.move; /** * Does an effect from this move override other effects on this turn? * e.g. Charging moves (Fly, etc.) on their first turn of use. */ const overridden = new BooleanHolder(false); - const move = this.move; // Apply effects to override a move effect. // Assuming single target here works as this is (currently) // only used for Future Sight, calling and Pledge moves. // TODO: change if any other move effect overrides are introduced - applyMoveAttrs( - "OverrideMoveEffectAttr", - user, - this.getFirstTarget() ?? null, - move, - overridden, - isVirtual(this.useMode), - ); + applyMoveAttrs("OverrideMoveEffectAttr", user, this.getFirstTarget() ?? null, move, overridden, this.useMode); // If other effects were overriden, stop this phase before they can be applied if (overridden.value) { @@ -355,7 +331,7 @@ export class MoveEffectPhase extends PokemonPhase { */ private postAnimCallback(user: Pokemon, targets: Pokemon[]) { // Add to the move history entry - if (this.firstHit) { + if (this.firstHit && this.useMode !== MoveUseMode.DELAYED_ATTACK) { user.pushMoveHistory(this.moveHistoryEntry); applyAbAttrs("ExecutedMoveAbAttr", { pokemon: user }); } @@ -663,6 +639,7 @@ export class MoveEffectPhase extends PokemonPhase { /** @returns The {@linkcode Pokemon} using this phase's invoked move */ public getUserPokemon(): Pokemon | null { + // TODO: Make this purely a battler index if (this.battlerIndex > BattlerIndex.ENEMY_2) { return globalScene.getPokemonById(this.battlerIndex); } diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index 82bb6b153ef..cd7c7a8f48f 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -2,14 +2,12 @@ import { applyAbAttrs } from "#abilities/apply-ab-attrs"; import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import Overrides from "#app/overrides"; -import type { DelayedAttackTag } from "#data/arena-tag"; import { CenterOfAttentionTag } from "#data/battler-tags"; import { SpeciesFormChangePreMoveTrigger } from "#data/form-change-triggers"; import { getStatusEffectActivationText, getStatusEffectHealText } from "#data/status-effect"; import { getTerrainBlockMessage } from "#data/terrain"; import { getWeatherBlockMessage } from "#data/weather"; import { AbilityId } from "#enums/ability-id"; -import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerIndex } from "#enums/battler-index"; import { BattlerTagLapseType } from "#enums/battler-tag-lapse-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -297,21 +295,6 @@ export class MovePhase extends BattlePhase { // form changes happen even before we know that the move wll execute. globalScene.triggerPokemonFormChange(this.pokemon, SpeciesFormChangePreMoveTrigger); - // Check the player side arena if another delayed attack is active and hitting the same slot. - if (move.hasAttr("DelayedAttackAttr")) { - const currentTargetIndex = targets[0].getBattlerIndex(); - const delayedAttackHittingSameSlot = globalScene.arena.tags.some( - tag => - (tag.tagType === ArenaTagType.FUTURE_SIGHT || tag.tagType === ArenaTagType.DOOM_DESIRE) && - (tag as DelayedAttackTag).targetIndex === currentTargetIndex, - ); - - if (delayedAttackHittingSameSlot) { - this.failMove(true); - return; - } - } - // Check if the move has any attributes that can interrupt its own use **before** displaying text. // TODO: This should not rely on direct return values let failed = move.getAttrs("PreUseInterruptAttr").some(attr => attr.apply(this.pokemon, targets[0], move)); diff --git a/src/phases/positional-tag-phase.ts b/src/phases/positional-tag-phase.ts new file mode 100644 index 00000000000..dec572273c5 --- /dev/null +++ b/src/phases/positional-tag-phase.ts @@ -0,0 +1,21 @@ +// biome-ignore-start lint/correctness/noUnusedImports: TSDocs +import type { PositionalTag } from "#data/positional-tags/positional-tag"; +import type { TurnEndPhase } from "#phases/turn-end-phase"; +// biome-ignore-end lint/correctness/noUnusedImports: TSDocs + +import { globalScene } from "#app/global-scene"; +import { Phase } from "#app/phase"; + +/** + * Phase to trigger all pending post-turn {@linkcode PositionalTag}s. + * Occurs before {@linkcode TurnEndPhase} to allow for proper electrify timing. + */ +export class PositionalTagPhase extends Phase { + public readonly phaseName = "PositionalTagPhase"; + + public override start(): void { + globalScene.arena.positionalTagManager.activateAllTags(); + super.end(); + return; + } +} diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 9fdac65bb10..9c53a333ed0 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -220,12 +220,16 @@ export class TurnStartPhase extends FieldPhase { } phaseManager.pushNew("CheckInterludePhase"); + // TODO: Re-order these phases to be consistent with mainline turn order: + // https://www.smogon.com/forums/threads/sword-shield-battle-mechanics-research.3655528/page-64#post-9244179 + phaseManager.pushNew("WeatherEffectPhase"); phaseManager.pushNew("BerryPhase"); /** Add a new phase to check who should be taking status damage */ phaseManager.pushNew("CheckStatusEffectPhase", moveOrder); + phaseManager.pushNew("PositionalTagPhase"); phaseManager.pushNew("TurnEndPhase"); /* diff --git a/src/system/arena-data.ts b/src/system/arena-data.ts index c0ad4a25024..b2a04f96a55 100644 --- a/src/system/arena-data.ts +++ b/src/system/arena-data.ts @@ -1,5 +1,6 @@ import type { ArenaTag } from "#data/arena-tag"; import { loadArenaTag, SerializableArenaTag } from "#data/arena-tag"; +import type { SerializedPositionalTag } from "#data/positional-tags/load-positional-tag"; import { Terrain } from "#data/terrain"; import { Weather } from "#data/weather"; import type { BiomeId } from "#enums/biome-id"; @@ -12,6 +13,7 @@ export interface SerializedArenaData { weather: NonFunctionProperties | null; terrain: NonFunctionProperties | null; tags?: ArenaTagTypeData[]; + positionalTags: SerializedPositionalTag[]; playerTerasUsed?: number; } @@ -20,6 +22,7 @@ export class ArenaData { public weather: Weather | null; public terrain: Terrain | null; public tags: ArenaTag[]; + public positionalTags: SerializedPositionalTag[] = []; public playerTerasUsed: number; constructor(source: Arena | SerializedArenaData) { @@ -37,11 +40,15 @@ export class ArenaData { this.biome = source.biomeType; this.weather = source.weather; this.terrain = source.terrain; + // The assertion here is ok - we ensure that all tags are inside the `posTagConstructorMap` map, + // and that all `PositionalTags` will become their respective interfaces when serialized and de-serialized. + this.positionalTags = (source.positionalTagManager.tags as unknown as SerializedPositionalTag[]) ?? []; return; } this.biome = source.biome; this.weather = source.weather ? new Weather(source.weather.weatherType, source.weather.turnsLeft) : null; this.terrain = source.terrain ? new Terrain(source.terrain.terrainType, source.terrain.turnsLeft) : null; + this.positionalTags = source.positionalTags ?? []; } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index b148ed4e2ba..d899afa19ef 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -16,6 +16,7 @@ import { allMoves, allSpecies } from "#data/data-lists"; import type { Egg } from "#data/egg"; import { pokemonFormChanges } from "#data/pokemon-forms"; import type { PokemonSpecies } from "#data/pokemon-species"; +import { loadPositionalTag } from "#data/positional-tags/load-positional-tag"; import { TerrainType } from "#data/terrain"; import { AbilityAttr } from "#enums/ability-attr"; import { BattleType } from "#enums/battle-type"; @@ -1096,6 +1097,10 @@ export class GameData { } } + globalScene.arena.positionalTagManager.tags = sessionData.arena.positionalTags.map(tag => + loadPositionalTag(tag), + ); + if (globalScene.modifiers.length) { console.warn("Existing modifiers not cleared on session load, deleting..."); globalScene.modifiers = []; diff --git a/test/moves/delayed-attack.test.ts b/test/moves/delayed-attack.test.ts new file mode 100644 index 00000000000..e8cf2871626 --- /dev/null +++ b/test/moves/delayed-attack.test.ts @@ -0,0 +1,389 @@ +import { getPokemonNameWithAffix } from "#app/messages"; +import { AttackTypeBoosterModifier } from "#app/modifier/modifier"; +import { allMoves } from "#data/data-lists"; +import { AbilityId } from "#enums/ability-id"; +import { BattleType } from "#enums/battle-type"; +import { BattlerIndex } from "#enums/battler-index"; +import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; +import { PokemonType } from "#enums/pokemon-type"; +import { PositionalTagType } from "#enums/positional-tag-type"; +import { SpeciesId } from "#enums/species-id"; +import { Stat } from "#enums/stat"; +import { GameManager } from "#test/test-utils/game-manager"; +import i18next from "i18next"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Delayed Attacks", () => { + 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 + .ability(AbilityId.NO_GUARD) + .battleStyle("single") + .enemySpecies(SpeciesId.MAGIKARP) + .enemyAbility(AbilityId.STURDY) + .enemyMoveset(MoveId.SPLASH); + }); + + /** + * Wait until a number of turns have passed. + * @param numTurns - Number of turns to pass. + * @param toEndOfTurn - Whether to advance to the `TurnEndPhase` (`true`) or the `PositionalTagPhase` (`false`); + * default `true` + * @returns A Promise that resolves once the specified number of turns has elapsed + * and the specified phase has been reached. + */ + async function passTurns(numTurns: number, toEndOfTurn = true): Promise { + for (let i = 0; i < numTurns; i++) { + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + if (game.scene.getPlayerField()[1]?.isActive()) { + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + } + await game.move.forceEnemyMove(MoveId.SPLASH); + if (game.scene.getEnemyField()[1]?.isActive()) { + await game.move.forceEnemyMove(MoveId.SPLASH); + } + await game.phaseInterceptor.to("PositionalTagPhase"); + } + if (toEndOfTurn) { + await game.toEndOfTurn(); + } + } + + /** + * Expect that future sight is active with the specified number of attacks. + * @param numAttacks - The number of delayed attacks that should be queued; default `1` + */ + function expectFutureSightActive(numAttacks = 1) { + const delayedAttacks = game.scene.arena.positionalTagManager["tags"].filter( + t => t.tagType === PositionalTagType.DELAYED_ATTACK, + ); + expect(delayedAttacks).toHaveLength(numAttacks); + } + + it.each<{ name: string; move: MoveId }>([ + { name: "Future Sight", move: MoveId.FUTURE_SIGHT }, + { name: "Doom Desire", move: MoveId.DOOM_DESIRE }, + ])("$name should show message and strike 2 turns after use, ignoring player/enemy switches", async ({ move }) => { + game.override.battleType(BattleType.TRAINER); + await game.classicMode.startBattle([SpeciesId.FEEBAS, SpeciesId.MILOTIC]); + + game.move.use(move); + await game.toNextTurn(); + + expectFutureSightActive(); + + game.doSwitchPokemon(1); + game.forceEnemyToSwitch(); + await game.toNextTurn(); + + await passTurns(1); + + expectFutureSightActive(0); + const enemy = game.field.getEnemyPokemon(); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + expect(game.textInterceptor.logs).toContain( + i18next.t("moveTriggers:tookMoveAttack", { + pokemonName: getPokemonNameWithAffix(enemy), + moveName: allMoves[move].name, + }), + ); + }); + + it("should fail (preserving prior instances) when used against the same target", async () => { + await game.classicMode.startBattle([SpeciesId.BRONZONG]); + + game.move.use(MoveId.FUTURE_SIGHT); + await game.toNextTurn(); + + expectFutureSightActive(); + const bronzong = game.field.getPlayerPokemon(); + expect(bronzong.getLastXMoves()[0].result).toBe(MoveResult.OTHER); + + game.move.use(MoveId.FUTURE_SIGHT); + await game.toNextTurn(); + + expectFutureSightActive(); + expect(bronzong.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should still be delayed when called by other moves", async () => { + await game.classicMode.startBattle([SpeciesId.BRONZONG]); + + game.move.use(MoveId.METRONOME); + game.move.forceMetronomeMove(MoveId.FUTURE_SIGHT); + await game.toNextTurn(); + + expectFutureSightActive(); + const enemy = game.field.getEnemyPokemon(); + expect(enemy.hp).toBe(enemy.getMaxHp()); + + await passTurns(2); + + expectFutureSightActive(0); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + }); + + it("should work when used against different targets in doubles", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); + + const [karp, feebas, enemy1, enemy2] = game.scene.getField(); + + game.move.use(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.use(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2); + await game.toEndOfTurn(); + + expectFutureSightActive(2); + expect(enemy1.hp).toBe(enemy1.getMaxHp()); + expect(enemy2.hp).toBe(enemy2.getMaxHp()); + expect(karp.getLastXMoves()[0].result).toBe(MoveResult.OTHER); + expect(feebas.getLastXMoves()[0].result).toBe(MoveResult.OTHER); + + await passTurns(2); + + expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp()); + expect(enemy2.hp).toBeLessThan(enemy2.getMaxHp()); + }); + + it("should trigger multiple pending attacks in order of creation, even if that order changes later on", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); + + const [alomomola, blissey] = game.scene.getField(); + + const oldOrder = game.field.getSpeedOrder(); + + game.move.use(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER, BattlerIndex.ENEMY); + game.move.use(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2); + await game.move.forceEnemyMove(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER_2); + // Ensure that the moves are used deterministically in speed order (for speed ties) + await game.setTurnOrder(oldOrder.map(p => p.getBattlerIndex())); + await game.toNextTurn(); + + expectFutureSightActive(4); + + // Lower speed to change turn order + alomomola.setStatStage(Stat.SPD, 6); + blissey.setStatStage(Stat.SPD, -6); + + const newOrder = game.field.getSpeedOrder(); + expect(newOrder).not.toEqual(oldOrder); + + await passTurns(2, false); + + // All attacks have concluded at this point, unshifting new `MoveEffectPhase`s to the queue. + expectFutureSightActive(0); + + const MEPs = game.scene.phaseManager.phaseQueue.filter(p => p.is("MoveEffectPhase")); + expect(MEPs).toHaveLength(4); + expect(MEPs.map(mep => mep.getPokemon())).toEqual(oldOrder); + }); + + it("should vanish silently if it would otherwise hit the user", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS, SpeciesId.MILOTIC]); + + const [karp, feebas, milotic] = game.scene.getPlayerParty(); + + game.move.use(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expectFutureSightActive(1); + + // Milotic / Feebas // Karp + game.doSwitchPokemon(2); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expect(game.scene.getPlayerParty()).toEqual([milotic, feebas, karp]); + + // Milotic / Karp // Feebas + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.doSwitchPokemon(2); + + await passTurns(1); + + expect(game.scene.getPlayerParty()).toEqual([milotic, karp, feebas]); + + expect(karp.hp).toBe(karp.getMaxHp()); + expect(feebas.hp).toBe(feebas.getMaxHp()); + expect(game.textInterceptor.logs).not.toContain( + i18next.t("moveTriggers:tookMoveAttack", { + pokemonName: getPokemonNameWithAffix(karp), + moveName: allMoves[MoveId.FUTURE_SIGHT].name, + }), + ); + }); + + it("should redirect normally if target is fainted when move is used", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.MAGIKARP]); + + const [enemy1, enemy2] = game.scene.getEnemyField(); + + game.move.use(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2); + await game.killPokemon(enemy2); + await game.toNextTurn(); + + expect(enemy2.isFainted()).toBe(true); + expectFutureSightActive(); + + const attack = game.scene.arena.positionalTagManager.tags.find( + t => t.tagType === PositionalTagType.DELAYED_ATTACK, + )!; + expect(attack).toBeDefined(); + expect(attack.targetIndex).toBe(enemy1.getBattlerIndex()); + + await passTurns(2); + + expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp()); + expect(game.textInterceptor.logs).toContain( + i18next.t("moveTriggers:tookMoveAttack", { + pokemonName: getPokemonNameWithAffix(enemy1), + moveName: allMoves[MoveId.FUTURE_SIGHT].name, + }), + ); + }); + + it("should vanish silently if slot is vacant when attack lands", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.MAGIKARP]); + + const [enemy1, enemy2] = game.scene.getEnemyField(); + + game.move.use(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2); + await game.toNextTurn(); + + expectFutureSightActive(1); + + game.move.use(MoveId.SPLASH); + await game.killPokemon(enemy2); + await game.toNextTurn(); + + game.move.use(MoveId.SPLASH); + await game.toNextTurn(); + + expectFutureSightActive(0); + expect(enemy1.hp).toBe(enemy1.getMaxHp()); + expect(game.textInterceptor.logs).not.toContain( + i18next.t("moveTriggers:tookMoveAttack", { + pokemonName: getPokemonNameWithAffix(enemy1), + moveName: allMoves[MoveId.FUTURE_SIGHT].name, + }), + ); + }); + + it("should consider type changes at moment of execution while ignoring redirection", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.MAGIKARP]); + + // fake left enemy having lightning rod + const [enemy1, enemy2] = game.scene.getEnemyField(); + game.field.mockAbility(enemy1, AbilityId.LIGHTNING_ROD); + + game.move.use(MoveId.FUTURE_SIGHT, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2); + await game.toNextTurn(); + + expectFutureSightActive(1); + + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + await game.toNextTurn(); + + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.ELECTRIFY, BattlerIndex.PLAYER); + await game.phaseInterceptor.to("PositionalTagPhase"); + await game.phaseInterceptor.to("MoveEffectPhase", false); + + // Wait until all normal attacks have triggered, then check pending MEP + const karp = game.field.getPlayerPokemon(); + const typeMock = vi.spyOn(karp, "getMoveType"); + + await game.toEndOfTurn(); + + expect(enemy1.hp).toBe(enemy1.getMaxHp()); + expect(enemy2.hp).toBeLessThan(enemy2.getMaxHp()); + expect(game.textInterceptor.logs).toContain( + i18next.t("moveTriggers:tookMoveAttack", { + pokemonName: getPokemonNameWithAffix(enemy2), + moveName: allMoves[MoveId.FUTURE_SIGHT].name, + }), + ); + expect(typeMock).toHaveLastReturnedWith(PokemonType.ELECTRIC); + }); + + // TODO: this is not implemented + it.todo("should not apply Shell Bell recovery, even if user is on field"); + + // TODO: Enable once code is added to MEP to do this + it.todo("should not apply the user's abilities when dealing damage if the user is inactive", async () => { + game.override.ability(AbilityId.NORMALIZE).enemySpecies(SpeciesId.LUNALA); + await game.classicMode.startBattle([SpeciesId.FEEBAS, SpeciesId.MILOTIC]); + + game.move.use(MoveId.DOOM_DESIRE); + await game.toNextTurn(); + + expectFutureSightActive(); + + await passTurns(1); + + game.doSwitchPokemon(1); + const typeMock = vi.spyOn(game.field.getPlayerPokemon(), "getMoveType"); + const powerMock = vi.spyOn(allMoves[MoveId.DOOM_DESIRE], "calculateBattlePower"); + + await game.toNextTurn(); + + // Player Normalize was not applied due to being off field + const enemy = game.field.getEnemyPokemon(); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + expect(game.textInterceptor.logs).toContain( + i18next.t("moveTriggers:tookMoveAttack", { + pokemonName: getPokemonNameWithAffix(enemy), + moveName: allMoves[MoveId.DOOM_DESIRE].name, + }), + ); + expect(typeMock).toHaveLastReturnedWith(PokemonType.STEEL); + expect(powerMock).toHaveLastReturnedWith(150); + }); + + it.todo("should not apply the user's held items when dealing damage if the user is inactive", async () => { + game.override.startingHeldItems([{ name: "ATTACK_TYPE_BOOSTER", count: 99, type: PokemonType.PSYCHIC }]); + await game.classicMode.startBattle([SpeciesId.FEEBAS, SpeciesId.MILOTIC]); + + game.move.use(MoveId.FUTURE_SIGHT); + await game.toNextTurn(); + + expectFutureSightActive(); + + await passTurns(1); + + game.doSwitchPokemon(1); + + const powerMock = vi.spyOn(allMoves[MoveId.FUTURE_SIGHT], "calculateBattlePower"); + const typeBoostSpy = vi.spyOn(AttackTypeBoosterModifier.prototype, "apply"); + + await game.toNextTurn(); + + expect(powerMock).toHaveLastReturnedWith(120); + expect(typeBoostSpy).not.toHaveBeenCalled(); + }); + + // TODO: Implement and move to a power spot's test file + it.todo("Should activate ally's power spot when switched in during single battles"); +}); diff --git a/test/moves/future-sight.test.ts b/test/moves/future-sight.test.ts deleted file mode 100644 index 53e93412570..00000000000 --- a/test/moves/future-sight.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AbilityId } from "#enums/ability-id"; -import { MoveId } from "#enums/move-id"; -import { SpeciesId } from "#enums/species-id"; -import { GameManager } from "#test/test-utils/game-manager"; -import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; - -describe("Moves - Future Sight", () => { - 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 - .startingLevel(50) - .moveset([MoveId.FUTURE_SIGHT, MoveId.SPLASH]) - .battleStyle("single") - .enemySpecies(SpeciesId.MAGIKARP) - .enemyAbility(AbilityId.STURDY) - .enemyMoveset(MoveId.SPLASH); - }); - - it("hits 2 turns after use, ignores user switch out", async () => { - await game.classicMode.startBattle([SpeciesId.FEEBAS, SpeciesId.MILOTIC]); - - game.move.select(MoveId.FUTURE_SIGHT); - await game.toNextTurn(); - game.doSwitchPokemon(1); - await game.toNextTurn(); - game.move.select(MoveId.SPLASH); - await game.toNextTurn(); - - expect(game.scene.getEnemyPokemon()!.isFullHp()).toBe(false); - }); -}); diff --git a/test/moves/heal-block.test.ts b/test/moves/heal-block.test.ts index 4e4a9355467..fc814fda4bc 100644 --- a/test/moves/heal-block.test.ts +++ b/test/moves/heal-block.test.ts @@ -1,9 +1,8 @@ import { AbilityId } from "#enums/ability-id"; -import { ArenaTagSide } from "#enums/arena-tag-side"; -import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerIndex } from "#enums/battler-index"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MoveId } from "#enums/move-id"; +import { PositionalTagType } from "#enums/positional-tag-type"; import { SpeciesId } from "#enums/species-id"; import { WeatherType } from "#enums/weather-type"; import { GameManager } from "#test/test-utils/game-manager"; @@ -68,22 +67,25 @@ describe("Moves - Heal Block", () => { expect(enemy.isFullHp()).toBe(false); }); - it("should stop delayed heals, such as from Wish", async () => { + it("should prevent Wish from restoring HP", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon()!; - player.damageAndUpdate(player.getMaxHp() - 1); + player.hp = 1; - game.move.select(MoveId.WISH); - await game.phaseInterceptor.to("TurnEndPhase"); + game.move.use(MoveId.WISH); + await game.toNextTurn(); - expect(game.scene.arena.getTagOnSide(ArenaTagType.WISH, ArenaTagSide.PLAYER)).toBeDefined(); - while (game.scene.arena.getTagOnSide(ArenaTagType.WISH, ArenaTagSide.PLAYER)) { - game.move.select(MoveId.SPLASH); - await game.phaseInterceptor.to("TurnEndPhase"); - } + expect(game.scene.arena.positionalTagManager.tags.filter(t => t.tagType === PositionalTagType.WISH)) // + .toHaveLength(1); + game.move.use(MoveId.SPLASH); + await game.toNextTurn(); + + // wish triggered, but did NOT heal the player + expect(game.scene.arena.positionalTagManager.tags.filter(t => t.tagType === PositionalTagType.WISH)) // + .toHaveLength(0); expect(player.hp).toBe(1); }); diff --git a/test/moves/wish.test.ts b/test/moves/wish.test.ts new file mode 100644 index 00000000000..147c598106b --- /dev/null +++ b/test/moves/wish.test.ts @@ -0,0 +1,183 @@ +import { getPokemonNameWithAffix } from "#app/messages"; +import { AbilityId } from "#enums/ability-id"; +import { BattlerIndex } from "#enums/battler-index"; +import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; +import { PositionalTagType } from "#enums/positional-tag-type"; +import { SpeciesId } from "#enums/species-id"; +import { Stat } from "#enums/stat"; +import { GameManager } from "#test/test-utils/game-manager"; +import { toDmgValue } from "#utils/common"; +import i18next from "i18next"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Move - Wish", () => { + 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 + .ability(AbilityId.BALL_FETCH) + .battleStyle("single") + .criticalHits(false) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH) + .startingLevel(100) + .enemyLevel(100); + }); + + /** + * Expect that wish is active with the specified number of attacks. + * @param numAttacks - The number of wish instances that should be queued; default `1` + */ + function expectWishActive(numAttacks = 1) { + const wishes = game.scene.arena.positionalTagManager["tags"].filter(t => t.tagType === PositionalTagType.WISH); + expect(wishes).toHaveLength(numAttacks); + } + + it("should heal the Pokemon in the current slot for 50% of the user's maximum HP", async () => { + await game.classicMode.startBattle([SpeciesId.ALOMOMOLA, SpeciesId.BLISSEY]); + + const [alomomola, blissey] = game.scene.getPlayerParty(); + alomomola.hp = 1; + blissey.hp = 1; + + game.move.use(MoveId.WISH); + await game.toNextTurn(); + + expectWishActive(); + + game.doSwitchPokemon(1); + await game.toEndOfTurn(); + + expectWishActive(0); + expect(game.textInterceptor.logs).toContain( + i18next.t("arenaTag:wishTagOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(alomomola), + }), + ); + expect(alomomola.hp).toBe(1); + expect(blissey.hp).toBe(toDmgValue(alomomola.getMaxHp() / 2) + 1); + }); + + it("should work if the user has full HP, but not if it already has an active Wish", async () => { + await game.classicMode.startBattle([SpeciesId.ALOMOMOLA, SpeciesId.BLISSEY]); + + const alomomola = game.field.getPlayerPokemon(); + alomomola.hp = 1; + + game.move.use(MoveId.WISH); + await game.toNextTurn(); + + expectWishActive(); + + game.move.use(MoveId.WISH); + await game.toEndOfTurn(); + + expect(alomomola.hp).toBe(toDmgValue(alomomola.getMaxHp() / 2) + 1); + expect(alomomola.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); + + it("should function independently of Future Sight", async () => { + await game.classicMode.startBattle([SpeciesId.ALOMOMOLA, SpeciesId.BLISSEY]); + + const [alomomola, blissey] = game.scene.getPlayerParty(); + alomomola.hp = 1; + blissey.hp = 1; + + game.move.use(MoveId.WISH); + await game.move.forceEnemyMove(MoveId.FUTURE_SIGHT); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + await game.toNextTurn(); + + expectWishActive(1); + }); + + it("should work in double battles and trigger in order of creation", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.ALOMOMOLA, SpeciesId.BLISSEY]); + + const [alomomola, blissey, karp1, karp2] = game.scene.getField(); + alomomola.hp = 1; + blissey.hp = 1; + + vi.spyOn(karp1, "getNameToRender").mockReturnValue("Karp 1"); + vi.spyOn(karp2, "getNameToRender").mockReturnValue("Karp 2"); + + const oldOrder = game.field.getSpeedOrder(); + + game.move.use(MoveId.WISH, BattlerIndex.PLAYER); + game.move.use(MoveId.WISH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.WISH); + await game.move.forceEnemyMove(MoveId.WISH); + // Ensure that the wishes are used deterministically in speed order (for speed ties) + await game.setTurnOrder(oldOrder.map(p => p.getBattlerIndex())); + await game.toNextTurn(); + + expectWishActive(4); + + // Lower speed to change turn order + alomomola.setStatStage(Stat.SPD, 6); + blissey.setStatStage(Stat.SPD, -6); + + const newOrder = game.field.getSpeedOrder(); + expect(newOrder).not.toEqual(oldOrder); + + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("PositionalTagPhase"); + + // all wishes have activated and added healing phases + expectWishActive(0); + + const healPhases = game.scene.phaseManager.phaseQueue.filter(p => p.is("PokemonHealPhase")); + expect(healPhases).toHaveLength(4); + expect.soft(healPhases.map(php => php.getPokemon())).toEqual(oldOrder); + + await game.toEndOfTurn(); + + expect(alomomola.hp).toBe(toDmgValue(alomomola.getMaxHp() / 2) + 1); + expect(blissey.hp).toBe(toDmgValue(blissey.getMaxHp() / 2) + 1); + }); + + it("should vanish and not play message if slot is empty", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.ALOMOMOLA, SpeciesId.BLISSEY]); + + const [alomomola, blissey] = game.scene.getPlayerParty(); + alomomola.hp = 1; + blissey.hp = 1; + + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.move.use(MoveId.WISH, BattlerIndex.PLAYER_2); + await game.toNextTurn(); + + expectWishActive(); + + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER); + game.move.use(MoveId.MEMENTO, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2); + await game.toEndOfTurn(); + + // Wish went away without doing anything + expectWishActive(0); + expect(game.textInterceptor.logs).not.toContain( + i18next.t("arenaTag:wishTagOnAdd", { + pokemonNameWithAffix: getPokemonNameWithAffix(blissey), + }), + ); + expect(alomomola.hp).toBe(1); + }); +}); diff --git a/test/test-utils/helpers/field-helper.ts b/test/test-utils/helpers/field-helper.ts index 35ca853d049..2d8fd8ee701 100644 --- a/test/test-utils/helpers/field-helper.ts +++ b/test/test-utils/helpers/field-helper.ts @@ -5,7 +5,6 @@ import type { globalScene } from "#app/global-scene"; import type { Ability } from "#abilities/ability"; import { allAbilities } from "#data/data-lists"; import type { AbilityId } from "#enums/ability-id"; -import type { BattlerIndex } from "#enums/battler-index"; import type { PokemonType } from "#enums/pokemon-type"; import { Stat } from "#enums/stat"; import type { EnemyPokemon, PlayerPokemon, Pokemon } from "#field/pokemon"; @@ -45,18 +44,21 @@ export class FieldHelper extends GameManagerHelper { } /** - * @returns The {@linkcode BattlerIndex | indexes} of Pokemon on the field in order of decreasing Speed. + * Helper function to return all on-field {@linkcode Pokemon} in speed order (fastest first). + * @returns An array containing all {@linkcode Pokemon} on the field in order of descending Speed. * Speed ties are returned in increasing order of index. * * @remarks * This does not account for Trick Room as it does not modify the _speed_ of Pokemon on the field, * only their turn order. */ - public getSpeedOrder(): BattlerIndex[] { + public getSpeedOrder(): Pokemon[] { return this.game.scene .getField(true) - .sort((pA, pB) => pB.getEffectiveStat(Stat.SPD) - pA.getEffectiveStat(Stat.SPD)) - .map(p => p.getBattlerIndex()); + .sort( + (pA, pB) => + pB.getEffectiveStat(Stat.SPD) - pA.getEffectiveStat(Stat.SPD) || pA.getBattlerIndex() - pB.getBattlerIndex(), + ); } /** diff --git a/test/test-utils/helpers/move-helper.ts b/test/test-utils/helpers/move-helper.ts index 15605edf31d..041df916cbf 100644 --- a/test/test-utils/helpers/move-helper.ts +++ b/test/test-utils/helpers/move-helper.ts @@ -325,10 +325,16 @@ export class MoveHelper extends GameManagerHelper { } /** - * Force the move used by Metronome to be a specific move. - * @param move - The move to force metronome to use - * @param once - If `true`, uses {@linkcode MockInstance#mockReturnValueOnce} when mocking, else uses {@linkcode MockInstance#mockReturnValue}. + * Force the next move(s) used by Metronome to be a specific move. \ + * Triggers during the next upcoming {@linkcode MoveEffectPhase} that Metronome is used. + * @param move - The move to force Metronome to call + * @param once - If `true`, mocks the return value exactly once; default `false` * @returns The spy that for Metronome that was mocked (Usually unneeded). + * @example + * ```ts + * game.move.use(MoveId.METRONOME); + * game.move.forceMetronomeMove(MoveId.FUTURE_SIGHT); // Can be in any order + * ``` */ public forceMetronomeMove(move: MoveId, once = false): MockInstance { const spy = vi.spyOn(allMoves[MoveId.METRONOME].getAttrs("RandomMoveAttr")[0], "getMoveOverride"); diff --git a/test/test-utils/phase-interceptor.ts b/test/test-utils/phase-interceptor.ts index e0675a722f9..50de7e9f047 100644 --- a/test/test-utils/phase-interceptor.ts +++ b/test/test-utils/phase-interceptor.ts @@ -37,6 +37,7 @@ import { NextEncounterPhase } from "#phases/next-encounter-phase"; import { PartyExpPhase } from "#phases/party-exp-phase"; import { PartyHealPhase } from "#phases/party-heal-phase"; import { PokemonTransformPhase } from "#phases/pokemon-transform-phase"; +import { PositionalTagPhase } from "#phases/positional-tag-phase"; import { PostGameOverPhase } from "#phases/post-game-over-phase"; import { PostSummonPhase } from "#phases/post-summon-phase"; import { QuietFormChangePhase } from "#phases/quiet-form-change-phase"; @@ -142,6 +143,7 @@ export class PhaseInterceptor { [LevelCapPhase, this.startPhase], [AttemptRunPhase, this.startPhase], [SelectBiomePhase, this.startPhase], + [PositionalTagPhase, this.startPhase], [PokemonTransformPhase, this.startPhase], [MysteryEncounterPhase, this.startPhase], [MysteryEncounterOptionSelectedPhase, this.startPhase], diff --git a/test/types/positional-tags.test-d.ts b/test/types/positional-tags.test-d.ts new file mode 100644 index 00000000000..a75cc291764 --- /dev/null +++ b/test/types/positional-tags.test-d.ts @@ -0,0 +1,29 @@ +import type { SerializedPositionalTag, serializedPosTagMap } from "#data/positional-tags/load-positional-tag"; +import type { DelayedAttackTag, WishTag } from "#data/positional-tags/positional-tag"; +import type { PositionalTagType } from "#enums/positional-tag-type"; +import type { Mutable, NonFunctionPropertiesRecursive } from "#types/type-helpers"; +import { describe, expectTypeOf, it } from "vitest"; + +// Needed to get around properties being readonly in certain classes +type NonFunctionMutable = Mutable>; + +describe("serializedPositionalTagMap", () => { + it("should contain representations of each tag's serialized form", () => { + expectTypeOf().branded.toEqualTypeOf< + NonFunctionMutable + >(); + expectTypeOf().branded.toEqualTypeOf>(); + }); +}); + +describe("SerializedPositionalTag", () => { + it("should accept a union of all serialized tag forms", () => { + expectTypeOf().branded.toEqualTypeOf< + NonFunctionMutable | NonFunctionMutable + >(); + }); + it("should accept a union of all unserialized tag forms", () => { + expectTypeOf().toExtend(); + expectTypeOf().toExtend(); + }); +}); From 8b304adf1400af77fc40ff6030e905eab82d069a Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Thu, 31 Jul 2025 02:27:54 -0400 Subject: [PATCH 049/106] [Refactor] Added `PhaseManager.toTitleScreen` (#6114) * Added `toTitlePhase`; documented phase manager * Documented phase methods * Fixed syntax errors + updated signature * Reverted all the goodies * Fixed missing shift phase call GHAG * Reverted change --- src/battle-scene.ts | 7 ++----- src/enums/dynamic-phase-type.ts | 3 ++- src/phase-manager.ts | 15 +++++++++++++++ src/phases/select-starter-phase.ts | 7 ++++--- src/phases/title-phase.ts | 11 ++++++----- src/ui/challenges-select-ui-handler.ts | 3 +-- src/ui/starter-select-ui-handler.ts | 16 +++++++++------- test/test-utils/game-manager.ts | 5 +---- 8 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 275f129a63a..9af954c3852 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -657,9 +657,7 @@ export class BattleScene extends SceneBase { ).then(() => loadMoveAnimAssets(defaultMoves, true)), this.initStarterColors(), ]).then(() => { - this.phaseManager.pushNew("LoginPhase"); - this.phaseManager.pushNew("TitlePhase"); - + this.phaseManager.toTitleScreen(true); this.phaseManager.shiftPhase(); }); } @@ -1269,13 +1267,12 @@ export class BattleScene extends SceneBase { duration: 250, ease: "Sine.easeInOut", onComplete: () => { - this.phaseManager.clearPhaseQueue(); - this.ui.freeUIData(); this.uiContainer.remove(this.ui, true); this.uiContainer.destroy(); this.children.removeAll(true); this.game.domContainer.innerHTML = ""; + // TODO: `launchBattle` calls `reset(false, false, true)` this.launchBattle(); }, }); diff --git a/src/enums/dynamic-phase-type.ts b/src/enums/dynamic-phase-type.ts index a34ac371668..b9ea6bf197d 100644 --- a/src/enums/dynamic-phase-type.ts +++ b/src/enums/dynamic-phase-type.ts @@ -1,6 +1,7 @@ /** - * Enum representation of the phase types held by implementations of {@linkcode PhasePriorityQueue} + * Enum representation of the phase types held by implementations of {@linkcode PhasePriorityQueue}. */ +// TODO: We currently assume these are in order export enum DynamicPhaseType { POST_SUMMON } diff --git a/src/phase-manager.ts b/src/phase-manager.ts index 37edeae7e42..850f0c564ea 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -244,6 +244,21 @@ export class PhaseManager { this.dynamicPhaseTypes = [PostSummonPhase]; } + /** + * Clear all previously set phases, then add a new {@linkcode TitlePhase} to transition to the title screen. + * @param addLogin - Whether to add a new {@linkcode LoginPhase} before the {@linkcode TitlePhase} + * (but reset everything else). + * Default `false` + */ + public toTitleScreen(addLogin = false): void { + this.clearAllPhases(); + + if (addLogin) { + this.unshiftNew("LoginPhase"); + } + this.unshiftNew("TitlePhase"); + } + /* Phase Functions */ getCurrentPhase(): Phase | null { return this.currentPhase; diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index af056ebb4ee..6456bacd0e3 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -24,10 +24,11 @@ export class SelectStarterPhase extends Phase { globalScene.ui.setMode(UiMode.STARTER_SELECT, (starters: Starter[]) => { globalScene.ui.clearText(); globalScene.ui.setMode(UiMode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: number) => { + // If clicking cancel, back out to title screen if (slotId === -1) { - globalScene.phaseManager.clearPhaseQueue(); - globalScene.phaseManager.pushNew("TitlePhase"); - return this.end(); + globalScene.phaseManager.toTitleScreen(); + this.end(); + return; } globalScene.sessionSlotId = slotId; this.initBattle(starters); diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index 38e3ff3a017..6f0493f707d 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -114,11 +114,11 @@ export class TitlePhase extends Phase { }); } } + // Cancel button = back to title options.push({ label: i18next.t("menu:cancel"), handler: () => { - globalScene.phaseManager.clearPhaseQueue(); - globalScene.phaseManager.pushNew("TitlePhase"); + globalScene.phaseManager.toTitleScreen(); super.end(); return true; }, @@ -191,11 +191,12 @@ export class TitlePhase extends Phase { initDailyRun(): void { globalScene.ui.clearText(); globalScene.ui.setMode(UiMode.SAVE_SLOT, SaveSlotUiMode.SAVE, (slotId: number) => { - globalScene.phaseManager.clearPhaseQueue(); if (slotId === -1) { - globalScene.phaseManager.pushNew("TitlePhase"); - return super.end(); + globalScene.phaseManager.toTitleScreen(); + super.end(); + return; } + globalScene.phaseManager.clearPhaseQueue(); globalScene.sessionSlotId = slotId; const generateDaily = (seed: string) => { diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index 4f205d59de8..4a7ab7641a3 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -382,8 +382,7 @@ export class GameChallengesUiHandler extends UiHandler { this.cursorObj?.setVisible(true); this.updateChallengeArrows(this.startCursor.visible); } else { - globalScene.phaseManager.clearPhaseQueue(); - globalScene.phaseManager.pushNew("TitlePhase"); + globalScene.phaseManager.toTitleScreen(); globalScene.phaseManager.getCurrentPhase()?.end(); } success = true; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index e8f9b5e1c38..974f24e706f 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -4303,7 +4303,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { return true; } - tryExit(): boolean { + /** + * Attempt to back out of the starter selection screen into the appropriate parent modal + */ + tryExit(): void { this.blockInput = true; const ui = this.getUi(); @@ -4317,12 +4320,13 @@ export class StarterSelectUiHandler extends MessageUiHandler { UiMode.CONFIRM, () => { ui.setMode(UiMode.STARTER_SELECT); - globalScene.phaseManager.clearPhaseQueue(); - if (globalScene.gameMode.isChallenge) { + // Non-challenge modes go directly back to title, while challenge modes go to the selection screen. + if (!globalScene.gameMode.isChallenge) { + globalScene.phaseManager.toTitleScreen(); + } else { + globalScene.phaseManager.clearPhaseQueue(); globalScene.phaseManager.pushNew("SelectChallengePhase"); globalScene.phaseManager.pushNew("EncounterPhase"); - } else { - globalScene.phaseManager.pushNew("TitlePhase"); } this.clearText(); globalScene.phaseManager.getCurrentPhase()?.end(); @@ -4333,8 +4337,6 @@ export class StarterSelectUiHandler extends MessageUiHandler { 19, ); }); - - return true; } tryStart(manualTrigger = false): boolean { diff --git a/test/test-utils/game-manager.ts b/test/test-utils/game-manager.ts index b81b077b2f2..23a2e6240f8 100644 --- a/test/test-utils/game-manager.ts +++ b/test/test-utils/game-manager.ts @@ -103,12 +103,9 @@ export class GameManager { if (!firstTimeScene) { this.scene.reset(false, true); (this.scene.ui.handlers[UiMode.STARTER_SELECT] as StarterSelectUiHandler).clearStarterPreferences(); - this.scene.phaseManager.clearAllPhases(); // Must be run after phase interceptor has been initialized. - - this.scene.phaseManager.pushNew("LoginPhase"); - this.scene.phaseManager.pushNew("TitlePhase"); + this.scene.phaseManager.toTitleScreen(true); this.scene.phaseManager.shiftPhase(); this.gameWrapper.scene = this.scene; From 75ececd942a439660b4670bef1b16388183c9cf1 Mon Sep 17 00:00:00 2001 From: Tiago Rodrigues Date: Thu, 31 Jul 2025 21:14:51 +0100 Subject: [PATCH 050/106] [UI/UX] Implement Discard Button (#5985) * [feature]Implemented needed parts for discard function from issue #4780: -TryDiscardFunction in battlescene; -Created a party discard mode button; -Updated Transfer button in modifier-select-ui-handler to Manage items; -Created tests for the discard function in test/ui; -Added images for the new discard and transfer buttons to loading-scene; -Created placeholder messages for discard feature in party-ui-handler; Co-authored-by: Tiago Rodrigues * [Fix] Updated icon for dynamic messaging * [Fix] Corrected legacy mode icons and adjusted double-battle button location * [Fix]Adjusted button positioning and mapping after review. Mapping requires debugging. * [Fix] Fixed visible pokeball in legacy mode and key mapping * [Fix] Background fixes,manage menu is the only one affected by changes now * Implement i18n keys * [Fix] implemented most code optimizations and callbacks to the modified locales folder * [Fix] Implemented 3 suggestions * [Fix]improved/corrected test structure Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * [Fix] added functionality test for the discard button * [Fix] added necessary comment Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * [Fix] Implemented suggested changes in test/discard text prompt * [Fix] Implemented UI suggestions and removed discard text confirmation * [Fix] added missing imports * Fix imports in test file * [Fix] Implemented suggested cursor behavior and reworked test code * [Fix] Corrected failed test * [Fix] atempting to fix the test timeout issue * [Fix] Undoing latest attempt * [Fix] Implemented suggestions to fix broken tests * Reviews * [Fix] replaced icon images * [Fix] Updated jsons to match new icons and removed pokeball icon from legacy mode * Optimized new images * [Fix] Fixed referenced bug and added similar confirmation box to release * [Fix] Updated tests to handle the corfirmation box * [Fix] Added back the accidentally removed changes * [Fix]updated incorrect import path * [fix] add description for the manageItemMode function Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update src/ui/party-ui-handler.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * [Fix] corrected formating issue --------- Co-authored-by: Mikhail Shueb Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> Co-authored-by: damocleas Co-authored-by: Bertie690 Co-authored-by: Adri1 --- .../ui/legacy/party_bg_double_manage.png | Bin 0 -> 431 bytes public/images/ui/legacy/party_discard.json | 62 ++++ public/images/ui/legacy/party_discard.png | Bin 0 -> 346 bytes public/images/ui/legacy/party_transfer.json | 62 ++++ public/images/ui/legacy/party_transfer.png | Bin 0 -> 366 bytes public/images/ui/party_bg_double_manage.png | Bin 0 -> 837 bytes public/images/ui/party_discard.json | 62 ++++ public/images/ui/party_discard.png | Bin 0 -> 386 bytes public/images/ui/party_transfer.json | 62 ++++ public/images/ui/party_transfer.png | Bin 0 -> 403 bytes src/battle-scene.ts | 17 + src/loading-scene.ts | 3 + src/ui/modifier-select-ui-handler.ts | 6 +- src/ui/party-ui-handler.ts | 305 ++++++++++++++++-- test/ui/item-manage-button.test.ts | 172 ++++++++++ 15 files changed, 726 insertions(+), 25 deletions(-) create mode 100644 public/images/ui/legacy/party_bg_double_manage.png create mode 100644 public/images/ui/legacy/party_discard.json create mode 100644 public/images/ui/legacy/party_discard.png create mode 100644 public/images/ui/legacy/party_transfer.json create mode 100644 public/images/ui/legacy/party_transfer.png create mode 100644 public/images/ui/party_bg_double_manage.png create mode 100644 public/images/ui/party_discard.json create mode 100644 public/images/ui/party_discard.png create mode 100644 public/images/ui/party_transfer.json create mode 100644 public/images/ui/party_transfer.png create mode 100644 test/ui/item-manage-button.test.ts diff --git a/public/images/ui/legacy/party_bg_double_manage.png b/public/images/ui/legacy/party_bg_double_manage.png new file mode 100644 index 0000000000000000000000000000000000000000..2bf2d63c3154c6f6f28101d351899c3170753130 GIT binary patch literal 431 zcmeAS@N?(olHy`uVBq!ia0y~yU~~Yox3Dk+N%2!Jlz@~_fKQ04hetv}1VhIRjSU+j zPF$#X@S?*b=ny|pd4#8nV@O3@Qh?Nxge#3I4T0=^RsoU+_T9bh!o!*nOL7kyWVeXD&{?48nhv#qhU|MW}uTI4_ tb@7<(Q=06hADPGYS`}PrT+GM95V7FIR?(B*mcSTb@O1TaS?83{1OS1sq`m+E literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/party_discard.json b/public/images/ui/legacy/party_discard.json new file mode 100644 index 00000000000..4aa563fcd77 --- /dev/null +++ b/public/images/ui/legacy/party_discard.json @@ -0,0 +1,62 @@ +{ + "textures": [ + { + "image": "party_discard.png", + "format": "RGBA8888", + "size": { + "w": 75, + "h": 50 + }, + "scale": 1, + "frames": [ + { + "filename": "normal", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 25 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + } + }, + { + "filename": "selected", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 25 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + }, + "frame": { + "x": 0, + "y": 25, + "w": 75, + "h": 25 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:17219773dfffd6b1204d988fea3f9462:1127ad21d64bc7ebb9df4fc28f3d2d39:7ad46e8fb4648c3d3d84a746ecb371ea$" + } +} diff --git a/public/images/ui/legacy/party_discard.png b/public/images/ui/legacy/party_discard.png new file mode 100644 index 0000000000000000000000000000000000000000..d95ba6960152815beb50ca60c39624525d694622 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^-au@`!VDyz`C4B9QqloFA+A8$!y};}V#8FQiUkE9 zHYIM^X>WfdsNzR~LDCoZOrSJlNswPKgTu2MX+X|fPZ!6KinzU#4f&c4cwAo|li0!N z`ifD)!ZFa2L8w~$Da+bTX$cQ*94)kYcANRpdH?^X|CPCBO^^|EO7zp1yW4ctrpRjc zQ)NDt{1(%VI3<25T?>5Gd&aH)Mew%AXYQ%$2`_uoHU+ohq^|Dx4vhH4J>gKncQ{K+tVk|IB z724qAnzQW6tTWdNUW5aU)>P328Jz|*T0HT7@CILy(FTnWqsw001%s0{{R3=1n`$0000RP)t-s0000A z@3s)BmOz1{NJwB+u+wl@u%K}8_;4_OM|0i)0004WQchCyU5JW2wSOhr_$$dZtx}vE^;i17J2$gm1XP1}TRL<_xFEf|S-UaT88-{D)nHBM> zyNiWAR)NJ~NzmwA*Ch+>Noz&eHS4(2xpckPO6RpZ8ANN*I>_^&HA|a&N8@eCgVHea zLSXM`OP)KB8hB~8m3kX%Rex>n#R_a{+8{O!T}braXmtty1&CM>u;8nBhb%m^B3}J< zv9Qk}usAFU8lA_nC!xJ)tqB{Gjw_ve(|WCRj?Kv=T8q{|+9s`8+SWQ6Z$qAxhLLsx zTSwc|)_~N&OS7%i+gPjqYg;Q;U{lj3v1#Z+qW4CtOZYE9!~);?0S@8G#sK zXvnGQD=I1~X&Gy3Y8qHL8X6j!7`R%Pcv@OoIypIcx<-0=c?AUpMMXs=CnrzLKDC#D zf$5;9i(^Q|t+#jY_FXm*V7uV(LZIoi*n_|Gr*=1mX#HZIY_hF*-|VcX-S6aX-aR4b z-~MsV;q}*lzIxvL@%Lk9g$4#jCKi?g?E{DB&*cA}{6{Nofhv!Hf`bD$quZInb0v>W z&F@(!OexZOE|b6K*|EjW2YxCoziM1Q{j{V+>RZVOuj}4FL>rb@{NY~rU2@NZA88G$ za*W4zz2ASKB8M$v+3$wHSqy({1VAqKXrj*2Iu>gZoA447&556?_@df#&x#TwlC3ZC(0c! zoO5{LrTteu@(cBDAKm$(Hq1;XRZF7W@O3re@0pMlI)k#!bfcYRAmHajDjDvbhR^|6J zf1UJ7n)$=Q3Wk`kJ}e6!DK)%ezRDhT2o&5PW8E9xaqrg8;q3qA@qUNfE-Q!HCFM*j z`oDa7eu&{K{}uZSLTo@~4zNJroIdyK#C1#aeKyxFSq-%JZQM`(+9krKm$rWC&D{Ob zkKxb%Uk>+;=B(ylvpC=9wRgqmeTK3OWnbBWwq39|aQzCqS>*ii;MxU}X`IYJ2Lya> z$o)R?p4^77c9(v!r~UTGw_&z^q0Afb-3*)}BEC$#=6(z6hHaarm~z&*?K-t+cQE(P zNco6^Go4SHUgGPWa|#qj7cMtUI>Yao`a^Fe&wZ7t4_7ZS+T*EpSR5##vyx{%P-O8E vqnZgJZQmzx0ps1;^JrdI2NayB`y{-Z-FxlHe76_C{J`Mp>gTe~DWM4f{^n*n literal 0 HcmV?d00001 diff --git a/public/images/ui/party_discard.json b/public/images/ui/party_discard.json new file mode 100644 index 00000000000..4aa563fcd77 --- /dev/null +++ b/public/images/ui/party_discard.json @@ -0,0 +1,62 @@ +{ + "textures": [ + { + "image": "party_discard.png", + "format": "RGBA8888", + "size": { + "w": 75, + "h": 50 + }, + "scale": 1, + "frames": [ + { + "filename": "normal", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 25 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + } + }, + { + "filename": "selected", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 25 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + }, + "frame": { + "x": 0, + "y": 25, + "w": 75, + "h": 25 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:17219773dfffd6b1204d988fea3f9462:1127ad21d64bc7ebb9df4fc28f3d2d39:7ad46e8fb4648c3d3d84a746ecb371ea$" + } +} diff --git a/public/images/ui/party_discard.png b/public/images/ui/party_discard.png new file mode 100644 index 0000000000000000000000000000000000000000..e56c845eadccfb9462418fa7c67996915e793d40 GIT binary patch literal 386 zcmV-|0e$|7P)001%s0{{R3=1n`$0000dP)t-s00008 zT8s#cwILxXIXO~hR)TYLgn2wkoSdz#&epjR*P_;X9!G-PkFWl(aN~a zFF_a-4bh4KT17)NUIEbpP&7oFSmRBRZJD%h&YE%!Bjp;x;s3ULrb(k4f~td}+4jx4 gy~bOxUY7Ar|BwSDE^sg}CjbBd07*qoM6N<$f{o9q?EnA( literal 0 HcmV?d00001 diff --git a/public/images/ui/party_transfer.json b/public/images/ui/party_transfer.json new file mode 100644 index 00000000000..7cfcf5ccc30 --- /dev/null +++ b/public/images/ui/party_transfer.json @@ -0,0 +1,62 @@ +{ + "textures": [ + { + "image": "party_transfer.png", + "format": "RGBA8888", + "size": { + "w": 75, + "h": 50 + }, + "scale": 1, + "frames": [ + { + "filename": "normal", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 25 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + }, + "frame": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + } + }, + { + "filename": "selected", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 25 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 25 + }, + "frame": { + "x": 0, + "y": 25, + "w": 75, + "h": 25 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:17219773dfffd6b1204d988fea3f9462:1127ad21d64bc7ebb9df4fc28f3d2d39:7ad46e8fb4648c3d3d84a746ecb371ea$" + } +} diff --git a/public/images/ui/party_transfer.png b/public/images/ui/party_transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..45815a156b5a97589eee9d390fcf242f16862a39 GIT binary patch literal 403 zcmV;E0c`$>P)001%s0{{R3=1n`$0000dP)t-s00008 zT8s#cwF#x63h%ZMsg@xjDJ5}qIXO~ubA+6nt*y@1|NsB4BSDG)0004WQchC>zWWkSeKMRky!inK$sX415(GDDK{9D=5T9(R{oRhE$v-rtT}O`=&f~C?S{shz zNohPBcxJJq1GG^W)PyS_6trt!4C5gOYdceaK}hZ;0?8}6-VpFJrMr+t2@YGWKR zCuJPzyDvAyyKnyOMV!R@vb^sUtRxFqzmF(*QHzpE%cJ;YPHp{KCMI)eNP8w8E#8xK zE44f>la11tmR6 0) { + return true; + } + + return this.removeModifier(itemModifier); + } canTransferHeldItemModifier(itemModifier: PokemonHeldItemModifier, target: Pokemon, transferQuantity = 1): boolean { const mod = itemModifier.clone() as PokemonHeldItemModifier; diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 706ea01a16a..c5b0263e785 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -119,6 +119,7 @@ export class LoadingScene extends SceneBase { this.loadImage("party_bg", "ui"); this.loadImage("party_bg_double", "ui"); + this.loadImage("party_bg_double_manage", "ui"); this.loadAtlas("party_slot_main", "ui"); this.loadAtlas("party_slot", "ui"); this.loadImage("party_slot_overlay_lv", "ui"); @@ -126,6 +127,8 @@ export class LoadingScene extends SceneBase { this.loadAtlas("party_slot_hp_overlay", "ui"); this.loadAtlas("party_pb", "ui"); this.loadAtlas("party_cancel", "ui"); + this.loadAtlas("party_discard", "ui"); + this.loadAtlas("party_transfer", "ui"); this.loadImage("summary_bg", "ui"); this.loadImage("summary_overlay_shiny", "ui"); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 50d88738d32..16eecf6993d 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -69,7 +69,7 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { if (context) { context.font = styleOptions.fontSize + "px " + styleOptions.fontFamily; - this.transferButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:transfer")).width; + this.transferButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:manageItems")).width; this.checkButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:checkTeam")).width; } @@ -81,7 +81,7 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { this.transferButtonContainer.setVisible(false); ui.add(this.transferButtonContainer); - const transferButtonText = addTextObject(-4, -2, i18next.t("modifierSelectUiHandler:transfer"), TextStyle.PARTY); + const transferButtonText = addTextObject(-4, -2, i18next.t("modifierSelectUiHandler:manageItems"), TextStyle.PARTY); transferButtonText.setName("text-transfer-btn"); transferButtonText.setOrigin(1, 0); this.transferButtonContainer.add(transferButtonText); @@ -601,7 +601,7 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { (globalScene.game.canvas.width - this.transferButtonWidth - this.checkButtonWidth) / 6 - 30, OPTION_BUTTON_YPOSITION + 4, ); - ui.showText(i18next.t("modifierSelectUiHandler:transferDesc")); + ui.showText(i18next.t("modifierSelectUiHandler:manageItemsDesc")); } else if (cursor === 2) { this.cursorObj.setPosition( (globalScene.game.canvas.width - this.checkButtonWidth) / 6 - 10, diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 915cc76fd73..b259316f6fa 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -103,6 +103,11 @@ export enum PartyUiMode { * This is generally used in for Mystery Encounter or special effects that require the player to select a Pokemon */ SELECT, + /** + * Indicates that the party UI is open to select a party member from which items will be discarded. + * This type of selection can be cancelled. + */ + DISCARD, } export enum PartyOption { @@ -121,6 +126,7 @@ export enum PartyOption { RELEASE, RENAME, SELECT, + DISCARD, SCROLL_UP = 1000, SCROLL_DOWN = 1001, FORM_CHANGE_ITEM = 2000, @@ -155,6 +161,7 @@ export class PartyUiHandler extends MessageUiHandler { private partySlotsContainer: Phaser.GameObjects.Container; private partySlots: PartySlot[]; private partyCancelButton: PartyCancelButton; + private partyDiscardModeButton: PartyDiscardModeButton; private partyMessageBox: Phaser.GameObjects.NineSlice; private moveInfoOverlay: MoveInfoOverlay; @@ -180,6 +187,8 @@ export class PartyUiHandler extends MessageUiHandler { private transferAll: boolean; private lastCursor = 0; + private lastLeftPokemonCursor = 0; + private lastRightPokemonCursor = 0; private selectCallback: PartySelectCallback | PartyModifierTransferSelectCallback | null; private selectFilter: PokemonSelectFilter | PokemonModifierTransferSelectFilter; private moveSelectFilter: PokemonMoveSelectFilter; @@ -308,6 +317,12 @@ export class PartyUiHandler extends MessageUiHandler { this.iconAnimHandler = new PokemonIconAnimHandler(); this.iconAnimHandler.setup(); + const partyDiscardModeButton = new PartyDiscardModeButton(60, -globalScene.game.canvas.height / 15 - 1, this); + + partyContainer.add(partyDiscardModeButton); + + this.partyDiscardModeButton = partyDiscardModeButton; + // prepare move overlay. in case it appears to be too big, set the overlayScale to .5 const overlayScale = 1; this.moveInfoOverlay = new MoveInfoOverlay({ @@ -349,8 +364,18 @@ export class PartyUiHandler extends MessageUiHandler { this.showMovePp = args.length > 6 && args[6]; this.partyContainer.setVisible(true); - this.partyBg.setTexture(`party_bg${globalScene.currentBattle.double ? "_double" : ""}`); + if (this.isItemManageMode()) { + this.partyBg.setTexture(`party_bg${globalScene.currentBattle.double ? "_double_manage" : ""}`); + } else { + this.partyBg.setTexture(`party_bg${globalScene.currentBattle.double ? "_double" : ""}`); + } + this.populatePartySlots(); + // If we are currently transferring items, set the icon to its proper state and reveal the button. + if (this.isItemManageMode()) { + this.partyDiscardModeButton.toggleIcon(this.partyUiMode as PartyUiMode.MODIFIER_TRANSFER | PartyUiMode.DISCARD); + } + this.showPartyText(); this.setCursor(0); return true; @@ -595,7 +620,7 @@ export class PartyUiHandler extends MessageUiHandler { const option = this.options[this.optionsCursor]; if (button === Button.LEFT) { /** Decrease quantity for the current item and update UI */ - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { + if (this.isItemManageMode()) { this.transferQuantities[option] = this.transferQuantities[option] === 1 ? this.transferQuantitiesMax[option] @@ -609,7 +634,7 @@ export class PartyUiHandler extends MessageUiHandler { if (button === Button.RIGHT) { /** Increase quantity for the current item and update UI */ - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { + if (this.isItemManageMode()) { this.transferQuantities[option] = this.transferQuantities[option] === this.transferQuantitiesMax[option] ? 1 @@ -639,6 +664,45 @@ export class PartyUiHandler extends MessageUiHandler { return success; } + private processDiscardMenuInput(pokemon: PlayerPokemon) { + const ui = this.getUi(); + const option = this.options[this.optionsCursor]; + this.clearOptions(); + + this.blockInput = true; + this.showText(i18next.t("partyUiHandler:discardConfirmation"), null, () => { + this.blockInput = false; + ui.setModeWithoutClear( + UiMode.CONFIRM, + () => { + ui.setMode(UiMode.PARTY); + this.doDiscard(option, pokemon); + }, + () => { + ui.setMode(UiMode.PARTY); + this.showPartyText(); + }, + ); + }); + + return true; + } + + private doDiscard(option: PartyOption, pokemon: PlayerPokemon) { + const itemModifiers = this.getTransferrableItemsFromPokemon(pokemon); + this.clearOptions(); + + if (option === PartyOption.ALL) { + // Discard all currently held items + for (let i = 0; i < itemModifiers.length; i++) { + globalScene.tryDiscardHeldItemModifier(itemModifiers[i], this.transferQuantities[i]); + } + } else { + // Discard the currently selected item + globalScene.tryDiscardHeldItemModifier(itemModifiers[option], this.transferQuantities[option]); + } + } + private moveOptionCursor(button: Button.UP | Button.DOWN): boolean { if (button === Button.UP) { return this.setCursor(this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1); @@ -725,6 +789,10 @@ export class PartyUiHandler extends MessageUiHandler { return this.processModifierTransferModeInput(pokemon); } + if (this.partyUiMode === PartyUiMode.DISCARD) { + return this.processDiscardMenuInput(pokemon); + } + // options specific to the mode (moves) if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) { return this.processRememberMoveModeInput(pokemon); @@ -864,7 +932,7 @@ export class PartyUiHandler extends MessageUiHandler { } if (button === Button.LEFT || button === Button.RIGHT) { - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { + if (this.isItemManageMode()) { return this.processModifierTransferModeLeftRightInput(button); } } @@ -919,10 +987,22 @@ export class PartyUiHandler extends MessageUiHandler { return !(this.partyUiMode === PartyUiMode.FAINT_SWITCH || this.partyUiMode === PartyUiMode.REVIVAL_BLESSING); } + /** + * Return whether this UI handler is responsible for managing items. + * Used to ensure proper placement of mode toggle buttons in the UI, etc. + * @returns Whether the current handler is responsible for managing items. + */ + private isItemManageMode(): boolean { + return this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER || this.partyUiMode === PartyUiMode.DISCARD; + } + private processPartyActionInput(): boolean { const ui = this.getUi(); if (this.cursor < 6) { - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode) { + if ( + (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && !this.transferMode) || + this.partyUiMode === PartyUiMode.DISCARD + ) { /** Initialize item quantities for the selected Pokemon */ const itemModifiers = globalScene.findModifiers( m => @@ -936,6 +1016,25 @@ export class PartyUiHandler extends MessageUiHandler { this.showOptions(); ui.playSelect(); } + + // Toggle item transfer mode to discard items or vice versa + if (this.cursor === 7) { + switch (this.partyUiMode) { + case PartyUiMode.DISCARD: + this.partyUiMode = PartyUiMode.MODIFIER_TRANSFER; + break; + case PartyUiMode.MODIFIER_TRANSFER: + this.partyUiMode = PartyUiMode.DISCARD; + break; + default: + ui.playError(); + return false; + } + this.partyDiscardModeButton.toggleIcon(this.partyUiMode); + ui.playSelect(); + return true; + } + // Pressing return button if (this.cursor === 6) { if (!this.allowCancel()) { @@ -956,6 +1055,7 @@ export class PartyUiHandler extends MessageUiHandler { this.clearTransfer(); ui.playSelect(); } else if (this.allowCancel()) { + this.partyDiscardModeButton.clear(); if (this.selectCallback) { const selectCallback = this.selectCallback; this.selectCallback = null; @@ -974,30 +1074,74 @@ export class PartyUiHandler extends MessageUiHandler { const slotCount = this.partySlots.length; const battlerCount = globalScene.currentBattle.getBattlerCount(); + if (this.lastCursor < battlerCount) { + this.lastLeftPokemonCursor = this.lastCursor; + } + if (this.lastCursor >= battlerCount && this.lastCursor < 6) { + this.lastRightPokemonCursor = this.lastCursor; + } + let success = false; switch (button) { + // Item manage mode adds an extra 8th "toggle mode" button to the UI, located *below* both active party members. + // The following logic serves to ensure its menu behaviour matches its in-game position, + // being selected when scrolling up from the first inactive party member or down from the last active one. case Button.UP: + if (this.isItemManageMode()) { + if (this.cursor === 1) { + success = this.setCursor(globalScene.currentBattle.double ? 0 : 7); + break; + } + if (this.cursor === 2) { + success = this.setCursor(globalScene.currentBattle.double ? 7 : 1); + break; + } + if (this.cursor === 6) { + success = this.setCursor(slotCount <= globalScene.currentBattle.getBattlerCount() ? 7 : slotCount - 1); + break; + } + if (this.cursor === 7) { + success = this.setCursor(globalScene.currentBattle.double && slotCount > 1 ? 1 : 0); + break; + } + } success = this.setCursor(this.cursor ? (this.cursor < 6 ? this.cursor - 1 : slotCount - 1) : 6); break; case Button.DOWN: + if (this.isItemManageMode()) { + if (this.cursor === 0) { + success = this.setCursor(globalScene.currentBattle.double && slotCount > 1 ? 1 : 7); + break; + } + if (this.cursor === 1) { + success = this.setCursor(globalScene.currentBattle.double ? 7 : slotCount > 2 ? 2 : 6); + break; + } + if (this.cursor === 7) { + success = this.setCursor( + slotCount > globalScene.currentBattle.getBattlerCount() ? globalScene.currentBattle.getBattlerCount() : 6, + ); + break; + } + } success = this.setCursor(this.cursor < 6 ? (this.cursor < slotCount - 1 ? this.cursor + 1 : 6) : 0); break; case Button.LEFT: - if (this.cursor >= battlerCount && this.cursor <= 6) { - success = this.setCursor(0); + if (this.cursor === 6) { + success = this.setCursor(this.isItemManageMode() ? 7 : this.lastLeftPokemonCursor); + } + if (this.cursor >= battlerCount && this.cursor < 6) { + success = this.setCursor(this.lastLeftPokemonCursor); } break; case Button.RIGHT: - if (slotCount === battlerCount) { + // Scrolling right from item transfer button or with no backup party members goes to cancel + if (this.cursor === 7 || slotCount <= battlerCount) { success = this.setCursor(6); break; } - if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1) { - success = this.setCursor(2); - break; - } - if (slotCount > battlerCount && this.cursor < battlerCount) { - success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); + if (this.cursor < battlerCount) { + success = this.setCursor(this.lastRightPokemonCursor || battlerCount); break; } } @@ -1044,11 +1188,15 @@ export class PartyUiHandler extends MessageUiHandler { this.partySlots[this.lastCursor].deselect(); } else if (this.lastCursor === 6) { this.partyCancelButton.deselect(); + } else if (this.lastCursor === 7) { + this.partyDiscardModeButton.deselect(); } if (cursor < 6) { this.partySlots[cursor].select(); } else if (cursor === 6) { this.partyCancelButton.select(); + } else if (cursor === 7) { + this.partyDiscardModeButton.select(); } } return changed; @@ -1143,14 +1291,16 @@ export class PartyUiHandler extends MessageUiHandler { optionsMessage = i18next.t("partyUiHandler:selectAnotherPokemonToSplice"); } break; + case PartyUiMode.DISCARD: + optionsMessage = i18next.t("partyUiHandler:changeQuantityDiscard"); } this.showText(optionsMessage, 0); this.updateOptions(); - /** When an item is being selected for transfer, the message box is taller as the message occupies two lines */ - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { + /** When an item is being selected for transfer or discard, the message box is taller as the message occupies two lines */ + if (this.isItemManageMode()) { this.partyMessageBox.setSize(262 - Math.max(this.optionsBg.displayWidth - 56, 0), 42); } else { this.partyMessageBox.setSize(262 - Math.max(this.optionsBg.displayWidth - 56, 0), 30); @@ -1159,6 +1309,20 @@ export class PartyUiHandler extends MessageUiHandler { this.setCursor(0); } + showPartyText() { + switch (this.partyUiMode) { + case PartyUiMode.MODIFIER_TRANSFER: + this.showText(i18next.t("partyUiHandler:partyTransfer")); + break; + case PartyUiMode.DISCARD: + this.showText(i18next.t("partyUiHandler:partyDiscard")); + break; + default: + this.showText("", 0); + break; + } + } + private allowBatonModifierSwitch(): boolean { return !!( this.partyUiMode !== PartyUiMode.FAINT_SWITCH && @@ -1276,6 +1440,9 @@ export class PartyUiHandler extends MessageUiHandler { this.addCommonOptions(pokemon); } break; + case PartyUiMode.DISCARD: + this.updateOptionsWithModifierTransferMode(pokemon); + break; // TODO: This still needs to be broken up. // It could use a rework differentiating different kind of switches // to treat baton passing separately from switching on faint. @@ -1381,7 +1548,8 @@ export class PartyUiHandler extends MessageUiHandler { optionName = "↓"; } else if ( (this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && - (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode)) || + (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode) && + this.partyUiMode !== PartyUiMode.DISCARD) || option === PartyOption.CANCEL ) { switch (option) { @@ -1444,7 +1612,7 @@ export class PartyUiHandler extends MessageUiHandler { const itemModifiers = this.getItemModifiers(pokemon); const itemModifier = itemModifiers[option]; if ( - this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER && + this.isItemManageMode() && this.transferQuantitiesMax[option] > 1 && !this.transferMode && itemModifier !== undefined && @@ -1474,7 +1642,6 @@ export class PartyUiHandler extends MessageUiHandler { optionText.x = 15 - this.optionsBg.width; } } - startTransfer(): void { this.transferMode = true; this.transferCursor = this.cursor; @@ -1608,7 +1775,7 @@ export class PartyUiHandler extends MessageUiHandler { this.eraseOptionsCursor(); this.partyMessageBox.setSize(262, 30); - this.showText("", 0); + this.showPartyText(); } eraseOptionsCursor() { @@ -1663,7 +1830,9 @@ class PartySlot extends Phaser.GameObjects.Container { ? -184 + (globalScene.currentBattle.double ? -40 : 0) + (28 + (globalScene.currentBattle.double ? 8 : 0)) * slotIndex - : -124 + (globalScene.currentBattle.double ? -8 : 0) + slotIndex * 64, + : partyUiMode === PartyUiMode.MODIFIER_TRANSFER + ? -124 + (globalScene.currentBattle.double ? -20 : 0) + slotIndex * 55 + : -124 + (globalScene.currentBattle.double ? -8 : 0) + slotIndex * 64, ); this.slotIndex = slotIndex; @@ -1918,7 +2087,6 @@ class PartySlot extends Phaser.GameObjects.Container { class PartyCancelButton extends Phaser.GameObjects.Container { private selected: boolean; - private partyCancelBg: Phaser.GameObjects.Sprite; private partyCancelPb: Phaser.GameObjects.Sprite; @@ -1965,3 +2133,96 @@ class PartyCancelButton extends Phaser.GameObjects.Container { this.partyCancelPb.setFrame("party_pb"); } } + +class PartyDiscardModeButton extends Phaser.GameObjects.Container { + private selected: boolean; + private transferIcon: Phaser.GameObjects.Sprite; + private discardIcon: Phaser.GameObjects.Sprite; + private textBox: Phaser.GameObjects.Text; + private party: PartyUiHandler; + + constructor(x: number, y: number, party: PartyUiHandler) { + super(globalScene, x, y); + + this.setup(party); + } + + setup(party: PartyUiHandler) { + this.transferIcon = globalScene.add.sprite(0, 0, "party_transfer"); + this.discardIcon = globalScene.add.sprite(0, 0, "party_discard"); + this.textBox = addTextObject(-8, -7, i18next.t("partyUiHandler:TRANSFER"), TextStyle.PARTY); + this.party = party; + + this.add(this.transferIcon); + this.add(this.discardIcon); + this.add(this.textBox); + + this.clear(); + } + + select() { + if (this.selected) { + return; + } + + this.selected = true; + + this.party.showText(i18next.t("partyUiHandler:changeMode")); + + this.transferIcon.setFrame("selected"); + this.discardIcon.setFrame("selected"); + } + + deselect() { + if (!this.selected) { + return; + } + + this.selected = false; + this.party.showPartyText(); + + this.transferIcon.setFrame("normal"); + this.discardIcon.setFrame("normal"); + } + + /** + * If the current mode deals with transferring items, toggle the discard items button's name and assets. + * @param partyMode - The current {@linkcode PartyUiMode} + * @remarks + * This will also reveal the button if it is currently hidden. + */ + public toggleIcon(partyMode: PartyUiMode.MODIFIER_TRANSFER | PartyUiMode.DISCARD): void { + this.setActive(true).setVisible(true); + switch (partyMode) { + case PartyUiMode.MODIFIER_TRANSFER: + this.transferIcon.setVisible(true); + this.discardIcon.setVisible(false); + this.textBox.setVisible(true); + this.textBox.setText(i18next.t("partyUiHandler:TRANSFER")); + this.setPosition( + globalScene.currentBattle.double ? 64 : 60, + globalScene.currentBattle.double ? -48 : -globalScene.game.canvas.height / 15 - 1, + ); + this.transferIcon.displayWidth = this.textBox.text.length * 9 + 3; + break; + case PartyUiMode.DISCARD: + this.transferIcon.setVisible(false); + this.discardIcon.setVisible(true); + this.textBox.setVisible(true); + this.textBox.setText(i18next.t("partyUiHandler:DISCARD")); + this.setPosition( + globalScene.currentBattle.double ? 64 : 60, + globalScene.currentBattle.double ? -48 : -globalScene.game.canvas.height / 15 - 1, + ); + this.discardIcon.displayWidth = this.textBox.text.length * 9 + 3; + break; + } + } + + clear() { + this.setActive(false).setVisible(false); + this.transferIcon.setVisible(false); + this.discardIcon.setVisible(false); + this.textBox.setVisible(false); + } +} diff --git a/test/ui/item-manage-button.test.ts b/test/ui/item-manage-button.test.ts new file mode 100644 index 00000000000..a7ea76918a5 --- /dev/null +++ b/test/ui/item-manage-button.test.ts @@ -0,0 +1,172 @@ +import { BerryType } from "#enums/berry-type"; +import { Button } from "#enums/buttons"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { UiMode } from "#enums/ui-mode"; +import type { Pokemon } from "#field/pokemon"; +import { GameManager } from "#test/test-utils/game-manager"; +import type { ModifierSelectUiHandler } from "#ui/modifier-select-ui-handler"; +import type { PartyUiHandler } from "#ui/party-ui-handler"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("UI - Transfer Items", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + game.override + .battleStyle("single") + .startingLevel(100) + .startingHeldItems([ + { name: "BERRY", count: 1, type: BerryType.SITRUS }, + { name: "BERRY", count: 2, type: BerryType.APICOT }, + { name: "BERRY", count: 2, type: BerryType.LUM }, + ]) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyMoveset(MoveId.SPLASH); + + await game.classicMode.startBattle([SpeciesId.RAYQUAZA, SpeciesId.RAYQUAZA, SpeciesId.RAYQUAZA]); + + game.move.use(MoveId.DRAGON_CLAW); + + await game.phaseInterceptor.to("SelectModifierPhase"); + }); + + it("manage button exists in the proper screen", async () => { + let handlerLength: Phaser.GameObjects.GameObject[] | undefined; + + await new Promise(resolve => { + //select manage items menu + game.onNextPrompt("SelectModifierPhase", UiMode.MODIFIER_SELECT, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + + handler.processInput(Button.DOWN); + handler.setCursor(1); + handler.processInput(Button.ACTION); + }); + + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + handler.processInput(Button.DOWN); + handler.processInput(Button.ACTION); + handlerLength = handler.optionsContainer.list; + + handler.processInput(Button.CANCEL); + + resolve(); + }); + }); + + expect(handlerLength).toHaveLength(0); // should select manage button, which has no menu + }); + + it("manage button doesn't exist in the other screens", async () => { + let handlerLength: Phaser.GameObjects.GameObject[] | undefined; + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.MODIFIER_SELECT, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + + handler.processInput(Button.DOWN); + handler.setCursor(2); + handler.processInput(Button.ACTION); + }); + + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + handler.processInput(Button.DOWN); + handler.processInput(Button.ACTION); + handlerLength = handler.optionsContainer.list; + + handler.processInput(Button.CANCEL); + handler.processInput(Button.CANCEL); + + resolve(); + }); + }); + + expect(handlerLength).toHaveLength(6); // should select 2nd pokemon (length is 5 options + image) + }); + + // Test that the manage button actually discards items, needs proofreading + it("should discard items when button is selected", async () => { + let pokemon: Pokemon | undefined; + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.MODIFIER_SELECT, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + + handler.processInput(Button.DOWN); + handler.setCursor(1); + handler.processInput(Button.ACTION); + }); + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + + // Enter discard mode and select first party member + handler.setCursor(7); + handler.processInput(Button.ACTION); + handler.setCursor(0); + handler.processInput(Button.ACTION); + pokemon = game.field.getPlayerPokemon(); + + resolve(); + }); + }); + + expect(pokemon).toBeDefined(); + if (pokemon) { + expect(pokemon.getHeldItems()).toHaveLength(3); + expect(pokemon.getHeldItems().map(h => h.stackCount)).toEqual([1, 2, 2]); + } + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + handler.processInput(Button.ACTION); + resolve(); + }); + }); + + await new Promise(resolve => { + game.onNextPrompt("SelectModifierPhase", UiMode.PARTY, async () => { + await new Promise(r => setTimeout(r, 100)); + const handler = game.scene.ui.getHandler() as PartyUiHandler; + handler.processInput(Button.ACTION); + + pokemon = game.field.getPlayerPokemon(); + + handler.processInput(Button.CANCEL); + resolve(); + }); + }); + + expect(pokemon).toBeDefined(); + if (pokemon) { + // Sitrus berry was discarded, leaving 2 stacks of 2 berries behind + expect(pokemon.getHeldItems()).toHaveLength(2); + expect(pokemon.getHeldItems().map(h => h.stackCount)).toEqual([2, 2]); + } + }); +}); From 901f6a6812d77e0ae0bfc5883f690dd62b47d047 Mon Sep 17 00:00:00 2001 From: Acelynn Zhang <102631387+acelynnzhang@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:18:11 -0400 Subject: [PATCH 051/106] [Bug] Fix Truant behavior (#6171) --- src/data/battler-tags.ts | 2 +- test/abilities/truant.test.ts | 72 +++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 test/abilities/truant.test.ts diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index e21065c184f..f3cfe4e7d99 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2038,7 +2038,7 @@ export class TruantTag extends AbilityBattlerTag { const lastMove = pokemon.getLastXMoves()[0]; - if (!lastMove) { + if (!lastMove || lastMove.move === MoveId.NONE) { // Don't interrupt move if last move was `Moves.NONE` OR no prior move was found return true; } diff --git a/test/abilities/truant.test.ts b/test/abilities/truant.test.ts new file mode 100644 index 00000000000..0d71cd393b0 --- /dev/null +++ b/test/abilities/truant.test.ts @@ -0,0 +1,72 @@ +import { getPokemonNameWithAffix } from "#app/messages"; +import { AbilityId } from "#enums/ability-id"; +import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; +import { SpeciesId } from "#enums/species-id"; +import { GameManager } from "#test/test-utils/game-manager"; +import i18next from "i18next"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Ability - Truant", () => { + 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 + .battleStyle("single") + .criticalHits(false) + .moveset([MoveId.SPLASH, MoveId.TACKLE]) + .ability(AbilityId.TRUANT) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH); + }); + + it("should loaf around and prevent using moves every other turn", async () => { + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); + + // Turn 1: Splash succeeds + game.move.select(MoveId.SPLASH); + await game.toNextTurn(); + + expect(player.getLastXMoves(1)[0]).toEqual( + expect.objectContaining({ move: MoveId.SPLASH, result: MoveResult.SUCCESS }), + ); + + // Turn 2: Truant activates, cancelling tackle and displaying message + game.move.select(MoveId.TACKLE); + await game.toNextTurn(); + + expect(player.getLastXMoves(1)[0]).toEqual(expect.objectContaining({ move: MoveId.NONE, result: MoveResult.FAIL })); + expect(enemy.hp).toBe(enemy.getMaxHp()); + expect(game.textInterceptor.logs).toContain( + i18next.t("battlerTags:truantLapse", { + pokemonNameWithAffix: getPokemonNameWithAffix(player), + }), + ); + + // Turn 3: Truant didn't activate, tackle worked + game.move.select(MoveId.TACKLE); + await game.toNextTurn(); + + expect(player.getLastXMoves(1)[0]).toEqual( + expect.objectContaining({ move: MoveId.TACKLE, result: MoveResult.SUCCESS }), + ); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); + }); +}); From c3b6e9e6b515120cd452ffc092717e22b7ca175b Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 31 Jul 2025 17:07:48 -0400 Subject: [PATCH 052/106] Update locales --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index e2fbba17ea7..5784dda3ac3 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit e2fbba17ea7a96068970ea98a8a84ed3e25b6f07 +Subproject commit 5784dda3ac3aff7f84878888ce8f6ed5443bfd88 From 12433b78e5d11af423276f7bc6a5af6234de4582 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Fri, 1 Aug 2025 00:13:05 +0200 Subject: [PATCH 053/106] [i18n] Add Tagalog language support (#6170) --- public/images/statuses_tl.json | 188 ++++++++ public/images/statuses_tl.png | Bin 0 -> 419 bytes public/images/types_tl.json | 440 ++++++++++++++++++ public/images/types_tl.png | Bin 0 -> 1861 bytes public/locales | 2 +- src/plugins/i18n.ts | 5 +- src/system/settings/settings.ts | 4 + .../settings/settings-display-ui-handler.ts | 6 + src/ui/starter-select-ui-handler.ts | 4 + src/utils/common.ts | 1 + 10 files changed, 647 insertions(+), 3 deletions(-) create mode 100644 public/images/statuses_tl.json create mode 100644 public/images/statuses_tl.png create mode 100644 public/images/types_tl.json create mode 100644 public/images/types_tl.png diff --git a/public/images/statuses_tl.json b/public/images/statuses_tl.json new file mode 100644 index 00000000000..094b0188d69 --- /dev/null +++ b/public/images/statuses_tl.json @@ -0,0 +1,188 @@ +{ + "textures": [ + { + "image": "statuses_tl.png", + "format": "RGBA8888", + "size": { + "w": 22, + "h": 64 + }, + "scale": 1, + "frames": [ + { + "filename": "pokerus", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 22, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + }, + "frame": { + "x": 0, + "y": 0, + "w": 22, + "h": 8 + } + }, + { + "filename": "burn", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 8, + "w": 20, + "h": 8 + } + }, + { + "filename": "faint", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 16, + "w": 20, + "h": 8 + } + }, + { + "filename": "freeze", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 24, + "w": 20, + "h": 8 + } + }, + { + "filename": "paralysis", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 32, + "w": 20, + "h": 8 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 40, + "w": 20, + "h": 8 + } + }, + { + "filename": "sleep", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 48, + "w": 20, + "h": 8 + } + }, + { + "filename": "toxic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 20, + "h": 8 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 20, + "h": 8 + }, + "frame": { + "x": 0, + "y": 56, + "w": 20, + "h": 8 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:37686e85605d17b806f22d43081c1139:70535ffee63ba61b3397d8470c2c8982:e6649238c018d3630e55681417c698ca$" + } +} diff --git a/public/images/statuses_tl.png b/public/images/statuses_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..9f24c6a0810ebd6ca4ecbc752e77f3ec43243352 GIT binary patch literal 419 zcmV;U0bKrxP)==ukM|a8Nin zUPJ%@00eYWPE!B?006U-W|{y10T@X{K~#8Nt<&3%!!QU0P|{BB?Oy)>XLlHZ&|-O? z77^o|xPexx+5R!aE(Jiy3b+%Xj0#nYQ;qgTfCQL zafK2f0dh0#$wV#g)>xQK^Mo53x0k48NVYV23+eOq)#CLeyMieJv6KQ@%*&1 zc+zq{psja{H5E#zKyFk5IS_=#cjI^f_s%l$&{Dk42ejj}#SsdC0B9HPz^sMvH^=9p zT`{kI`WX3`4>ofVQ12wp0KoSh%Enl@*`= z#hX}t{ql925BM0r&Vx+71Q&}ke{ZqmViJnwBiH%j#A3B%w3d?re*h(mIE1ye$|wK; N002ovPDHLkV1kAS!6N_w literal 0 HcmV?d00001 diff --git a/public/images/types_tl.json b/public/images/types_tl.json new file mode 100644 index 00000000000..2706c6f49f3 --- /dev/null +++ b/public/images/types_tl.json @@ -0,0 +1,440 @@ +{ + "textures": [ + { + "image": "types_tl.png", + "format": "RGBA8888", + "size": { + "w": 32, + "h": 280 + }, + "scale": 1, + "frames": [ + { + "filename": "unknown", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + } + }, + { + "filename": "bug", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 14, + "w": 32, + "h": 14 + } + }, + { + "filename": "dark", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 28, + "w": 32, + "h": 14 + } + }, + { + "filename": "dragon", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 42, + "w": 32, + "h": 14 + } + }, + { + "filename": "electric", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 56, + "w": 32, + "h": 14 + } + }, + { + "filename": "fairy", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 70, + "w": 32, + "h": 14 + } + }, + { + "filename": "fighting", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 84, + "w": 32, + "h": 14 + } + }, + { + "filename": "fire", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 98, + "w": 32, + "h": 14 + } + }, + { + "filename": "flying", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 112, + "w": 32, + "h": 14 + } + }, + { + "filename": "ghost", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 126, + "w": 32, + "h": 14 + } + }, + { + "filename": "grass", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 140, + "w": 32, + "h": 14 + } + }, + { + "filename": "ground", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 154, + "w": 32, + "h": 14 + } + }, + { + "filename": "ice", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 168, + "w": 32, + "h": 14 + } + }, + { + "filename": "normal", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 182, + "w": 32, + "h": 14 + } + }, + { + "filename": "poison", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 196, + "w": 32, + "h": 14 + } + }, + { + "filename": "psychic", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 210, + "w": 32, + "h": 14 + } + }, + { + "filename": "rock", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 224, + "w": 32, + "h": 14 + } + }, + { + "filename": "steel", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 238, + "w": 32, + "h": 14 + } + }, + { + "filename": "water", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 252, + "w": 32, + "h": 14 + } + }, + { + "filename": "stellar", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 14 + }, + "frame": { + "x": 0, + "y": 266, + "w": 32, + "h": 14 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f14cf47d9a8f1d40c8e03aa6ba00fff3:6fc4227b57a95d429a1faad4280f7ec8:5961efbfbf4c56b8745347e7a663a32f$" + } +} diff --git a/public/images/types_tl.png b/public/images/types_tl.png new file mode 100644 index 0000000000000000000000000000000000000000..b9fdceba7da236067f326c6ae0411d21ecc3aca6 GIT binary patch literal 1861 zcmV-L2fFx)P)w(#bTLPPF?g0TJzF&)W;aGAIh_AGV0S+vJ3(AuL^4fDElo&gWl5En=CyV`H^s7$9UM5@tAf zXfp?BNC0zCdw3yLdq{hG&Qg3B7=fm~gQZ%LLCcg-i=3_ZrBXSqrIfCEJG%e2y`@^c z!T-L{sLQ$k%;5jcUA@h+O4#N9<<_9+;Q#5mjP5u}?o}!8L3!_R@9&lW^z+{JL&|9_&Ef3f1>&ZhtW|NsBSF=(KWb6QHX@AnA+000DZQchC<00029lV+L#00qrS zL_t(|Uc8T4Zp1JQLy4Ia%3Ee_d;e3EQDO*g1@^BG6l22=F$_EJ z?G(5z?pX06tFX(bu$AHmzFvhwg+tYglL*_qBK?D(%@g1LeuZC?y~5c%oVg7_fue?r*X5*;aT1UVdHqv4afmw?wAuLy9LSD@IiV(Quc+FP~!iq1) z%R}K0Ftjj$Ap!7~@ccva220|CRpuz0Yc5iuGUmgCz|CTvix75sy~0TThsYw(h$|u? zxU)|#)av0Z2|nI_&{UEwux5ir$@|wkLwHc4G?+ zig8MPS%4RY2L>>#0Nky(f3v!SVMQQ%nw5_1LXCi&I?Y#IIf2~iXLV%(+G)E2!6=~j zKR}(JuP`SncqZck^iD6aJ_&fCd!Pf|3c$A&_n%hZU|2nXh{84-=emXXsh zphc4_7C0=&>X(12zI;N6P*7pr$LtP+TW zzTzB%4{HIa1z^era9RMq@_OQ5fFrU(tDGJH+jN$OoG!o%hX)Seu=?S9jFB4(VIaC` zD5z@eEv=gpbe^Cg$Oo3MW}c^8JsC;)*M0uKfdG65l+Cfvp})o>5o{#beGmyIBJyU!{C0bI;6y~PT@xEa?SuKz01D1$&&`XtCQ6$q*ZWr+%P z+wQPjCc>41l0%K>w#APfXQ#qdMB4=gGDF=v$|zLTVlr7ws;Vl>*=*Lf7zMRd!Np%{~g5QHxY$a-t%-rTob~bzRE`&F;ShLE)A900000NkvXXu0mjf9426$ literal 0 HcmV?d00001 diff --git a/public/locales b/public/locales index 5784dda3ac3..7898c0018a7 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 5784dda3ac3aff7f84878888ce8f6ed5443bfd88 +Subproject commit 7898c0018a70601a6ead76c9dd497ff966cc2e2a diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 89946b2691b..62fc73a10a3 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -79,13 +79,13 @@ const fonts: Array = [ face: new FontFace("emerald", "url(./fonts/pokemon-bw.ttf)", { unicodeRange: rangesByLanguage.japanese, }), - only: ["en", "es", "fr", "it", "de", "pt", "ko", "ja", "ca", "da", "tr", "ro", "ru"], + only: ["en", "es", "fr", "it", "de", "pt", "ko", "ja", "ca", "da", "tr", "ro", "ru", "tl"], }, { face: new FontFace("pkmnems", "url(./fonts/pokemon-bw.ttf)", { unicodeRange: rangesByLanguage.japanese, }), - only: ["en", "es", "fr", "it", "de", "pt", "ko", "ja", "ca", "da", "tr", "ro", "ru"], + only: ["en", "es", "fr", "it", "de", "pt", "ko", "ja", "ca", "da", "tr", "ro", "ru", "tl"], }, ]; @@ -191,6 +191,7 @@ export async function initI18n(): Promise { "tr", "ro", "ru", + "tl", ], backend: { loadPath(lng: string, [ns]: string[]) { diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index 33087f2509e..32d9e0ee2be 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -981,6 +981,10 @@ export function setSetting(setting: string, value: number): boolean { label: "Română (Needs Help)", handler: () => changeLocaleHandler("ro"), }, + { + label: "Tagalog (Needs Help)", + handler: () => changeLocaleHandler("tl"), + }, { label: i18next.t("settings:back"), handler: () => cancelHandler(), diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index 3c261d6ddab..1a0481b8e8d 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -117,6 +117,12 @@ export class SettingsDisplayUiHandler extends AbstractSettingsUiHandler { label: "Română (Needs Help)", }; break; + case "tl": + this.settings[languageIndex].options[0] = { + value: "Tagalog", + label: "Tagalog (Needs Help)", + }; + break; default: this.settings[languageIndex].options[0] = { value: "English", diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 974f24e706f..6929d6f818d 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -176,6 +176,10 @@ const languageSettings: { [key: string]: LanguageSetting } = { starterInfoYOffset: 0.5, starterInfoXPos: 26, }, + tl: { + starterInfoTextSize: "56px", + instructionTextSize: "38px", + }, }; const valueReductionMax = 2; diff --git a/src/utils/common.ts b/src/utils/common.ts index 66a74ed2c33..1c75dac93b4 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -436,6 +436,7 @@ export function hasAllLocalizedSprites(lang?: string): boolean { case "ja": case "ca": case "ru": + case "tl": return true; default: return false; From 6204a6fdcb18f6a78d7a72511eb4e28841a71ac4 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 31 Jul 2025 17:44:03 -0600 Subject: [PATCH 054/106] [Bug] [Beta] Fix serializable battler tags (#6183) Fix serializable battler tags --- src/data/arena-tag.ts | 5 ++++- src/data/battler-tags.ts | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 9f2a5e09667..34477d737b4 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -1659,7 +1659,10 @@ export function getArenaTag( * @param source - An arena tag * @returns The valid arena tag */ -export function loadArenaTag(source: ArenaTag | ArenaTagTypeData): ArenaTag { +export function loadArenaTag(source: ArenaTag | ArenaTagTypeData | { tagType: ArenaTagType.NONE }): ArenaTag { + if (source.tagType === ArenaTagType.NONE) { + return new NoneTag(); + } const tag = getArenaTag(source.tagType, source.turnCount, source.sourceMove, source.sourceId, source.side) ?? new NoneTag(); tag.loadTag(source); diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index f3cfe4e7d99..a1ed535e1d1 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -201,7 +201,7 @@ export class BattlerTag implements BaseBattlerTag { } } -export abstract class SerializableBattlerTag extends BattlerTag { +export class SerializableBattlerTag extends BattlerTag { /** Nonexistent, dummy field to allow typescript to distinguish this class from `BattlerTag` */ private declare __SerializableBattlerTag: never; } @@ -3641,7 +3641,7 @@ export function getBattlerTag( case BattlerTagType.FRENZY: return new FrenzyTag(turnCount, sourceMove, sourceId); case BattlerTagType.CHARGING: - return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); + return new SerializableBattlerTag(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); case BattlerTagType.ENCORE: return new EncoreTag(sourceId); case BattlerTagType.HELPING_HAND: @@ -3726,10 +3726,10 @@ export function getBattlerTag( return new DragonCheerTag(); case BattlerTagType.ALWAYS_CRIT: case BattlerTagType.IGNORE_ACCURACY: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); + return new SerializableBattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); case BattlerTagType.ALWAYS_GET_HIT: case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: - return new BattlerTag(tagType, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); + return new SerializableBattlerTag(tagType, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); case BattlerTagType.BYPASS_SLEEP: return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); case BattlerTagType.IGNORE_FLYING: From 4dd6eb4e954d58735a7009eac959eb6349ae5a31 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 31 Jul 2025 17:57:53 -0600 Subject: [PATCH 055/106] [Misc] [Beta] Fix serializable battler tags (#6184) Fix serializable battler tags --- src/data/battler-tags.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index a1ed535e1d1..8805d671f8e 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -3856,7 +3856,7 @@ export type BattlerTagTypeMap = { [BattlerTagType.POWDER]: PowderTag; [BattlerTagType.NIGHTMARE]: NightmareTag; [BattlerTagType.FRENZY]: FrenzyTag; - [BattlerTagType.CHARGING]: BattlerTag; + [BattlerTagType.CHARGING]: SerializableBattlerTag; [BattlerTagType.ENCORE]: EncoreTag; [BattlerTagType.HELPING_HAND]: HelpingHandTag; [BattlerTagType.INGRAIN]: IngrainTag; @@ -3897,10 +3897,10 @@ export type BattlerTagTypeMap = { [BattlerTagType.FIRE_BOOST]: TypeBoostTag; [BattlerTagType.CRIT_BOOST]: CritBoostTag; [BattlerTagType.DRAGON_CHEER]: DragonCheerTag; - [BattlerTagType.ALWAYS_CRIT]: BattlerTag; - [BattlerTagType.IGNORE_ACCURACY]: BattlerTag; - [BattlerTagType.ALWAYS_GET_HIT]: BattlerTag; - [BattlerTagType.RECEIVE_DOUBLE_DAMAGE]: BattlerTag; + [BattlerTagType.ALWAYS_CRIT]: SerializableBattlerTag; + [BattlerTagType.IGNORE_ACCURACY]: SerializableBattlerTag; + [BattlerTagType.ALWAYS_GET_HIT]: SerializableBattlerTag; + [BattlerTagType.RECEIVE_DOUBLE_DAMAGE]: SerializableBattlerTag; [BattlerTagType.BYPASS_SLEEP]: BattlerTag; [BattlerTagType.IGNORE_FLYING]: GroundedTag; [BattlerTagType.ROOSTED]: RoostedTag; From 8ef2fadce45c3891bd7d32e91003cb7cbd220458 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 31 Jul 2025 19:08:41 -0600 Subject: [PATCH 056/106] [Misc] Disallow using NonFunctionProperties in loadTag methods (#6185) Disallow using NonFunctionProperties in loadTag methods --- src/data/arena-tag.ts | 3 --- src/data/battler-tags.ts | 16 +++++++--------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 34477d737b4..15c2cde1d58 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -71,13 +71,10 @@ import i18next from "i18next"; * // Then we must also define a loadTag method with one of the following signatures * public override loadTag(source: BaseArenaTag & Pick(source: BaseArenaTag & Pick): void; - * public override loadTag(source: NonFunctionProperties): void; * } * ``` * Notes * - If the class has any subclasses, then the second form of `loadTag` *must* be used. - * - The third form *must not* be used if the class has any getters, as typescript would expect such fields to be - * present in `source`. */ /** Interface containing the serializable fields of ArenaTagData. */ diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 8805d671f8e..edeff293aa0 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -44,7 +44,7 @@ import type { SemiInvulnerableTagType, TrappingBattlerTagType, } from "#types/battler-tags"; -import type { Mutable, NonFunctionProperties } from "#types/type-helpers"; +import type { Mutable } from "#types/type-helpers"; import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common"; /** @@ -80,13 +80,10 @@ import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder * // Then we must also define a loadTag method with one of the following signatures * public override loadTag(source: BaseBattlerTag & Pick(source: BaseBattlerTag & Pick): void; - * public override loadTag(source: NonFunctionProperties): void; * } * ``` * Notes * - If the class has any subclasses, then the second form of `loadTag` *must* be used. - * - The third form *must not* be used if the class has any getters, as typescript would expect such fields to be - * present in `source`. */ /** Interface containing the serializable fields of BattlerTag */ @@ -419,7 +416,6 @@ export class GorillaTacticsTag extends MoveRestrictionBattlerTag { public override readonly tagType = BattlerTagType.GORILLA_TACTICS; /** ID of the move that the user is locked into using*/ public readonly moveId: MoveId = MoveId.NONE; - constructor() { super(BattlerTagType.GORILLA_TACTICS, BattlerTagLapseType.CUSTOM, 0); } @@ -1235,7 +1231,7 @@ export class EncoreTag extends MoveRestrictionBattlerTag { ); } - public override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); this.moveId = source.moveId; } @@ -2618,7 +2614,7 @@ export class CommandedTag extends SerializableBattlerTag { } } - override loadTag(source: NonFunctionProperties): void { + override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); (this as Mutable).tatsugiriFormKey = source.tatsugiriFormKey; } @@ -2659,7 +2655,9 @@ export class StockpilingTag extends SerializableBattlerTag { } }; - public override loadTag(source: NonFunctionProperties): void { + public override loadTag( + source: BaseBattlerTag & Pick, + ): void { super.loadTag(source); this.stockpiledCount = source.stockpiledCount || 0; this.statChangeCounts = { @@ -3006,7 +3004,7 @@ export class AutotomizedTag extends SerializableBattlerTag { this.onAdd(pokemon); } - public override loadTag(source: NonFunctionProperties): void { + public override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); this.autotomizeCount = source.autotomizeCount; } From f54890001c895123842b81d53232711327208d82 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 31 Jul 2025 19:06:38 -0700 Subject: [PATCH 057/106] [Dev] `pnpm biome` will now only display errors by default (#6187) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 71a8b1ae334..d3494da677c 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "typecheck": "tsc --noEmit", "eslint": "eslint --fix .", "eslint-ci": "eslint .", - "biome": "biome check --write --changed --no-errors-on-unmatched", + "biome": "biome check --write --changed --no-errors-on-unmatched --diagnostic-level=error", "biome-ci": "biome ci --diagnostic-level=error --reporter=github --no-errors-on-unmatched", "docs": "typedoc", "depcruise": "depcruise src test", From 1c59b67d7e4be525104fd3382fbb35b608a1f005 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Fri, 1 Aug 2025 13:08:28 -0400 Subject: [PATCH 058/106] [Sprite] Move Clauncher, Clawitzer, Skiddo, Fomantis, Lurantis animations to consistent (#6177) * Move Clauncher, Clawitzer, Skiddo out of exp * Move Fomantis, Lurantis out of exp --- public/exp-sprites.json | 42 - public/images/pokemon/672.json | 518 +++- public/images/pokemon/672.png | Bin 645 -> 3337 bytes public/images/pokemon/692.json | 774 +++++ public/images/pokemon/693.json | 941 +++++- public/images/pokemon/693.png | Bin 1088 -> 25840 bytes public/images/pokemon/753.json | 2559 +++++++++++++++- public/images/pokemon/753.png | Bin 476 -> 2090 bytes public/images/pokemon/754.json | 1106 ++++++- public/images/pokemon/754.png | Bin 789 -> 3754 bytes public/images/pokemon/back/672.json | 518 +++- public/images/pokemon/back/672.png | Bin 599 -> 3350 bytes public/images/pokemon/back/692.json | 774 +++++ public/images/pokemon/back/693.json | 941 +++++- public/images/pokemon/back/693.png | Bin 982 -> 21703 bytes public/images/pokemon/back/753.json | 2561 +++++++++++++++- public/images/pokemon/back/753.png | Bin 441 -> 2062 bytes public/images/pokemon/back/754.json | 1085 ++++++- public/images/pokemon/back/754.png | Bin 689 -> 3640 bytes public/images/pokemon/back/shiny/672.json | 518 +++- public/images/pokemon/back/shiny/672.png | Bin 599 -> 3349 bytes public/images/pokemon/back/shiny/692.json | 833 +++++- public/images/pokemon/back/shiny/692.png | Bin 478 -> 2025 bytes public/images/pokemon/back/shiny/693.json | 941 +++++- public/images/pokemon/back/shiny/693.png | Bin 1029 -> 21707 bytes public/images/pokemon/back/shiny/753.json | 2561 +++++++++++++++- public/images/pokemon/back/shiny/753.png | Bin 441 -> 2061 bytes public/images/pokemon/back/shiny/754.json | 1106 ++++++- public/images/pokemon/back/shiny/754.png | Bin 690 -> 3640 bytes public/images/pokemon/exp/672.json | 479 --- public/images/pokemon/exp/672.png | Bin 3333 -> 0 bytes public/images/pokemon/exp/692.json | 794 ----- public/images/pokemon/exp/692.png | Bin 2580 -> 0 bytes public/images/pokemon/exp/693.json | 902 ------ public/images/pokemon/exp/693.png | Bin 25840 -> 0 bytes public/images/pokemon/exp/753.json | 2582 ----------------- public/images/pokemon/exp/753.png | Bin 2090 -> 0 bytes public/images/pokemon/exp/754.json | 1133 -------- public/images/pokemon/exp/754.png | Bin 3754 -> 0 bytes public/images/pokemon/exp/back/672.json | 479 --- public/images/pokemon/exp/back/672.png | Bin 3350 -> 0 bytes public/images/pokemon/exp/back/692.json | 794 ----- public/images/pokemon/exp/back/692.png | Bin 2025 -> 0 bytes public/images/pokemon/exp/back/693.json | 902 ------ public/images/pokemon/exp/back/693.png | Bin 21703 -> 0 bytes public/images/pokemon/exp/back/753.json | 2582 ----------------- public/images/pokemon/exp/back/753.png | Bin 2062 -> 0 bytes public/images/pokemon/exp/back/754.json | 1112 ------- public/images/pokemon/exp/back/754.png | Bin 3640 -> 0 bytes public/images/pokemon/exp/back/shiny/672.json | 479 --- public/images/pokemon/exp/back/shiny/672.png | Bin 3349 -> 0 bytes public/images/pokemon/exp/back/shiny/692.json | 794 ----- public/images/pokemon/exp/back/shiny/692.png | Bin 2025 -> 0 bytes public/images/pokemon/exp/back/shiny/693.json | 902 ------ public/images/pokemon/exp/back/shiny/693.png | Bin 21707 -> 0 bytes public/images/pokemon/exp/back/shiny/753.json | 2582 ----------------- public/images/pokemon/exp/back/shiny/753.png | Bin 2061 -> 0 bytes public/images/pokemon/exp/back/shiny/754.json | 1133 -------- public/images/pokemon/exp/back/shiny/754.png | Bin 3640 -> 0 bytes public/images/pokemon/exp/shiny/672.json | 479 --- public/images/pokemon/exp/shiny/672.png | Bin 3333 -> 0 bytes public/images/pokemon/exp/shiny/692.json | 794 ----- public/images/pokemon/exp/shiny/692.png | Bin 2580 -> 0 bytes public/images/pokemon/exp/shiny/693.json | 902 ------ public/images/pokemon/exp/shiny/693.png | Bin 25899 -> 0 bytes public/images/pokemon/exp/shiny/753.json | 2582 ----------------- public/images/pokemon/exp/shiny/753.png | Bin 2090 -> 0 bytes public/images/pokemon/exp/shiny/754.json | 1133 -------- public/images/pokemon/exp/shiny/754.png | Bin 3754 -> 0 bytes public/images/pokemon/shiny/672.json | 518 +++- public/images/pokemon/shiny/672.png | Bin 645 -> 3337 bytes public/images/pokemon/shiny/692.json | 833 +++++- public/images/pokemon/shiny/692.png | Bin 509 -> 2580 bytes public/images/pokemon/shiny/693.json | 941 +++++- public/images/pokemon/shiny/693.png | Bin 1144 -> 25899 bytes public/images/pokemon/shiny/753.json | 2559 +++++++++++++++- public/images/pokemon/shiny/753.png | Bin 471 -> 2090 bytes public/images/pokemon/shiny/754.json | 1106 ++++++- public/images/pokemon/shiny/754.png | Bin 812 -> 3754 bytes public/images/pokemon/variant/672.json | 15 + public/images/pokemon/variant/672_3.json | 41 - public/images/pokemon/variant/672_3.png | Bin 672 -> 0 bytes .../pokemon/variant/_exp_masterlist.json | 10 - .../images/pokemon/variant/_masterlist.json | 4 +- public/images/pokemon/variant/back/753.json | 28 +- .../pokemon/variant/{exp => back}/754.json | 0 public/images/pokemon/variant/back/754_2.json | 41 - public/images/pokemon/variant/back/754_2.png | Bin 703 -> 0 bytes public/images/pokemon/variant/back/754_3.json | 41 - public/images/pokemon/variant/back/754_3.png | Bin 700 -> 0 bytes public/images/pokemon/variant/exp/672.json | 32 - public/images/pokemon/variant/exp/692.json | 26 - public/images/pokemon/variant/exp/693.json | 30 - public/images/pokemon/variant/exp/753.json | 32 - public/images/pokemon/variant/exp/754_2.json | 1133 -------- public/images/pokemon/variant/exp/754_2.png | Bin 4040 -> 0 bytes public/images/pokemon/variant/exp/754_3.json | 1133 -------- public/images/pokemon/variant/exp/754_3.png | Bin 4040 -> 0 bytes .../images/pokemon/variant/exp/back/672.json | 32 - .../images/pokemon/variant/exp/back/692.json | 28 - .../images/pokemon/variant/exp/back/693.json | 28 - .../images/pokemon/variant/exp/back/753.json | 26 - .../images/pokemon/variant/exp/back/754.json | 14 - .../pokemon/variant/exp/back/754_2.json | 1112 ------- .../images/pokemon/variant/exp/back/754_2.png | Bin 3646 -> 0 bytes .../pokemon/variant/exp/back/754_3.json | 1112 ------- .../images/pokemon/variant/exp/back/754_3.png | Bin 3725 -> 0 bytes 107 files changed, 23263 insertions(+), 28929 deletions(-) delete mode 100644 public/images/pokemon/exp/672.json delete mode 100644 public/images/pokemon/exp/672.png delete mode 100644 public/images/pokemon/exp/692.json delete mode 100644 public/images/pokemon/exp/692.png delete mode 100644 public/images/pokemon/exp/693.json delete mode 100644 public/images/pokemon/exp/693.png delete mode 100644 public/images/pokemon/exp/753.json delete mode 100644 public/images/pokemon/exp/753.png delete mode 100644 public/images/pokemon/exp/754.json delete mode 100644 public/images/pokemon/exp/754.png delete mode 100644 public/images/pokemon/exp/back/672.json delete mode 100644 public/images/pokemon/exp/back/672.png delete mode 100644 public/images/pokemon/exp/back/692.json delete mode 100644 public/images/pokemon/exp/back/692.png delete mode 100644 public/images/pokemon/exp/back/693.json delete mode 100644 public/images/pokemon/exp/back/693.png delete mode 100644 public/images/pokemon/exp/back/753.json delete mode 100644 public/images/pokemon/exp/back/753.png delete mode 100644 public/images/pokemon/exp/back/754.json delete mode 100644 public/images/pokemon/exp/back/754.png delete mode 100644 public/images/pokemon/exp/back/shiny/672.json delete mode 100644 public/images/pokemon/exp/back/shiny/672.png delete mode 100644 public/images/pokemon/exp/back/shiny/692.json delete mode 100644 public/images/pokemon/exp/back/shiny/692.png delete mode 100644 public/images/pokemon/exp/back/shiny/693.json delete mode 100644 public/images/pokemon/exp/back/shiny/693.png delete mode 100644 public/images/pokemon/exp/back/shiny/753.json delete mode 100644 public/images/pokemon/exp/back/shiny/753.png delete mode 100644 public/images/pokemon/exp/back/shiny/754.json delete mode 100644 public/images/pokemon/exp/back/shiny/754.png delete mode 100644 public/images/pokemon/exp/shiny/672.json delete mode 100644 public/images/pokemon/exp/shiny/672.png delete mode 100644 public/images/pokemon/exp/shiny/692.json delete mode 100644 public/images/pokemon/exp/shiny/692.png delete mode 100644 public/images/pokemon/exp/shiny/693.json delete mode 100644 public/images/pokemon/exp/shiny/693.png delete mode 100644 public/images/pokemon/exp/shiny/753.json delete mode 100644 public/images/pokemon/exp/shiny/753.png delete mode 100644 public/images/pokemon/exp/shiny/754.json delete mode 100644 public/images/pokemon/exp/shiny/754.png delete mode 100644 public/images/pokemon/variant/672_3.json delete mode 100644 public/images/pokemon/variant/672_3.png rename public/images/pokemon/variant/{exp => back}/754.json (100%) delete mode 100644 public/images/pokemon/variant/back/754_2.json delete mode 100644 public/images/pokemon/variant/back/754_2.png delete mode 100644 public/images/pokemon/variant/back/754_3.json delete mode 100644 public/images/pokemon/variant/back/754_3.png delete mode 100644 public/images/pokemon/variant/exp/672.json delete mode 100644 public/images/pokemon/variant/exp/692.json delete mode 100644 public/images/pokemon/variant/exp/693.json delete mode 100644 public/images/pokemon/variant/exp/753.json delete mode 100644 public/images/pokemon/variant/exp/754_2.json delete mode 100644 public/images/pokemon/variant/exp/754_2.png delete mode 100644 public/images/pokemon/variant/exp/754_3.json delete mode 100644 public/images/pokemon/variant/exp/754_3.png delete mode 100644 public/images/pokemon/variant/exp/back/672.json delete mode 100644 public/images/pokemon/variant/exp/back/692.json delete mode 100644 public/images/pokemon/variant/exp/back/693.json delete mode 100644 public/images/pokemon/variant/exp/back/753.json delete mode 100644 public/images/pokemon/variant/exp/back/754.json delete mode 100644 public/images/pokemon/variant/exp/back/754_2.json delete mode 100644 public/images/pokemon/variant/exp/back/754_2.png delete mode 100644 public/images/pokemon/variant/exp/back/754_3.json delete mode 100644 public/images/pokemon/variant/exp/back/754_3.png diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 7430bcf4dba..1903a6c7804 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -333,8 +333,6 @@ "671-yellow", "6713", "6713", - "672", - "672", "6724", "6724", "673", @@ -377,10 +375,6 @@ "690", "691", "691", - "692", - "692", - "693", - "693", "695", "695", "696", @@ -503,10 +497,6 @@ "751", "752", "752", - "753", - "753", - "754", - "754", "755", "755", "756", @@ -1459,8 +1449,6 @@ "671b-yellow", "6713b", "6713b", - "672b", - "672b", "6724b", "6724b", "673b", @@ -1503,10 +1491,6 @@ "690b", "691b", "691b", - "692b", - "692b", - "693b", - "693b", "695b", "695b", "696b", @@ -1629,10 +1613,6 @@ "751b", "752b", "752b", - "753b", - "753b", - "754b", - "754b", "755b", "755b", "756b", @@ -2585,8 +2565,6 @@ "671sb-yellow", "6713sb", "6713sb", - "672sb", - "672sb", "6724sb", "6724sb", "673sb", @@ -2629,10 +2607,6 @@ "690sb", "691sb", "691sb", - "692sb", - "692sb", - "693sb", - "693sb", "695sb", "695sb", "696sb", @@ -2755,10 +2729,6 @@ "751sb", "752sb", "752sb", - "753sb", - "753sb", - "754sb", - "754sb", "755sb", "755sb", "756sb", @@ -3716,8 +3686,6 @@ "671s-yellow", "6713s", "6713s", - "672s", - "672s", "6724s", "6724s", "673s", @@ -3760,10 +3728,6 @@ "690s", "691s", "691s", - "692s", - "692s", - "693s", - "693s", "695s", "695s", "696s", @@ -3886,10 +3850,6 @@ "751s", "752s", "752s", - "753s", - "753s", - "754s", - "754s", "755s", "755s", "756s", @@ -4625,8 +4585,6 @@ "730", "747", "748", - "753", - "754", "755", "756", "761", diff --git a/public/images/pokemon/672.json b/public/images/pokemon/672.json index eabec185e7a..f337bef7d29 100644 --- a/public/images/pokemon/672.json +++ b/public/images/pokemon/672.json @@ -1,41 +1,479 @@ -{ - "textures": [ - { - "image": "672.png", - "format": "RGBA8888", - "size": { - "w": 50, - "h": 50 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 42, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 50 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a5389856891adb93e4e47b311ec032fc:ff2b44df2ba78f8e713e7ecfbd8a40e8:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 43, "y": 0, "w": 43, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 43, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 43, "h": 54 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 42, "y": 100, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 86, "y": 50, "w": 41, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 51 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 43, "y": 0, "w": 43, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 43, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 43, "h": 54 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 83, "y": 101, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 86, "y": 50, "w": 41, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 51 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "672.png", + "format": "I8", + "size": { "w": 170, "h": 193 }, + "scale": "1" + } } diff --git a/public/images/pokemon/672.png b/public/images/pokemon/672.png index 2fdd68acd32510bbb57ccc654cc8ae07082560ef..ff319db5822189e38382ff2966380a614293dc6f 100644 GIT binary patch literal 3337 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 diff --git a/public/images/pokemon/692.json b/public/images/pokemon/692.json index 125642a01f1..86b535260ae 100644 --- a/public/images/pokemon/692.json +++ b/public/images/pokemon/692.json @@ -7,6 +7,780 @@ "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, "sourceSize": { "w": 63, "h": 35 }, "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 117, "y": 72, "w": 59, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 } ], "meta": { diff --git a/public/images/pokemon/693.json b/public/images/pokemon/693.json index 5e35ec822d2..c8f7763de1d 100644 --- a/public/images/pokemon/693.json +++ b/public/images/pokemon/693.json @@ -1,41 +1,902 @@ -{ - "textures": [ - { - "image": "693.png", - "format": "RGBA8888", - "size": { - "w": 87, - "h": 87 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 87, - "h": 78 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 87, - "h": 78 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 78 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:56529e9f35f7fe73552976d184900c50:cf9846d335c4b48dea98b7f53c4caa05:9c1f9147e693c05eb4655590e9099679$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 416, "y": 214, "w": 91, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 91, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 405, "y": 145, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 207, "y": 344, "w": 105, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 17, "w": 105, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 507, "y": 285, "w": 105, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 18, "w": 105, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 412, "y": 1, "w": 104, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 13, "w": 104, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 1, "y": 145, "w": 99, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 14, "w": 99, "h": 72 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 1, "y": 76, "w": 105, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 105, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 507, "y": 219, "w": 104, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 24, "w": 104, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 283, "w": 102, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 23, "w": 102, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 207, "y": 1, "w": 99, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 10, "w": 99, "h": 77 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 517, "y": 74, "w": 93, "h": 78 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 7, "w": 93, "h": 78 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 106, "y": 78, "w": 102, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 12, "w": 102, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 421, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 312, "y": 354, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 208, "y": 78, "w": 95, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 2, "w": 95, "h": 76 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 303, "y": 140, "w": 102, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 5, "w": 102, "h": 70 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 523, "y": 348, "w": 102, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 11, "w": 102, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 318, "y": 290, "w": 103, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 7, "w": 103, "h": 64 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 105, "y": 1, "w": 102, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 102, "h": 75 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 306, "y": 72, "w": 108, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 108, "h": 68 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 108, "y": 276, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 104, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 104, "h": 74 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 203, "y": 210, "w": 106, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 13, "w": 106, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 508, "y": 152, "w": 106, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 106, "h": 67 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 414, "y": 74, "w": 103, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 103, "h": 71 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 306, "y": 72, "w": 108, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 14, "w": 108, "h": 68 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 108, "y": 276, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 1, "y": 1, "w": 104, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 104, "h": 74 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 203, "y": 210, "w": 106, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 13, "w": 106, "h": 66 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 309, "y": 214, "w": 107, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 14, "w": 107, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 306, "y": 1, "w": 106, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 9, "w": 106, "h": 70 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 1, "y": 218, "w": 107, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 14, "w": 107, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 213, "y": 279, "w": 105, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 14, "w": 105, "h": 65 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 103, "y": 341, "w": 104, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 15, "w": 104, "h": 63 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 516, "y": 1, "w": 101, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 101, "h": 73 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 100, "y": 149, "w": 103, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 9, "w": 103, "h": 69 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 1, "y": 349, "w": 102, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 16, "w": 102, "h": 62 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 103, "y": 404, "w": 100, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 16, "w": 100, "h": 61 }, + "sourceSize": { "w": 118, "h": 90 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "693.png", + "format": "I8", + "size": { "w": 626, "h": 466 }, + "scale": "1" + } } diff --git a/public/images/pokemon/693.png b/public/images/pokemon/693.png index 848c881311acdc85f6eb12840a8e3f60be8256a4..28f3bd88282bc4d4972b347c0308bf6d9e16d016 100644 GIT binary patch literal 25840 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 U6<`(rIRF3v07*qoM6N<$f?TKLMgRZ+ literal 476 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 literal 789 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 literal 982 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 diff --git a/public/images/pokemon/back/754.json b/public/images/pokemon/back/754.json index 125ebed161c..86abaac1814 100644 --- a/public/images/pokemon/back/754.json +++ b/public/images/pokemon/back/754.json @@ -4,29 +4,1100 @@ "image": "754.png", "format": "RGBA8888", "size": { - "w": 68, - "h": 68 + "w": 222, + "h": 222 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0036.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 36, + "w": 92, "h": 68 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 36, + "w": 92, "h": 68 }, "frame": { "x": 0, "y": 0, - "w": 36, + "w": 92, + "h": 68 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 92, + "h": 68 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 92, + "h": 68 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 92, + "h": 68 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 92, + "h": 68 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 88, + "h": 68 + }, + "frame": { + "x": 92, + "y": 68, + "w": 88, + "h": 68 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 88, + "h": 68 + }, + "frame": { + "x": 92, + "y": 68, + "w": 88, + "h": 68 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 40, + "h": 68 + }, + "frame": { + "x": 180, + "y": 68, + "w": 40, + "h": 68 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 40, + "h": 68 + }, + "frame": { + "x": 180, + "y": 68, + "w": 40, + "h": 68 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, "h": 68 } } @@ -36,6 +1107,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2774f1d6c293a696177c371795e6ba38:d35951afed6391313aa94000563ae143:f7cb0e9bb3adbe899317e6e2e306035d$" + "smartupdate": "$TexturePacker:SmartUpdate:3adad944aac48ad53efa41f8c9916d1c:ea15b954875ad08814f50cbbf849c1b3:f7cb0e9bb3adbe899317e6e2e306035d$" } } diff --git a/public/images/pokemon/back/754.png b/public/images/pokemon/back/754.png index ec44dc6326687a0e77c233c354284913bd32a6ac..66bd6a1b9758f405bbc4754bcad9fa3c6e1db256 100644 GIT binary patch delta 3613 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 delta 639 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 diff --git a/public/images/pokemon/back/shiny/692.json b/public/images/pokemon/back/shiny/692.json index 2dec26a2616..801710c4861 100644 --- a/public/images/pokemon/back/shiny/692.json +++ b/public/images/pokemon/back/shiny/692.json @@ -1,41 +1,794 @@ -{ - "textures": [ - { - "image": "692.png", - "format": "RGBA8888", - "size": { - "w": 56, - "h": 56 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 56, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:8b2c775abfa9b635f2149e201570e6ff:f327a0cd8d92fa087869ded83baa8e41:2880def858c84cd859bedf13b0b49a33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 1, "y": 36, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 60, "y": 72, "w": 58, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 119, "y": 72, "w": 56, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 4, "w": 56, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 60, "y": 72, "w": 58, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 4, "w": 58, "h": 31 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 72, "w": 58, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 58, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 59, "y": 37, "w": 57, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 57, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "692.png", + "format": "I8", + "size": { "w": 181, "h": 106 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/692.png b/public/images/pokemon/back/shiny/692.png index 7459aabd207d6e05e7d533fe0daf144a7e619cd7..dfad01dd44659d0f5ce9c3a42fdc114c166f3250 100644 GIT binary patch literal 2025 zcmV0000aP)t-s0000G z5D+3*bHBg8`1treoXkwa|BOg6zhXoGgIP^YP5-Hku?;U90000CbW%=J0RR90|NsC0 z|NsC03B*t)000MQNklJ;g3Ofgf_qtjKfw!4963&$U${)0YkQtk(->(R_h>q3jr7KXAYVdy7!~76; zhMIV>YTKmWc5Z|k#hySz=FSUE54DNC%%I`*T8-!n8aK0k!kIbnTF?oM{Wd_2D?82^ z3h}mW$8kuoM>tH>2z?u7jOes20ghwe_wziT3kNvEah<5GnuE&4YS3`F>lcV+pI^6Q zfIn?d@Z4@`%@pdZ)`?Z4;Rqjd)#umOc!U5&xPw@=NUsj65vxPParmFk3Cf0TgE;AM z=7j;NUOiMH7K47h4(AWpw(Yzf04}IMF*VD7lq1Sb-s*Z*8RmaisT!mg8R3TQ6?%}C!1`l~Jc(mV9 z4cbo*nyT}5fPH(ay3q?*=q414C-zIkRlflwvSwvvG?DlMds`aq%Sue@00??ZH&R@_|Gr6*ZH^{NU#keJcy(kKi$hAuZ^ zfd?0~W6`uk`fp)b5Nc22;-bonccfQ@rk-v=q!v0B3(=&F&WjvZ^MeBv1dC-Kem((% zOCzraRxf}(URwej0s85oBeCMY`7r}=m~)sbgJ#RV>Q3CyEscl86_EbJ;&*2rA@=9d zFH7h=qu3%Xx}01zreIdDeZ%FujG=>LM|2(^Wg2`rSKQ6_sDip19dx`SwB^uHe<$x^ zv|;C|r;46Cev7(%vrZ-sKT1m+d#!0T70TFY6Y6Ee&xA4)v>Ej_mz|>#1F@a9!K;m6 zn8*nxXlKbwHe!h3rsnKnXnw2L2v$8|*Q;qeyjJY8vZu(Ra4FNPA@AXgO=+?PH<8_=!YAFe$m zk`>};wZGt`F~MCxF+&^Rt?TZbFj>jOx$HXJIKS?56*FywcdolISxH|2ST?jV!F_gS zrH$y$vlk{SkX^!9^;W_Sj0wg8g`GB|8@peatl*!Kwu=eI0fn75qIPSX?R< zOot$^Pg`_wp1hE11ar6Aa78W|l=n`O?^Ns`S>Y2euHb7JsnH6_(zYnRleTPpheMx6 zm6Sp)**nmcXY>m6*4t#Ll{*9AOgV*GvJ8dFY>Q^d$hP9kj+vIY&BS-tN`_E4y1PbE z*+s8#l_PF5P~TlA8G-Wmx=&S8y;N;Z_fnZ$BN>7ECJSw=kzT4c=Ubst%`BgwO)!gm-gg)YpG<=LR*XQ z@#dz{YZJE_PJ!>vN(N^Oy^wUal4l_+y_~eozlf(n?N#R1XoaS z;Ii9xTQ{(J3EEs)-_+H0kCIhJa0PYIdIH{fqDAw1J+!&8zLPr}EbLS`CmAGzuZKo( z_M`lXH&s*5zMk~B&7AcOk(Ti?-yP6OWZl85BOuNQX7V8N>atY@FhcUQjQ z*quSl++}gu;TKg+9+LNm5xd3h5I{wL`|N7$(OhcTMne(n~00000NkvXX Hu0mjfmxbn~ literal 478 zcmV<40U`d0P)WS^uew*M9dZ00001bW%=J06^y0W&i*I zXh}ptRCr$P&aqCzFc1b{`we^wZIVt=2Oc1icmUu9GIXblk-B;5N!`4Vh>fl8#?nY; z@50M*=QNNahmol_IEp^~zkcz3vgn`a$@_wzIEtH+pQ-5MpHTw&Fdd!l6-gQ56Va-e z-mA5qMDX5gN=MB((sdN2bF5vWBA8i<9(-paC~b;djHpEWqJQDScbK~d5i}L(rwgPp zXxawnJD=0C(^&HZA!e=F_<$d$i>-%_alWAf>h+&LQOKPmG;MOn@9Q`!{d*W=Y!$FU z(jmI=-s}S|Z+pa@Cmg1BS&N7;BuS5>sf=cXcpRpBE<-b`m(Sn09i}#n04t~nse{ji zVBce)-h$NFqX7t*(l1x8QdIoI2#N}Y1ZWu{oz;MbkbB@f)Y+`r0@S#sm=TiE7H53R zEC4D_F$$oXq+AA+`Q8fI1Aj>~TUF&bx>rJ~5%LUBJxbtrNQw9{PM;G0de^(&7l6;I UI}(g#6#xJL07*qoM6N<$f|E1W4gdfE diff --git a/public/images/pokemon/back/shiny/693.json b/public/images/pokemon/back/shiny/693.json index 6c1d41485e9..6358a8908f6 100644 --- a/public/images/pokemon/back/shiny/693.json +++ b/public/images/pokemon/back/shiny/693.json @@ -1,41 +1,902 @@ -{ - "textures": [ - { - "image": "693.png", - "format": "RGBA8888", - "size": { - "w": 90, - "h": 90 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 90, - "h": 70 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 90, - "h": 70 - }, - "frame": { - "x": 0, - "y": 0, - "w": 90, - "h": 70 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e4bbb1dc7d71678d99aa6c088ee2dda6:9e2c014adc4489792adb3203513e62b4:9c1f9147e693c05eb4655590e9099679$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 565, "y": 196, "w": 90, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 6, "w": 90, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 278, "y": 266, "w": 90, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 10, "w": 90, "h": 59 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 189, "y": 199, "w": 95, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 8, "w": 95, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 193, "y": 1, "w": 98, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 98, "h": 68 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 1, "y": 136, "w": 94, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 95, "y": 72, "w": 96, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 12, "w": 96, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 381, "y": 1, "w": 97, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 6, "w": 97, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 191, "y": 136, "w": 94, "h": 63 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0091.png", + "frame": { "x": 95, "y": 135, "w": 96, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 11, "w": 96, "h": 62 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0092.png", + "frame": { "x": 572, "y": 67, "w": 99, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 7, "w": 99, "h": 65 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0093.png", + "frame": { "x": 284, "y": 205, "w": 95, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 11, "w": 95, "h": 61 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0094.png", + "frame": { "x": 1, "y": 199, "w": 91, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 12, "w": 91, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0095.png", + "frame": { "x": 1, "y": 259, "w": 95, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 12, "w": 95, "h": 60 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0096.png", + "frame": { "x": 193, "y": 69, "w": 95, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 15, "y": 5, "w": 95, "h": 67 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0097.png", + "frame": { "x": 285, "y": 141, "w": 92, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 8, "w": 92, "h": 64 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0098.png", + "frame": { "x": 96, "y": 318, "w": 89, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 14, "w": 89, "h": 58 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + }, + { + "filename": "0099.png", + "frame": { "x": 564, "y": 261, "w": 92, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 14, "w": 92, "h": 58 }, + "sourceSize": { "w": 111, "h": 83 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "693.png", + "format": "I8", + "size": { "w": 672, "h": 377 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/693.png b/public/images/pokemon/back/shiny/693.png index 47715b534bdd4894f6270acef17d166dd5950a85..6884c2e28c7cc0a973f46300b758328f9b60c0f1 100644 GIT binary patch literal 21707 zcmV)tK$pLXP)}z{G(R6NBM^<_2OxyO~f{v>%T!u@J{= z!2dBoP|O#QIpi)VD(3IO^9f)<1?PeUkbeOD8SrBf-Z6K9Bqe_uk4V@%=N!}&Tx1Iv z@BH;e3T6BTqbGA<2wsF>3UD~8VF3bzGsEk}&4Hx_T!d+G0TaPMnc?+<=3rP4tGXrQ z0z7lMQ$S`Erd(X0Q1-QDCR)-@ZV_-%j)x{UbDs?7NpLGqAZ+ zQucup-_T|#_<9C;Oeeo|?aIpAt#ek6A$YjZA-$_tQqDKdy^PW`JyK|?au;@7?ppGX z@NY6tb2`Sr*2;aw$&>lV%>7R%4CwX&C%3p_8kvtY$7rWqxe=VY6h5PG(>N!WTC7xFO`y!fL?H2jkBM<$4}TBj z=6FGsrVTx>#IAA7j|EPD){lPCU@2wvsHNm@(wYvAzx!-%vxu+=eLk@?jIIrxV!@lbh zcZXA~%4Nf6X2Tbw@JXRZ=McTk_y9&K%euiW&!+Gy$~(6=1wX*-8BRHZdN*;}=ne0^ z{Q4Hhbup?iE)GTgmy@q9bcOi0VNg#oj}wbK*T#8Cff98(`o+p98jalzkLr5#_xKqS z6eOp+(X!CToeb&#VLXGdyx9U7JPL0W@62%Ctbp@jpNvaA zR>&R#M^LviM#ZV?8$?{mZ0xx>O!$=50}>JR;%PUKmJqa8yySwCyx}s}t!TNeGlxA% zdh5;iqkwU=dvTh^tf&nhO!oIG`pbgk9@|HLVM*DJ?<7e=CaiS?4XfY$-;jf@d}H?I;%UN7M^dGzSl>>PgCX&8&Ex-~H2$xrN>C2b zqAG(CJ=w9?KO1_^SNU|(K0G*6Yedio;u6j+AW;^jNy3M=Z~)y3MQ2xS3y$Hpm~a_E?2igimyx3^PX zP`tbdrls5h@>X>mjZF-pi!0x9PUg6@@s~D)eB+sJS-JcSji55STAnB-qfTy|uM1Iq z>xp%Vxwmo%FA+h(Ap+?GxVfx9Whq)_&ks6sWJC7wJmgbH)hrI8ghyP|6cl)GkBeVH z+4~~AVbyYES?Bupk)%}t^O#-fe8To`#Qwk33!3)KA@hbG$%bnLmHGMrGI6TzlsVqa zo^!h8O+Vn(=b;relZq}|MhsOK6m!L#spH~{=@A<*&ftzy4`p1l8BD~A-kxTn%mZX_mGd^g&N`jj>uHufg8i^dHs^W6106yc4mo@P zCMI-=sP!q0%_++|x|K2g%_!-XZ26iM9on2fuNKrXK9KOf!H&b(B0(z3OL`%L8#zxO zDCe_t*snf>OS|9f5ft?VMHWaWROgf4Gam4OuIQ>W`^`l%N|J6sP~Nev|HA?~U*Qdm z55#%CEk{+^GN757l}#TP$lyly@3C*!x3fQfnc)_4mzS8vFR2IzehqfLr;grmQW|iqyCl8|(_d#5J&m;w z=ZS~d7uQQRoFr!htB@*M9?!U==biDJ#Tv6!8PEINJ7X)5q#ny_Me_VwP%I`WGcESDqV3^ zLD{o{!npDt8+MoO9(WaEKwKfzbYIix%(pLp!9L0nT-uu-0tDsZED1ego&-6cG9Pj` zyyXEQM0qj(ekfJ3lwa(+w9CQB>+l_IX(m zrQI^`KfK`Mdb;$^k(5;kWUyx+&f~xk4gO(AyU9KK6gMSD7kb0)oj^t(Cxgu)k3tO{ zCFTJn$!Hx@!}@gADk~`5Lnuu@Pf9|RjjJ_ey|;oMJiRdSKl0NnF3;d(*?Bti>^srm z_4vDH%^=p(t)R)le8Z!qEzI>Fx`&KAz+I4#l?gsMqg7f^q{7KHjH3#B5940=F9@pB z3(g~h6I2M#d9woc-Dntu4%w`MpgiExaA^zk5FPsWUJ}~#37Jz43OYDIgc9Vja|fia z;W9ygMtTK|yWS7n^g{4Fa57i~@;_$V6?HuO7$HGr!@K4w5Ht`$(8tPy={RJsGmCi7 zSL&|U5Ab|y?X@shpB6besT*}`*f*Y7@67^#!$Ogl<{a;wU@w3TQIFw(T2ccv#- z+&~2$KzoDgf`ST-=y#3Zok@nlcyPnW;82Bto)8rFrziIgV81LHu%amL&axTFlFJ8v zN)DnHq?b|jvRR^{$jusCg+}ga6+AkpGkF2Zi_5<2)1VbC3wnZ__xegVNKVHga>9QpA=_zL2BRb* z)L_35`^B<-6Af4~nY__!#(HsFjM@Lc7lp8-WyG0GUfcP1*{OR(ONYGN>TdH1OeSJo zTv0;_in>lnFgW$|S-7CM@6Ov|d!ntTFfNOVz=jcWH5t6uf;iUsblG`S2Q%A#hoH}Y zSj=>6mgKVBb!m(2e4;jy2&0yyeUT?{Y2(FbGI@10X&025M97JHqO1sI972Ih%_xEe zjtsZR^>EVN;iFT+ct{?es{@7v@eX+StTL$6J}3F{#>c&OY_x+$$)4=e;dD89#~`rzNB1Tz5yT z2`y!?dqM7@LM+=?S4&>dqVxAkzKp(YR>+buamYc?p~@?FsGES)h`oR|Zn>vmKX)D>RIgIxC5Wl$_J*26xN*o7fEQxdBZ!pnd0aV?R$9q9I#y z9w$eWB3A+0PGf3A(2u76m-Ztf6KyJ>JwYi#<7W%$`;wCPSx-u3Sf7R;&G_p!UO`FS zf>PZmM%uVUwiu_B4QoM%-EcbU@I{bSB97Q^FGj=llO^X-T!`pnwM0hWJVQ2| zJwa5XS$RXYK;T-%W(WR?oSuJtU)4{suY8j8n(??jUM?u|0F#pF;X)M}#-II4)OSvc ztp~zEj7!Mb3?3uklC7N+Omyu(m-AY%uf>^N-;|_$zOR?WrfoU1F3oPRU!=V3U|aM| zdmPm6wJKG}&l<7cFSw?~%KoJa=^@K0PGww*FjqD#1D9%Pg@*BG68+?y)=)qRnddzl zk0o-v3?90{hKtep^^VH169o80s^)aeX3+o{Kz%4T*&+G;Hmh{4(H^ zvOmeYMzMG|kv;6Pb>q|zn5vNR1@7v=d+3;Z3Y&Y{V*yI=K zf38MAn`FsceIjLllE;U7eTyg-`|uskW5n#ztMo&&VWM3XKxWDH?X4Tsk&=f->cmh~ zI4BSi?vMj})xJM;B8w+jNv{?&Sf!Z6Cvht}Z?W)}(ekYyy^25mPT&AGB>1$HW#kv^ zOF&Ec(HV?-ZZ{jYKR$d2*JBALnw1l3;^OEveLwCx_>zcyGK1Xd>`*Vhyl`{OB-u^K ze)O-!r1#}_e;cH{oX*%iM6)d@WG__+N_g>c!(r0TpMUprS#P6AKnym&7Cj=dFB!Zw z_kLI)9dWo$08KtA#@~+vzS9iOyMm_i{+Hi)eVYlO>C&40XOkDj;a{5^lja*GR|)-Sz^v_gEiQ5*vtv1TH@PW|B@Ozi%iK3pDa`H1TU{p1BZZ`u^vm4agXXzprug4Xw69>X2urTqpT_ z^W`M}eWMM(I6Ov)Ce)MLA6sGfDazZuXHE7Ss~dRy&C#25^15D8oESgg%kEaw5fc@3 z#5vip=5pGwM@!B2*jD^dgrJvvI@?#jVp2EQc&SODPNx=bN!`W;j$SmW5MC>Q18G0oQ0WilIo|V4tRwW!#CyfPtSOe@gD>~}9 zgkz5dVHk14L3DZrg02Fx0{D7?{rZB|3*-+?8@*Q)m9)`FLw)D^8tim}B3&jZh{4;h z>l8Ih<+v1K8w=JG6r&Z9iUB&^E=S5LR8zr1^2ZUh`rfNZ>aliQLeB=w{o7dKRhOqqr$nr4Vd38l+r<7`N zqVP}3`JvIVJV#v~f3p0aDuH(7j$w56ElX;~^d`Hkp^ZiaWHSiEXyr--eNXtC5U6}e z8P&%HeDN@tix5<*N&OF{!2darRTQn@lTJlYb)Q)rD=Qij2;}(bj0e#b<1m<4rZ7^~ zv{A&UOBfFLbL>WFN`);D5Wn$g(SHXrpRbn&_M<=U3icyd=p%FpsJ)rmHshV~HTn zEl0g9_&ZvBX4sFCXi~2zfUJfE%KSL+LqmejIEjf2juk}BA|U7$OLKZfM7&#v%ype* zHMCKo7+<=CVel)_D_TLbEIW}$R3n&ST~B1#Zu$I(X#sSb@YFBPbTQpCq5QmT03E$@d6HRz@+_5aXLNekBCWB%YJxJ_N17 z^XiNoN?TJppOm7}^^NGG>hn{tKGy?TlOh*BX(lT9f(npWwFM^-NFz#1ajX#3hIFoi zRIwZ@X_vYRC7R=%ph$ay?qo9^&%+fE%sT$fX^HV}xYkCqw)W>^+(eTwygC zDIsd+qn@~ke`c=#5EWKX{{pLrp9-J!EdzQD4AfVYW}-OvmABI;Zw0A$WBT?W$?haX z8$BCnB;UlIyGErQu_=5M6uzMR;x(#WgLr(m+zyMVdhJ`u}?D2AY#d(>@9ZAZzgJ7NFwg)FG$H{M>cQP5t8c~)aIAH-QNav% zKpPELA>)vg(FY+QuG%jvs^S?Hy#~PyfP2ct+I89+P_AmCL@flWr;SPz1=?t(pgCu~;1+S~VZXDEl=NRwx_NyRuH8e2)kMZAKeKS=aVC17-?{n}iCT z>B1g~?a+Hh^`dtU9Db;e(}Z`;1zMLj3S{%a5)c=!0{$g=tHYFs zw8dV*^^GU?wB(mJ9+v@z!5_bo9|fobx?{h9pSrlqL~xpCNVXLOTAMbCGak4=Tpo|Y zDv^~`ztw^>UqxV^6M(NPh~?mq-(K-^-#G7ioyjBEpen$t!xL{GN}<;1P) z>^I4s(5?>?(zWzjqgXS%I{RZ6uBdudNh}9{{H+8(F0jf7-MvQ$(FcGDChQhqMjHs! zoHmL*W7F2YqPlaohC`0@;M!n5d?~{_d-aNRfv({1i|TWrdsPPkeE`UWJ|YYd6RQfe z32k(5fDC}3!?Ob}(mot8vFhW)m$w28?v}(4>G`N9sz8Sk@bTER=oaW+c7b{PP`v@{ z*F!C?D$pjh(P&84ymRZFv!EUkH#%?;$>wwH+pJ{Ul+faQTcE=?-g}7<*JY*#x`U8k zHAsN32X?<97$`6n%>`PYHj0|U=7Vj-s9O=v11;(7JRG7C*q95%avt|Ytcr1AZW34>s^?>40EFavc=X1Vm-OwVp5O?4ZtuT0ubuTiHm8mHn~s+--XSjcF6QF17oq@y8K>pls0STP z_b)I2-PI3e)e4%XV>-<`ykEoT9s2agRRvmyHVQ#)5sE#2rNJ%Ao-mmfLk{5n1Q(cx zZ`HP4z_6VTLCNU|2I|Jko@Aw;T}w#9Ds^u6T^%zSk4pMEv*aI%#4OJJbu;8@qBjlwI%lsyYDWi6L` z9+inf;K`r;4@p z|A=s30+mQbTpxn|640aO0&PGWl_)y0o0ema3t+ZAK}`;`)$!faKlsdP(-M3Ei6ZvF zTmZ9OM87*7=^VPiP;aaL(U$djrE!iF7Y+<`4IJwxw9$yD$99FTs+h9CczaxKCx<(; z6EEcW24iBdMKD9tG}Spth<;3$*`vA(OzJIai8r)7u_>WN8~P;Eb#Sbk&_)4$VMP}) z-i62IMh=^hYoF2bYew*=I%qs6S|j=~UF%#_?B^>!32q{Kwl zTmxU*cE6UEH^qJ%3$y`k6l`uD1~J@&pkdH_yC}jThcSXLdLa7!>C%!#L`VJw7Ob}+ zecsT%!VgkmVU&P@-mHpa-GnxZlp({EEhu*d-Sd8Dfz>>E6IRIYvB(*i?(5IByePZC zl7v6_)iD|nl=XQo`s7kx%zi;qgP=_XT9Y=4At@tLie&<38?Rx3a5gzyqR;@-?OZXA z=nqft1urnv+wku@r&=Ek5T(3e^NOcwfvnl40yU?NB4s2*?<>S`ACO)dE$|i*&WO06 zLW2WZ(6b;JY2imd7Svy0sJDK={XWuo-jU6TUDt|nLyQYjw`A&o z;3Ger4S^h8wAT`VMNA3@DteA7kHh-6%K>@X*1e3z-1K(G>++mo|!$ zqHDAR>E$t;`bcgLXM|j+CE!b}1zd1pY|CNAMGo6~5cIFUz))}f5wSkR*so)c0|1iL zY65LU8>Nnzl=i2-lbQ!SkjB@zq(Lu%jZsyR=L1n z-Q_tJx$r~7JBH9r1zL|biusz+d(l;jIz-%MBB&6^5ppRJ1XY0WUoNBjqkV;g{vX|F zY+F7|cT05oe$xxg6KLF5@Hn4365X9$VZTiUTAMZsK{@Zo2VD(zwEGwaDBiTCYN86c zMTGzekCvk+o#Zs;+83vYe)BtGLrj;HcdAKVUT=LtEj$jySD!=GT%fgSquBJ(go^b3 ztx3EDL|pD7LV#NZr7s|;4W2;!v?o30u6=yojT{{AnTRRVp{L-oD=#qA+hD{Akag1D z0LQvHZ4^nTLsP@@~Mo)h|b#Bm{d0=k||x3X41&>s6<9DaPGxR}n* z;B2+rsBteaS}xCc1r9_UFD-t`K-ME{d3Av{r;XygIA^|;97wf;Iq5zQjV|VLD82Yt z3U1sl775JP*-hBCkT=IuF^h~(W~@JE`4?EvsU~QNO9nlEkw4Gd6A*6K7ie?ZsLzy@ zziAfYqDRkqpGd^1f-4Fo=67v)W|^Rd-@2XBZc^C$4*EB^z=%+u%V>Q0K3HcP3A8zF z6inHduiAD66uosOtBCt_d~2#hviLg)SuhsZxV7hUEI%mSi7pBq0HVz9;hM+AjX9z0~Z+!*}{H(C*aFYF5{?`#Fv=cNlQ zVYAc-Dn)=TZXnR+w9$y7eJMgDAB8zy`h9M^L=2`_e%J%=!DSTtZzkg-ai6F~xbK1& z*bnXnHpJ(?^&9DKCeY@zQB?J!_acwep4XPO%80?H07ax|75LeN<@vcqcu#U;ixAMI z7g($_Ui4h9w}f?@4G8q^X`|6U78Fyue^_5|&5sB;%zLsg!mU!IG8I606YjeuK}|W? zP9riG*hgySYCx{d1=<`|N4b2evHyJoqY`nF!t*u`ko@po`9h@v2yZBQ+bX@l9&Rm` z=d}cV_cXulHJGy4Vr7r=ylAIOB^|$O<2NZF06QUlRds=JdFBfY^|pd=_OL1Vdc*NP zLg-!cUL!>ej$gi6(l4UwXGP>-j&R?FFEDkygx_5%C!9r-X5G*1cvC?q9-?%^%mFc2 znD?6@c!^r&7uajEZld0XsFi7|041)X&39b83=cX??sORg1WwqyGC2r%zANw4|~ z4D}YQ3x`@cQW(&q?izwd4SB3l|D}Kv1iS{S)#kj{dItICG*Db%UcGJkmg8PAkuSj{ z969yS%DEVh`op>5p{+oC z-R@6bf0!f+$eJ{W?Qsw6!LKex?}qmZ`Tl%3TwIp4RB!K=QY*njYc6P9sEB)-C{9wX zqVKuv!HZ-g-YXKOZoKnmu{pI8!ZZ_9*71(l0 zjex8`zT*4J8}ME`$NxVFx+AzF3$6T2ebE_!k}s0x5sDb%h0v$;E7f=qs3|M*UN;vM z&7!6RZmuVQTswx!m{<&`2>Nxmv7k=%El>LFcqiM+K08q8LF59CU_IWef6IUXT*T*Xo6@{MI*+Yc6hHuLVU42 zG2kCYRiTX?UpmDi1Y|uGcrNDw@n{o|D;=zS6&3}Kt}*Ym8Q>PYKmRKBue>3;+%*QU zgC~k+9WNs9)ZcZ2ic=y~OqT2h_>RvHC7PWoIqieUVBT(oHUWuN=DqrY0-#vJ`}->h zx&zoK$HImo3do{BG?s~6#U%nKEGW&6rTE4vxj@#J0YOQCtVFE^l$XT_UNaYjOV|dy zS6@(%_g6-5J+ZLSdNyWrk~K5zRYBwN=+}<`kSfFTfG;`CW<(Y?hlQ8tUc{*~+EUwf z_@Nrf`WEcLwRo>v83gs3xKVj;lg%`!08KG0uQl+mf|kqkL;));SGB@?hj%ML*5hai z$Qp(WD?!m!&U0bF7(opmOuFmwUQu!_G59kBxGjyjj!ge|DbQDWQJ}RE{qZ`p(I5s7 zV(4fUgl?6fv#A2IW?A}kCn+D40$E*@mnAchCaruvTATNZB+jxcN)KGXt-ptk?QLc> z)`x}e8?Q5)jg}Aq(Ir~k**P*X^kW?zMemzFVdpYC&VD8VeqIS=b@`!+cF8oy?w$2` zuMkv9dSMj8YXfK(fK)5k=oN9Z2sUQ$qneHW9Yz3B#L5~7>s!{eoaCz@mr79#*?Y!& z=RKFb(CaVX+yg%pl#kJe0Ax1hz52vp5}ROrg2(E?MrRoi-VdDDnN0_%j6{N9mCM4E zfGkLp!A(OQ8`rL|98Bdv*2L#&o^}3sF#^r8G4B;gY_3Q}z(!9H=CMX5yE5=?^>one zHXj;VX|I)m!JUO^GVYc;yj7M}v%J(QfPI1|XGw5##?9p-%`xe&&U=*vmKT(k?Xr-> zUx`USy(GI7aS+o%vwJssT9^#*Jj6bV<9BM9xJ-BBVGy)L>f&ZJ9dNj1cube437X@| zyw^zIVb`WjKWoBcjXKxnBL(C<@Xni#zX(Dr2h8mM0Zl!g zriaG_&2e?!D|K`dPcz$PC8e(!P}J5Z)-=KE%!Y!3$Yn#+!Sh@gnn|~U^ArNI?kO~# ztWLr_P4ak}4xn^Z-fN_i7~D{_t>rI#5nV6#iDDaU%#9UIKqd0KDmb~*lF7SR*<~((%gNrmn554)IBmv{hr^%G}yHSAP zs*l31bWc1Qmhd!(2E!!MuE~3is54hb-uYy5IOb5G$-G$T&%OX(+h_nF1wsjM1@OD3 zSjZy(D3Ebr%Ydf|Fv7tCHfSy0E3z0d_v`F2Vy>iI4M-2YWSRl*yvYCt)TMx)iQiA* zcc2iNh(l}xba2iZEuY1%Jvsuq!vmDA&3lb=(lPhr2UgWbh`E5CC@0i03-A`a$(Tbc z3y1$OOwI#-R{>ceD02>EC4jL&*;V2(hlBNbuW`aqO5(9cMDrV`B<9!)k7mc?=JVv; z+oLvm^;(yFA@doKkBo+ zA9Eu0HnXvq1&`k`@?}pu?qWlIS-gmoz#tq&a3%PdG&4NS%fzQSZoqp*%;CjWpxz}C zMTu6FocolRW{0=DmB%(1i;V1>r9C1Q3C#tK4%5!;%CP=IN3nah_%s8T`Hz%>Jk4mZ z3Ga1}+$0v;q=A1)Qo*+^@GA(Gm%Vb@1ANl9iW*2s3=XU3cNjTJr&C6z4oZ$98UR{T z=#d*GQHjYX+%eET$TJ1??G5iQ6`s97<)wCQ5dSD znQNdOeULr_on-_~d zjzVFN5uU&tkb(>L$G~H1x(q7>Kad_ivA^dOf^66L!qt`+~vJ)i}_V}uXsN(f-Xzcb%?=5 zFPkME-g(HpY`oU4F^(*(PY6=E=l3xDHIzvHY!~Sv6I}I%EiJ~bq+!cDIwfbU@tFKD z2pVc^#QaLU*GQVIGNibbNB~bZw{pHu^>j2S!{qF#yyUI_*=R&;-#{zJBpK}RVFndT z-y6%0Cnke)N6^5^Bgq3H)+#Dx-^F8Y%zI5`croWoBs5>ED8J5JeLNrt>f*Ay>!tjW zDAL|a)%DVLkWj6ilPdH@dZacStJv1Gm<13G`A7G@O869bOb1Z94(}COIxz=9ArSy| z(%Qt5k-y`0wn6b<57*53lr_=Jm)t-rk%;`sV%1S-H3jll$hT$kI>s>5)X3m5#|}>u zfYN5X*RH4h-({z{ zMdJQ_RZY}K*S9>)IRW@1fUSJq>tBa>uT#e^yYO;idJPqGc>{^wE1X`j`RidlgF^H? zD#-i{695p2qMraVS3+8id%8tY}4o|F`E5Q{^m-So(SBT*>Sex@kVLuCvtSJ_7W`tmIYxkSW~3hrFd6UXk3 zuS4ZG5=V`Vmj*9`nR$11V_v%-O#h4>1LK4xy0ePyarh~xjIgmKoK+s7q{`CI5 zFiIXu+}KejDDjR(AsyU+{qc?gQka*AvJ<%mpNJ=&b^LQ583p=G#;&RL^z86Fjuhx!^Wt(P=#Gc@Y8F5%;8MW+(d$^72N{*|up#qNPvyIgxfm%Q1l0ZI zt2u2nCus}Xx>^B`zZGpHs3E@a<+schyi2XBmH+zBuMu%b;W@N90P`XtuYsrOfId9) zX$xIkt1 zSyaeIm`V(urjr)F{xI(=`r{&k8H8I}W&jTY5|PyBf>>v_`92#0BD3}oUxfI=&C|mb z1=Xy-?;fTuo{>t*Z=^1={L3ToG}kd7k-aSupwYf1+~S1~gwQZIV6n}EKC7I%{ow<1b=&*1e+tUnN38w`>QcmJO@Ht)w=kCBw=jUn8c zFE@es=iN##q=jJpk6N0?I!HbOeQnbbtn}#ct&CRM+&qxMf~5RL16hec6vs=3 zi^-EKZ+xF`ymtC9qWH|f*P#FAgSu-hYN?3(deswr=jOTGa+jr<$~sCt;-BA>$&JTN zTubrqBCBYYVZln2GqLh+Mzp)y{C4_o&4Zu_3P1V8KffpY{^$)~#TK>}>Y(c>XMY}q zX!HM@>aZ&`!Sr35kAS44`Ie&&h=1PY_*^5=(Q$-2=rHB%&&=EbG^Kvm48I#CT_%X6 z@6<^)83c=wP@z<73gaib(FKsL7<>lilCF%hmGWkg%BV#!2}SCI{RI1 zzk&5Rl9HA`cnNPbib=qEMAaz0ddk`6U_DT1KE6m26>mu+K^-bZcNP1?2IeWw1xfjA z$uJRZR{85GXPXNOdL>hyl1W2oM+_z$5~qQEY@sgg!Bl>iqn>gGL2>=+BwOhr>d>BQ zc`5^LCj-O+Ot?`4`D^2 zOI`cH*%7XgKj*lUG^3nBo0u6=BlI&X*Of5UQGh|yESqUsjC^&-@#^dD3iiV%)~Q4` zZ$2_R9<4+q;1Mgy{E4eci%E@NKuI^#g$^-!cw_ov)&t9eWHZDOXZ)lZK4gJDOezdHjIeIiaXC)nu{REh(7B+s77S zQ4(||_EEROf}+bp)3K4BOh6Ri%Pnvq)0@nroI#gmLBaKGM7xYqhW!m=hgh400LhV% z#q3bNW#teHq}g%y8SD>1jjUt|etbUC4DzQNC<<(!PA;M=MXwOwrD}n4R*pRKpj`EW z8mOa1(^X(lSWwngLoBFcy$Y|$j@3@4JjalR9y@ibN>Ixn2N8O+03{MNWwg^?EOZ5p zn9I1B1_hlXkJ`d5TkL1*LGam0Q2>)!O?5nNp&}Yw(~W#Z9fG=PCS_~3K*x0KS6!?< zR9secQ$d-hPAa+Pl(T`(u;!%GoRvZG`PvaP~UbN_VPH zlM+x;JO(DLhUy3qR?m8+Ql~hxf+8xY!*oniqo-=FF1ixXm4f`pYi&2%J0!o@$@{w%S;!4VL-bJ;ESEAE2^B{XWt*uC>S!C=FsAK$x z{W{pWh1o&TcOWRjhdMg(-&$B0m}m-lv}I#$Xp~X3<8D>Xi=;B7GgI)C%SWI(RtO6E zls;$RE?t;iO5GKtR+iz-2PPR6#&0sWz_+KQ+0_+@{co!pfuzlL4 zx8B$5BNF71L9#ATwq90In0JJz%nJjYwi`vhtMZDG0w(9xm8o(WgaA)a5Lrq5zrFVK z-#=2#@RYX{O^~xz{*YY9*A_yE zEC{38O!uk~B6J0QD8>$j=$NJny#74#7{H1MJ&PT{Fc{<;51(>o{u*>ZIm6I?3JJX- zg}Fmy_)|UghYfQAXiddZ`Ar~tx?bhf0Y9{&X*u1+~aklGsf*iLTXOUw*@kq4zhG@W^Mr2=9hd7~DT**~xq!ZP_fYI?HFz!t(P zDz1ZU-h4EtoZ-iKB}y#{9Su;8puo@oLa4AEK_o&1h{fe1WKZ~^j2V8?Zby9?H02tw#f6wL`{MQ}k9v_B}fpJ)cK z(BoB0#n`)Prr38XDx{0s48FD|J5X*|9t%rU6*pU=Uf)K(R5mZQpPeOgs9f1w61^&7b1mOnB%uemHpDX zC0{*IeZP-v-i#HtF6C@*V5hnbP*xqHluZ`q+Cgji5uJDy4!_&Cn!@V6GNX>-b1Ew=1{DO=%l z1xsoM@F?`b7yx2n!6_O#X7hn_OmXOJ6Y^D0gLhLkfOTZXf(P_&))rZXul zrG>f$hz02o9V_?pD&|6S`v;3r(VRhEKQ^SCZE+}w--9J=84HTy6J+1zo$1Lv=E{co zs)L0M6U*v=Q+`z^sLajpYWs26{$9%?LVL(&12BFn@zJ=9ZbCUr)#%N3fspbzaOG)m z_f+VWF{f}q&=$3pz*cD`I0c0rX;x`Js$`Jc=?CZMxru|U%c5g$Ul($Q zcf7^Hi;k3{ET&Ci2wK8dJ+h2F@hJqc0G8sYvHgY&^7G9=H_a($kuU-Kb8Okcz~jJi zKjV|^)hG4s9;JmXi9{l(%VtC$0dPtj0H;8p)$FtS9ub=MDv{0Wk_GB1XBd&XEcyx| z=P|REC#4UA^SF>hb8ub)9f&x5yy4t{XKa4R}z|MoJEVOj(9lJhPBJN*B_Gsf7a{Rp{Cu!~Pi< z4a*Gj(`=XKIX_&w^O}=`Hlduc-?*AeIdEP78AQa3M3|ySTrwair(@*Jf5jfLPwJ*z zW-eq;j{S&!1^cOM|7V!B%pji%?K}=4o1>L(qzx!%5n-U6spr5&I)YN22EFzog)mfB zT0apehz6&`k~NtB(RF}HMDMG6^}exB>B9VM3-etDIcZ^IZySW9X*SlOoZ+&V!<5T7 zaIFwZ(4z0gsf{?x?ZAdHBF%M^Sf@ChJEd7+H<`bSH~GFQ5gG*qK`o;J(P>jGEyktD z=5Y@zwB{u$k5iF^n8*8+#rvF|Y&q>3nJ^H}0kVV+|TV7%FAPB}ZGI2X_R8e3-D znafh{IySMdP=ee57*x-&KpKPum7?;~@Bg}MTvQMX!(0I63HBp7=1G3x*|$i6<1n*1 z)qFtUVet~M{%B4)i?&>B*}V9J16Ovs`+~lU4~Hh=b{7S@4ir(%*c<#&fIvF$hx z)Lc&Hv#w{~)QBJbHcNz8aPHUv7;iS3Q_cX05wi72*D46AuEu*f-4IMF9)Hb{52FtR zQipaNhEilMo=rf4pcc9ZcJwMv@851Y_Ib8>g0moX802x@hM>v6H`8o$${FedN7~01 z-Dr$<#-Nn{0y6`GzUmkI3pmggkwC@DxE+)$P?+CE6443y584;|pMLi@IGBhGP{1z{ z+vN=MkI;KpjLj)$aPyxh#Dt!+5#KH-{<@!xD(gyLk$Spr8bn6X04P&4_O==V;bH+` zKZl@8jE3V-8~2QtxD4_$Fvy#Y%_(P5+E&=Ie>heklw#QIWKmZn4g3wCgoz8Ee#6<> zT93mCNl%G_4Dz(dTdH*RWgjAFg5JB~*qn0qoQKJ+h!oTsbosivV(FC+Jt#$(u_w^N z*Er%DLGyhH>Ga4ufvAKCJuwXOJ^;om;MX>%oFNlUZlznaTa?q~{h}x|FQHeye%J&` zLB*IME0|pe&w&7o;XuSDBRX}dXja9?3=j$Y>t>`U8Pe7e}@5-l>w|C=CcsQ%+`jwBXbBv+lH zr0JE1%^kuSHwx)76_lr~CT5ukoqze=&zC&}?)<+Eq81x$8A*HWl8ym6E3r;Oe5aMT zj?wqc=f;A$>D8MDgZvOAn$q4IqZC}T?rdPo3VM;pX>a*xkt#K^zIzHJIGp?cwL+Vf zdUS5$uA>6=@|VrPXsM-sHM>$-P`Sds_JIA(>fOVp=erWk2-njp@VmZG=O(HIqczef zW^CU@(tZCWFlRMA0lQ63Hb$qQ%hwF8QzNhR9@33-%&)f!ey3=H%_uH?c7`STp9;9x ztwjJC%*}&_L=(c_4m-L&5$^CrP&I43>NCxVkD2E;iROo0pah$=5SAwR^7pl~fz%i! z0$faLIfy-O#Lh1?{-lAT2E@H0^Ju%6y#COkYF2w?j#)S>hfM-Vp)rwT^|p2QG`I&TP;DV-%e04Mq)!yG+ALqRDEC##$ieJ(V4DroSzmdB=;J zR2LV42)Yp%&F4j6c7;O-ov+Rr;L3`w&{SHVaL7LVNaLgwDLTe{$(yEVOypQoSsMcv z!B&EzAwjnj9+(ZdLFH)~fU9e``L07Qol5h?dR{Ah13Pt}=i9sq0S=GX$uTTniG?W6 zz?&}sM)L%vzHl5cJIIa8{CWaXYI8w}*OlWIg=VhVcN)*bUg0^T+8jgl!*pp&knp0~ zmH^Sd4{m(4O&+_J4>*ZcbX!d>$~1GE652}OeD26bi{G6MJx zL<$Ki(cC=8V$*I^-vI!Z-A=`q>@yc!7KT)1vzQDR!1x2^g-do*#f>SHY}oaFRLv}u zL*~WekbB5snhw}^I`M%b8r*hjHJb-6)6b|x^rTPdM=x>=2E?sJD{?C zIGytWI}O2Q5_YqzBJITsA)16ZH^hGo*wf@9D0X385ZR}vdYL&3bI3@9Fii?D!R&Hg zh&(|x5ce@@UxGP?ao4{C62E;2gUeDPvizc7vr=J3328{xFH#}0{`%3-5=~0{nJwia zLZ|$YNfTCy=xTn**(2FC5}}MH6$|A;9tDy796PShv2fdsT8_Z?fIC5O*%Kl0A?Q$X zcNoN^!9nuh6J4)>W$}w!L_7-QB0{J1kOihThd>fppp~U+1``v48kS&YMe6zyF+J5e z27-u~#&#=O0+g(B0FC}+6i5w23DdyEWXV3Ok8k5!*v%uur5jaoC`~RtwxLs2hoY9b zWuz#oT@N%0u7s+I0V1DL^pVjY6Y#-yb~j^}G7%IxRw?M6#%=eG7L)*7%r(mHCi562 zk@^`LzFDP=+l2SeAE7pNuDNm^r6m&*TvX`Eq8DB@N==2F&(?HhB979V` z-*!V#*Bh~|gLHc8f#ax!Z{u^s{YV`Xr#CDVGzxPlwJtZ0Z0gnv3WdZY;1=uYjOs~` zy{fgtTM~rGb$yQE21DD8{>^*q@iq-_WZi&-vL&b7EoI-OM0>0eU76m1xpYaBT)g4b z^#rXrhyqkig&I}8p-WV4 z_n6}Wyw0QvnK3GS;Nn#WU^LJ7MMjmNg8@Pe2#V0jg@2NH(NIUH6Q2eH^OU3l^aQ7< zqats4UE_*FO<=Az>XaL8JJ_Mn} zMYYkwRweO;&UmLR8QFVfS`?MEucn+~oqNc+hx_wsMsP|!X;f-DkYkRb*)iW>rtMa3 z!Rfpu_?P;e4};78*O>vMb$y1E%m#ns(%>%30vaqwow?cP^*NuIL%wwAcO`T{(2Q`( zqG-56+;MX(Na~U3Bn-gXCr&Ugao%jm)Y7k%HsxdBB) zi662(h*3^*xv>8)99r#=x&8u`fUN=ePKai7 z?gcYwXTco9S)nC3Ovq^oge^R(rP+nRW#<}Ph7fmV$C&J@pEyJ-Oosf-lEv#=nNNsq zKWo6&0EelJW(0wdW1;v#jwNnOaG=eqxkl2P&ypH28oUpK(MFE%S9@B1PyKTg2nb^> zWA;7V))j<39CCTqU<*If=sS0IFpFW@3kfiKOOeym=}3%TtOrIr4}i(C1G$~xGdRGx7sJF%$keDz;|kCMrh|?`XCTLi6CWFmUXLJ0#esqH5hGXH7W%z z0>vckJ9eJR=#0Z9QmS~hgr4O+qQk8|WT}S1tdVmgYS+<>{F`zYU_FF{lVgeB5}$lzLu^_3dCN!cFaG5Y5j);yXhKHtC`}a2D-}i6d}+DH;;S@STG!<}!eI%n!L=mI%Mxb2xi1 zYiLFnU2IpzFL+Hwj`?kh*Am!>NScAs3fPW*=_aFgig@^f(%t|_6E@BAYv*|~1V!xN za|Qr1xU#f0QPU)Xf5-#y6C2Wu6dl5DSNM`OIp%k`5ELnfi15H@6GJFj0+$UO2!y$r zURl;$&&S5?kz<@*E;>qOxfET}~9l z2@V?5j36jDVLI_)+Gky&o`+k41C(dKXsMWsl|~xH2XGm<3t&jeCQ}ukNO_;Ih59fl ziG~XD=C)qwB*J{*9fS|RYNVCu+0?CcJaBjM+Ku`9_(u{hb8HHhg+hW=B zB_Y3`V=TMZ5`^3CVHjN24uH#M9=J@L*S^!3C#MStqn~9rkx%@1U-zvAqM?DH+iIaX z++iR&q*#i23fKyu*% zaBozs)Yz22_vv@TzX~Edo{3M%Ry?1Kn6m{JN2Rx0Kz{G6F#1(30V2W$m+b>w*7v|= zKJ$WE0=wpaGAm4W8K4OeQb4sC=i6yqJ5izO;u zIq@88Hm2~+gj?Bnk>Z2p9s;|LG{90P0uH$ZCm0>QW}4B*=Up7Kmgr}QIdIzcVH!E6 z0w{ap0fuByc}u`4Rt`q%niBt87hHCeop|WG`(3?}NK?+l88ck_k(lOWRDX;^t(BFM)6E`=Xy>(gcl!ho16DIMKqXt1z*YlmhA&M zIMw9nL9Fk+ceeQ<5C49*4^$KDh|6g$3T=7(|+4s7>b~U7dv?ERtXsG6Gr-o zO53UONs;3^p{R=#x9>|A&e$SLnWJUrxn?~dbE_7`PH{_)!@gjl!lvBU+UZ0%8zcbx zc$Hn4Aexn@v&M#VKv2P*nfQqaIR?{i+fC1Y6=(_0C@Kfr?tk)J$Yl)L0v8G>xRVg( zCPbN|6HlY|t4|o=a`?ADu%d_tMZn(Ksur~Of-~W7V7@pbfPFmlnjEu`!W4Q(f4+`z z_6r2Z&o`1~cJ|;SYx+2IQ{J`&Z5LjAb`SSmkhoI_XltA@nk#k4Xs0t;rn2OmU+Mj3 zG=%6A#j_eu#n@u~zs|7JaMlR$N#O*IL%<0Nkn-4Lf|w1wdMJLQ4BZ?D3WSZH^i|6w zB+Wo?by@-dJKdJR>#;)qd^35?ZJO&UEzjj=0CH9fus0h0KkSHlUQf;|QAZU3w zLF^jnHHQ>N6cK1fb@2nsLMn8=OsetYa+YWbg7;m>pZyoCXRS;c7QwD_EHvRD7;K;7 z$&l(FK&q`63j{3(&`3d25~J7j22w->XhtP;uJ4$KIGMPXVH)VxS9IR>+HSAM^8FFe zR*_O8kpwf>2xk(T*byoq3q!F~Le&3imvqu_94+Gnr>znu2)%qwUO4|4PRRUu4=^bi zL}J<}PRGLQl#+#(K=)Yxubul>ZRCpLIDRj3lkOfXMuW12GqAyICnk{9rdh)njJq+6 zA3%@?NVbquP8P##7hwoi>BW`UV%gU1R{K=Z{UiM{b4Qvfq>B#Z`vB(Nqcf7Q;3JyC z*WHpz8cn}+qxec1x2kbi{_@vkz8vY_7Cxo5b-X1~c0`5tdh4){YBoXi1rpWfR6*wg zCbjWT561Tc<8_*W7x7tVmyvD@MXH;17AaZu-zTKH43y0B|K1 zm>{IqQW%Wb^9?%JC@PZH>ki%xmh15R#xAa+2rgrr-bY0Z18UO~|L7>+%jGf*wDGSz zSxmL+bP-`hok%PCvRyNR*r`bM=(*FU>a+b+)hCbcG8%Ss8F9N#NnErQ=+T}`WiT{^ zHoZAn0DMVA4*&kW1yw2WOtXcHKn3JvQNwQo46fKN0$%J}yF_Y(R*>Hq#%{uG zqP}Bs^IHy&Z&yjuU$OdItleR=y7o^jc!kaIEu&o~OC_lXYqy&S1qF^lZM4;nSA$^f zZas%g;G4lzVo)n>74F>&rjQ48R~^ANt`634^BrQ;AVhOH9VGh(KFG$_rHb z)_Oas28>F08sND2MEV|ZEIb%wzrnQ9T7gw|Qg|9L%NPXh%sLkKBG;>D4M;$kS9L{h zx}lnLz*J%ow6h`jxHMhCAc3DXBKz~eC(uQfLihjlf`P%JJz7$jTDO=IG`J-lA6I$c!VVPb+K86Da3{IMIrs!V&J5L( zL7`Uz0M?I|-6V4msEk|!A7^PRJ5+m+)>gw4oG&^v{`2%x+$ z!BoOI2+Sp)PUs}B+gurGC@<`4P?Hgs;T&v|G2tShcQlk2hr0?mE~=PH`W$gAxC9)^ zw~REqFbQy#c2j8rorFd3_!?l4fZG96>CQKmn2Z#w;lm&|4hD$>ejmOvSb=9M0eoQ) z)U2#7wZXyKZ(x8HAM+MdiODnna~%e;{01DXeU|7-6Z8kqR04p1pkXg89~b*l+fM*c z_t|(3$!C!|Q|Sx?jRC$K`Z&jH`tIt9%!*c_JR=Y8|0YDES${?FE&4h6rV;?e1Fkop zt?9e(wceLSO|V#yf1xQcB8?67lcYhhgTs2*N!24ttY7A&HV+mv?fE9~i;~w{O{Iz8 z5cT0$Kx*?GtN?H4nnv2nX)qY5-HiA5r7dc4u=bUuOuLv$JU-|lwFMq1qDoN<0d$xF zSb`7L>|g~LXri%#?WR)pl6d^)=>)P3Qrn4fumU{t57tyNz+ABjt~}rX2Wi=Aqtuqk zoW%YwGM*W%K%;AAABtV>!IcLc=(~Zj91|E*SRLCQRK9v288HUpiHre&hlEE$!alNYRk z_00^&MbUBWjsXIQ&p>}Mven|P5gh)qn_<1kumio-9@HE2R7m^U<}t(?24OYqO^nV( z&K(4_5+qntrxx#$1YPb^DmWEQfkP?By1iNiUk$mkrg{$V`mb1)rhJwZGTMp?BN8+O zW)v!CR8{aUIRtXaCP;1f6<7?IQJ9E~Z}v_f;~u&SkV^)EA%mLbJ9)v91LK?F7*HrP_uj|FI>%dm!zx3<6FTix-GSuHT^7*AS>5|3BFm?r~+QVD=GweYSs}2ya`Ap miDNKMIo9qF@{hs4|N9rlqnP8EN6Je80000N&i^l3IBZJ!{-wB|83&G@8=Ysuwmjj`eGx6ohuG6 zr)~bh9#bGX$1)xElqKseds!Bjbd>9KRegt7Ht8cmCq86+*Mnrwv*2uxZs^4|aTrUR z^yrvg+%ND0}I+eTw)YvO-GlZ_$MX8S~=Rph>{bPA)<@L$pSm08-{HMZ#NstA)? zswgGN$GYYu{k9Ep3*p$#bc~?5>h1>Z+|dqtNMp0qZ_V5goC_gVB?)>&cR`BF*yRo6(f~~Tb|G#R*{V+Xl;}IQD{V`=&L3sonkJ&d z<%+WnO?yX2fJhxkvu(I)!vy=1wCEUTp?NNEE`#^szUS&7bI5=w0gcuW<|1 z$cwbfZqsp|Ri-6Yox0>%jiN^(NSSkMQ2yMV%okYw)#FVb$%F3y#G(u~Cg!2A5Y zAZOZiaITigcBj)S+Jp^QycX)`Srp`gy){VvOn;Y)DsmD${#SaxBI5FQ6as|s8kMucS)44BD<#jDwz_K86K2ILg~xYU{?@V~KI zO||F<0AfObH&eC1G;ApJ4(^@=Uoxrw)Au5DF;$*_`bn>pniV6ZGj{KXv~5SZGK zXx^mAn>m$C@MO!sdn@fW`g^5e|(7mZLj+4gxAi}|Z{$rCI8e9`zHe!?$r4YHaCZ+oZF zw!?19KTQd>p5SZ$?%F^do_OMkC!ToXiSzgeJq$yP)!4-o00000NkvXXu0mjf_<{cj diff --git a/public/images/pokemon/back/shiny/753.json b/public/images/pokemon/back/shiny/753.json index 70c1091b725..f1d1bc11bb0 100644 --- a/public/images/pokemon/back/shiny/753.json +++ b/public/images/pokemon/back/shiny/753.json @@ -4,29 +4,2570 @@ "image": "753.png", "format": "RGBA8888", "size": { - "w": 45, - "h": 45 + "w": 140, + "h": 140 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0019.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { - "w": 28, - "h": 45 + "w": 31, + "h": 53 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 28, - "h": 45 + "y": 5, + "w": 31, + "h": 47 }, "frame": { "x": 0, "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 31, + "h": 47 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 31, + "h": 47 + }, + "frame": { + "x": 0, + "y": 47, + "w": 31, + "h": 47 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 31, + "h": 46 + }, + "frame": { + "x": 0, + "y": 94, + "w": 31, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 31, + "h": 46 + }, + "frame": { + "x": 0, + "y": 94, + "w": 31, + "h": 46 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 31, + "h": 46 + }, + "frame": { + "x": 0, + "y": 94, + "w": 31, + "h": 46 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 31, + "h": 46 + }, + "frame": { + "x": 0, + "y": 94, + "w": 31, + "h": 46 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 31, + "h": 46 + }, + "frame": { + "x": 0, + "y": 94, + "w": 31, + "h": 46 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 31, + "h": 46 + }, + "frame": { + "x": 0, + "y": 94, + "w": 31, + "h": 46 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 31, + "y": 47, + "w": 30, + "h": 47 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 7, + "w": 30, + "h": 46 + }, + "frame": { + "x": 31, + "y": 94, + "w": 30, + "h": 46 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 7, + "w": 30, + "h": 46 + }, + "frame": { + "x": 31, + "y": 94, + "w": 30, + "h": 46 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 30, + "h": 47 + }, + "frame": { + "x": 61, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 29, + "h": 47 + }, + "frame": { + "x": 91, + "y": 0, + "w": 29, + "h": 47 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 29, + "h": 47 + }, + "frame": { + "x": 91, + "y": 0, + "w": 29, + "h": 47 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 29, + "h": 47 + }, + "frame": { + "x": 91, + "y": 0, + "w": 29, + "h": 47 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 29, + "h": 47 + }, + "frame": { + "x": 91, + "y": 0, + "w": 29, + "h": 47 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 29, + "h": 47 + }, + "frame": { + "x": 61, + "y": 47, + "w": 29, + "h": 47 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 29, + "h": 47 + }, + "frame": { + "x": 61, + "y": 47, + "w": 29, + "h": 47 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 29, + "h": 47 + }, + "frame": { + "x": 61, + "y": 47, + "w": 29, + "h": 47 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 29, + "h": 47 + }, + "frame": { + "x": 61, + "y": 47, + "w": 29, + "h": 47 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, "w": 28, + "h": 46 + }, + "frame": { + "x": 61, + "y": 94, + "w": 28, + "h": 46 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 28, + "h": 46 + }, + "frame": { + "x": 61, + "y": 94, + "w": 28, + "h": 46 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 28, + "h": 46 + }, + "frame": { + "x": 61, + "y": 94, + "w": 28, + "h": 46 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 28, + "h": 46 + }, + "frame": { + "x": 61, + "y": 94, + "w": 28, + "h": 46 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 45 + }, + "frame": { + "x": 89, + "y": 94, + "w": 29, + "h": 45 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 45 + }, + "frame": { + "x": 89, + "y": 94, + "w": 29, + "h": 45 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 45 + }, + "frame": { + "x": 89, + "y": 94, + "w": 29, + "h": 45 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 45 + }, + "frame": { + "x": 89, + "y": 94, + "w": 29, + "h": 45 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 45 + }, + "frame": { + "x": 89, + "y": 94, + "w": 29, + "h": 45 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 31, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 45 + }, + "frame": { + "x": 89, + "y": 94, + "w": 29, "h": 45 } } @@ -36,6 +2577,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f2829e1ebd212cc5203393968a2efd5f:dd79bfe2b6a61007ace9092be7975ffe:16c1874bc814253ca78e52a99a340ff7$" + "smartupdate": "$TexturePacker:SmartUpdate:b6d27dc4e44833805071498f628d15c3:7ab61edae9d3eecb963334bb47dd5aa7:16c1874bc814253ca78e52a99a340ff7$" } } diff --git a/public/images/pokemon/back/shiny/753.png b/public/images/pokemon/back/shiny/753.png index aadcbe3fa04508f4a2949cc97e86a058b1027008..14f23fc6bb90dfa52bcfab1a181053d58bc48518 100644 GIT binary patch delta 2054 zcmV+h2>JK91C020 ze|niczrVlCy>R&W`2X;xcn<2A00001bW%=J06^y0W&i*Okx4{BRCr#^nL%sZRuqNx zYFtWJQpZutcw-cU3#KrxQZe-qAhuw-v?=W-t7PCILN_r3vkeHs>re193?mxqQB!jluD2a{An{4;tLsHP}PP zNWD1oNmGzq{xP~{TCc&cV?plnnrZ3mjm_etvc+oOah(yVsYz{3I>uOPYtpp5f5KcE z+Dp^GM-`+n*!n0yH`oI?M$KJ2w1;l;1Y|f#%Q=@26!HNIbA`DyuxE`}*KBm0=o%Y@ zE3Qjp_u}+?s800P#3&!6vC4H#48e1A#dT@yo_a7;YJfFErI*f?%F&*v94?qEu4{+( zRQ@v4HA3knHI!!Y8-*9l700Eaf4y8vZ3vmcQl=7_4N!*?FPJOLr7?RlgPIr}A!U|G z35%21*b*##g}XFn4{PApmD(&0RarZc^$d5wURt`CGk4JJRO*b16p&N>3~X`Zw)J^<%NR4DsX0e+_SHH757$?MmlB zE=ma&$kW$Q13&8SLckHxvo7SSEoE+Db7H=j7q>x@EZp{>ZL9fZ2chff(J zM6pCOZX+K)9E7^bhtDQ4>AhJ#Qy`S9T&)ImONv%4+%@c9_>*@9sHubS=2=Yv70 zc__C%`EU^WF!JFb^hce1j$6ow59JQ)jB?gZK5ZbxbH2kxT{ThU#e*98Xeo({I{r~$ z?hF_uQ@JIde?!QD1SL0I1hTaTbKj1DQKYiu^AuX^Tog#zRzr(xiEv}d2Z1IVRJcfj zY^{lrb<_yh2H*yO#?%xc-VYi1G=B}&WDnO~Aa8WdNdh?}pBfkSZ(3^>@Y%QW25KOr zf#w8rD?k>kA@Yg6wi-mH+h;cqkzjPqd>>E;$!A_8e;)y=WrEYi50|HN4JCjBub^fL zHEXD-kx$q37o%k`w@~8ueep~G1Zo%;wU2lOL=yNFpegz%Hb>;sISgw8;Rl}>`D{-x zUc_>YV3^(ZAjET=U?Q-)9)u{z35Hl;N|HSYu^b~9VuQ-Mv*)uMBNze`RzrJCGlJom z#0e&Fe{{pkPD+@>YRn$XF@h06Q1T7cP|WNFEXN4OkVuJ1G!&bbh{AJ3FqTA!zAA&U zDefgc%Q*xCu9Yd_6@4|%5D>-5F@gz)`R0g6WBbox4^hL(@s}M1@&ULmUWF24!-f|j zmtX`?zNgd&z>1S1d%j*GkRE}B7Tc0f5!Ft+9l?W-mb zLi%Aj#y7eK{4s+x@~DQ$hu&_KmeCFg2DSv}L&q5aAOHMaLxw znVcmU&!R^tu~m!juhD$rd`k!+paKIze>I@Va;jM(i0l|Fxi0>c>~p}8SaYjEDBRST z7a>b9AeGnC;&*u10ZQUE9E9?fdD+3FA(+oW^%inq-iI#TUnS&g4MHOWLY92WmmP1% z63mytGx1_R0C5dmB3&%%GZ50b3y@f22}aDphvMD>YS!Mutr5xV$r7G~3<%+iSkS$n zA&0U`FrtTafv19?;15Fj;AL+CJY^nSGzh^@WCUY;{Hg%{-dE!bY6lSV`zLz>%07*qoM6N<$f_ZDV-~a#s delta 421 zcmV;W0b2fz5V->-iBL{Q4GJ0x0000DNk~Le0000j0000j2m=5B01dv=-?684@Ki~zoO@4cqpo(` zOBv~6!@K7q8N)!!xFySoIOcbagI1jTEhKbSe>ttNG(g93;IQ)mq$QCgraIF-ln?r* zhdu`Hq^Ssp{;9m z&GpFF9cue2MOS^idefozO$OJXX||=fJOs#@r>$tYD-iJ%Sis)Ub?wC;fJzj3#7xe0 P00000NkvXXu0mjfr3Jw4 diff --git a/public/images/pokemon/back/shiny/754.json b/public/images/pokemon/back/shiny/754.json index 10165ba4b4a..8b1a3d44a4d 100644 --- a/public/images/pokemon/back/shiny/754.json +++ b/public/images/pokemon/back/shiny/754.json @@ -4,29 +4,1121 @@ "image": "754.png", "format": "RGBA8888", "size": { - "w": 68, - "h": 68 + "w": 222, + "h": 222 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0036.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 36, + "w": 92, "h": 68 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 36, + "w": 92, "h": 68 }, "frame": { "x": 0, "y": 0, - "w": 36, + "w": 92, + "h": 68 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 92, + "y": 0, + "w": 92, + "h": 68 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 184, + "y": 0, + "w": 38, + "h": 68 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 92, + "h": 68 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 92, + "h": 68 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 92, + "h": 68 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 92, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 92, + "h": 68 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 88, + "h": 68 + }, + "frame": { + "x": 92, + "y": 68, + "w": 88, + "h": 68 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 88, + "h": 68 + }, + "frame": { + "x": 92, + "y": 68, + "w": 88, + "h": 68 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 40, + "h": 68 + }, + "frame": { + "x": 180, + "y": 68, + "w": 40, + "h": 68 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 40, + "h": 68 + }, + "frame": { + "x": 180, + "y": 68, + "w": 40, + "h": 68 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 39, + "h": 68 + }, + "frame": { + "x": 92, + "y": 136, + "w": 39, + "h": 68 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 131, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, + "h": 68 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 92, + "h": 68 + }, + "spriteSourceSize": { + "x": 25, + "y": 0, + "w": 38, + "h": 68 + }, + "frame": { + "x": 169, + "y": 136, + "w": 38, "h": 68 } } @@ -36,6 +1128,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:fb4a59b5a68751679b02829509901f6d:d3641a5857a0273c94152df891d4cf5c:f7cb0e9bb3adbe899317e6e2e306035d$" + "smartupdate": "$TexturePacker:SmartUpdate:7651b73927071f2814265b66582a8d13:a2d1ef3cf0c2458640f77c2fbcc821a0:f7cb0e9bb3adbe899317e6e2e306035d$" } } diff --git a/public/images/pokemon/back/shiny/754.png b/public/images/pokemon/back/shiny/754.png index 47a582ff7883f33d7326488abffb40e3af06501a..1f7346ed822ae7a5f5d53874880134a108d990c8 100644 GIT binary patch delta 3613 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 delta 640 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 P00000NkvXXu0mjfca=Sz diff --git a/public/images/pokemon/exp/692.json b/public/images/pokemon/exp/692.json deleted file mode 100644 index 86b535260ae..00000000000 --- a/public/images/pokemon/exp/692.json +++ /dev/null @@ -1,794 +0,0 @@ -{ "frames": [ - { - "filename": "0001.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0002.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0003.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0004.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0005.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0006.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0007.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0008.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0009.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0010.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0011.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0012.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0013.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0014.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0015.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0016.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0017.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0018.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0019.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0020.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0021.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0022.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0023.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0024.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0025.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0026.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0027.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0028.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0029.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0030.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0031.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0032.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0033.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0034.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0035.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0036.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0037.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0038.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0039.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0040.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0041.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0042.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0043.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0044.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0045.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0046.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0047.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0048.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0049.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0050.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0051.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0052.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0053.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0054.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0055.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0056.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0057.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0058.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0059.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0060.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0061.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0062.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0063.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0064.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0065.png", - "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0066.png", - "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0067.png", - "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0068.png", - "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0069.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0070.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0071.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0072.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0073.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0074.png", - "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0075.png", - "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0076.png", - "frame": { "x": 117, "y": 72, "w": 59, "h": 33 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 33 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0077.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0078.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0079.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0080.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0081.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0082.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0083.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0084.png", - "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0085.png", - "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0086.png", - "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0087.png", - "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - } - ], - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.12-x64", - "image": "692.png", - "format": "I8", - "size": { "w": 239, "h": 106 }, - "scale": "1" - } -} diff --git a/public/images/pokemon/exp/692.png b/public/images/pokemon/exp/692.png deleted file mode 100644 index daa9db0a203be7bfe9b81f0f8ac9199b1f7ef65b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2580 zcmV+v3hVWWP)*$hx9Oqoww5il7w+*^*C`(BgI1u|M3Z$ z=!X9=0Se(4E&m*vZZcWxIJzNv=II=o>1n+!h~w$acqy0FgeFkaJ~{l*h>sTPWHw#v z``RY}n7&<6TUF^q-^bBcp2ITX+Vu$MNNcTA^|S6llkj*xN@m`kPG36|(I>adWQ{t? zW*K#F__CySwdYWc5KXj>s@Xdf#(M7U{N&35X{jxTn%;!!b2!&~RE{bvqhA($nf2Nb zGkOxf|Dlr-75GO%&+ne*sJqwoLq%UhbqGC5QdV*-9DTvdTvTd1G6+QP!gDOV{;9C$ zAo^g0b!4T@p~5K%3oSh}I<3}rPL&J-QBLmV$fC<9KHz26Ya8M7rv(cWElKYA>ZjVE zPGg^0DQpXa5@CJie|gVmVqr|d$N}q6D2y=D+*Y;e0EM3xr7$>we;O%k5a&`@(f_OB z$Py0xBA-#|E7x}dY+GR(VG_PL2n|GoD%o#=OKtry*@-`az_)tN&TVw!JA57M0?q?J z^Dv+3?RuRDZU6zqS6tiNCec~Z)w5zbI}t9QB1 zGwqQuej)%)o7?m#i)~?c;v*gVhRsnpvueA(?^gx^+Mv|4?-$qMAn4^;#xN%JKd-fm zl{S-!4>E{vNFz#Zxmi%qsu0eJO|9ClpZ-UQu!U030Txy)oPz^U3g`QmBU7Q$a=lzo8M zP2IG-tueC7aje>zn-VI6fUQAYzd$8I?!ryhdUlz?*=Zbk`}K~5chvrPf`i!Z@jkAz zv&Yle&0R`5^v7(;hp*R`LBKvK&lye(ZIrr`l7f4 zK_^<7?@Lfj?76nd+Jm4uFe=G1E>tP3|I5?ap(M=$QMye4tV00`3*IYl#~n#H&$Ug~ z9)w$>P(vMtw+QbTL19N#R|uw|n4NNVoR)a5JvCW-5MB$)VRT7Y)wV67fd@iasDM&i zvN8x~--hy>SdgcqDhZR^8I4^XmD=^J2YTIzG6QCE4#Ra?89E)c)UId2;kts>KcE~2 z96ETN1|x#mmfF8K6V?^9b?1hLT|-JY)^>hfTF~L)sQ(W-9#U8Ag8m_fL0d=TcDrEN z7nL>jMY|y|Q~m7%LHn-!a-^_1%WN-HU_hY#NGsK7CUCYlDt1ESk>0f%Go0;@ir4UA zfCIvraM6E1tB(skH!m*R0X+XcN*fD%qx=w$*8d^k6DK_66n3_SEw|C%0? zO@YZ&HCR!`E`ZLctj}C~+CZ~SF*O^1J)Z4?San5ZeZIx(TAVl1Y*Wa_UmX)~?Xm!O zLuGwF;Z;*;$NU92Bx6%ZS5=qeyk-|1N5#juBVpT4Fn`5SGG?2?bX6ad*aaed6cr!i zE)-$16Rvn6So0igH=#bJ3#wg9x1zE>|28KZL+k{IBToOQxe4_#r8VKBsI1Swfkg*^ zo2)XfpSTG^gR;kzet(+h*_Q1licPVBsx>YO;Bt^*keKzv)Oj1H@?0G0zzL&jqleLb@oi1GU z78bXmU)&w&2ju8x_7Wv8S1|OzeLFrO-Fw_bR!lDk=!W9G^cRk9n0~1SxOFo%K=)>? zzw-|BFT^jGJ#^(+!-|A^k@BT1j{ZHLCgI1lJ1@@~mgMSz8YFxlhbsAf=IIE!lJcx! zrcT0-I#mO7vGH)4pr3#pbmZk(!)T#!>DSov0O9*rp?e6I+(Jjxe%6r8yk0$z9Bty; ztNDQ!+4X&AVR_c@`RSd1*h#_p-T* z6LDOZPt2<|_uN^SOq=5OV_u-E4;xxTo;8pKQhWB$P5$#Hm>!-&FXz47HxC=S2?u`2 zLo&kV*+a*;2m<(inCDyC%W+FJ4;xxTo;9%dVtSTm4_#t0=O2i@E$!tjjLNE;aE9pj zC+XQdd*~G71z^x#zUTFrg#C85`mCYaGfIy-3a`uxv;D-vv|qRDR-ZMbR?itfd*~_* zMmYI|dwDv63?7fN_Ok}NXLba-hBCsuK=W=5?LhTe1C%{yz6%>bwnvzs`L8os%a4RS zYk2Niyo5f&UvYE4ex1s0-6cY>dKN>Vm$1fo14?%5E;0LH^$gNB??Bpy$3#ixshx-FiUJeVZ050$7;jhx9z8X@+n#ieWXh qXKs2x7(p1^GdKOmhBz*N`uHD_t?dpKsbp&a0000gP)0000gP)t-s0000G z5D+FNCUaOKB1>~XKtNw#U(B36|HMrH$XPaYvm>I&MU~}Y+VZ7$Ul9NR00DGTPE!Ct z=GbNc0AzGYL_t(|UhI}JZrm^sMMYZ&;0FTGaJMSmx`^w5)k3*L)TlO%095NrI*E#f z&XHoFLuE%Km#RpP0H+EoH4pRo=g&~pzdHX9z(xccI8p?Vd;|DMD8uKh<+4!VAwp3R zrm!1h_z)KnpfU%%6Lvc+8^A>ffPE)`#aLwxAF^QfG+u@s240)kh@h@kWq^o`1q3A1 zI0L{Oz6=XAlAluZMMVJkp%#weE0b&lEFi2Y95N0}B2z>+odXazNBNkF3OMez;*B zcIFP)zlj*ejB)Ly4>>h}he~G^$}NSm+9xRkKekvYk7Ujv`4q(wlfZ);J}FiKwL?3>V<{^VsG5rU`i)xefJU5TG%epNCU0&QV1%s8=@>uC-BM8rov&ObBLAg>RAH zin++Gi+ApMS^wOfn=%dc475IB7!wm?kf`#BzXD zPkPo!RWPaP)V;oQ8_>)uVQmk%XoH&N0yJ|$;;;Y)yx@1M8L5FhG8{FU;Xti`rh9x% zp#}FGwZW9@f4R>S5m`@VMn*+SIWjlgXbkWW5#M}%MOM`(8ofVj<$lM?q1I1bn_;zM z!A6eMNNym|4ep4E0Bm3n3O!l-5(}JUAdVyFgIym|e8cYl0+aBbVbLYwv~mf~a{IQl z=!-I&LDkUrv~u$<_i1#~Ld5A51#r8Z`Do`|3mhIRi)hX6#mRMq@11x9O+8C0S7pX?OGu#=iMQ@eRnd^F~MRx);Hx;F`96#EZtL~VXHW`+SBd&Rr?e92pa3D3{ zS(0blU+i=8b<2&DNaZ^F`%t1OW948NvKy2zW95dOCn!Ssn4tAh9D!>d_R=(pgnfoX z5}Id$B=I}@Aj)aL%C&uJ=-sB>0l)Va5qmsC=)-tvLtziiN|?_QbmPJ9Z&T_|@$-baR8yzC-jd(hf(gylG^TE zVt6Uc5>D0OE{gZk{|qY@3KzH4!W@pu^Y~9txE9;EcQf3^O5{H&AzW=8vm6J-OMh2B z+VD~_A^pMWrhlH+S}xB%L9nhQkn;V*J`G&emQ>EYnIOPJ=u6xTdBJuPi89J@qDMDq zm2kQBLh(27am{fD7cw zaDnzmOEs_S@6(`7Ih3R2@$m5>ZKF{^1|4%cR14F}g~{Pj__?>a;CWsg?--NeV?^Ot zxjq?fPbqiX^DO09d1`<$F4GmXt;+FSnNswMAMNL!cgOQqR^meGmHQmaCyP$1+%!=Q z1MaK%!A{Nek}?VApR~o8vS|DV3#U}j$|Yga3z|_Bg*Q;QolxXM{5%<&j=G%$KWgJ< z=1}gB<6~ zU6s43=J~k5r&FP~vU7V%x$~@Yw8Uen+~N4NHy)vMaTGybxFMxRV>8DjcRPwUQEj;y zdm5qc=O3^-?olPue(HHeu7keKbMa)uqju7}2!1qr6NNibD2hBaVQ)BJQ!#NEwJDH3 zM%{|nx6TiiIx{YmbEq{shsV4blsg!IiE5MF#c3|} z15Q@~1>J3w%~YEv8=vPV8>Y&QdgC!p*D4UM5wPH#f;f<(5Q;n0Ny4HB3paRqs5KN9 zU>+m_DR+wNdJ}OoV}v+MH=HP^_97Q%KdKya4M&^ca5?hOPm5efC1M`h*|l<~Bwc}7 zgEJ#5Hyub(B&_S>2dkHtEMpic;oQna?O;4Q8{>$;+)U1Z!bvID8xPc8!r7haF{dl( zr;pH2Tf7^ip*M0dCE_DJ+n0uNl!lMlO<6e(B$(BqN{j#ZW@dRRh}_CO3^vAtvvJTH zM=h|vvdE>MfQ*!*isBl{j*y9PBj(&I#O!l;HXe*GdgC|YiP35u=Odg(!hvKHF3COE z>E-1Cot6C6mQxFb1sFONT{faCLFetieHeHkF za<}C3#HHcNTEb{9a_x`qo7hjuq`Y#sF2-uM(NeTD5E{oxvAO6=+=O}K-;i#wxBy>KZPQn(~}+C98P=05h+CQE3tBN&VZINin4SMk!|xhEXT z4bf&gkOrbeQ8@}{FRvbu6bblk4DVxFR~wa+1_M-XW3X^%T52*-Ax@h~cr$1-BDG1m zfpB*+T#DFF3!bZ7n@q=3leLeQaJm8h8+;iz2VTU=>6R>e`Wof~X&_341cwn>7-Oy0 z^xKQRe?LivL#dq9dNiVC-8y}+oG(PpHAv7=@1vu((-0^3(R=x-ta8bb#ZS%2$jjH- zlp)l!jh3W0;1aiXmL9~EzFE1OfF6nwj{2Q*@`mX^$|`5+V=~L**yABkIU4(k8d3Wp zsj#&%7)0@{Z&r3f!xicf1n=D+CIDz~oKUnjRsN;DC_l9;$9}M6^HUx$nQReot|9qc zn5fYE#{tcD_Dvj#soV%a*#{$Bzn@~|IFO!ucZ$DJ!-G;cFOQYWN}-fnm%<%|tw+@S z#SdwY!Ai`^@n}fp4t&3j5iS?jRBDr-Zl6BzLXmGSaxFI*g=#aVpJvlTGic&upe9pk zE~KLT$9QA#70R#@A93M(A*f-viGIovPDbIubRc=lq5HvxXBq&HeSDGkU$t`4 zJrZH-;l@_H9mHBWqbB>iu;{NoO|;QHsdj*~#7pCq)C>5SCrc!>sl{OB*iSit%+V0_ zML#oH)b6Pz4&u1^JU$MKVjgWs?o_#DQf_Bwl!PDRkeiJxw5pAJ0F z{tKOsnv9i`4|nGjU2briUt)btP{ZI;*@GnY)89@7k{4%`7sH6IjQTxTGPLOfPUK6HjoV@)|$`n2Y`RM zf+zQQc_72c@Hij;_jr|+Yi`BSZ+`t~0NYFQ#TFDO_qg-8vr9&8W%O_>e)OwIO6!Nx=9_qH=g|m4xGR+t#qs?a z`DrS54{d()>oF<^>;%~eYBwqOB#YGkB(kb3tIcdkKji>2ACv#s-+i1;c7)2cc6PRY zgG+=~beEQRP#EF~(uNS;c zTvf4hf2GtWxmB>DjZ_<8sn`hsBZzX(fj^0$hg*-vzxvmm(J8vzY5eoAt;*43@>eI5 zMId@_c5u3rRun~DR?diUGD?&U2a>Ts5ER{T5Rh^Qi%<3P4!5>2jCRs6IzJK?<@l$C z8<<1Jub0N7cX~8Ok#h4|?cG#4^d5Xf;4Meqzo*K%BIw~8wHeB%OX zZZ0|-pZ>X6xyKz9;d@#+9Z0RsXj4x1Z^lnp7uP!IJ^pGM;Px8AvNUT-uSpNJkdKg#IetlpC@jXp_ugN}2uupB)+=SpOC@Li@A zG&V*koTzzYn{pje+h3&|L<2wtQY*Um{I0ezOy2EiH_a?>88gEFRixZJHA*A`e;f7U zV%&qdv(d6;4)h$19dd$+o4)P^7b7tjM}q-x#h!cCrEKhvh{>ExF(CelEf^UlUSn{xiH-$ASF@)n}VTkaMpH!qzh^Hs(*l1^Z- z4!XbJKTisj+gIZ$&)yvOf{}P<{QRSVj&PfD7(v?SdOea(cxP!=5EkL+(PqC)-NPmJ zaQ3-Ru_^iec``#eI1n62_}}rU$1<2bhOep~FK;f|96#?Cne3;+@#r;4x%l4b$2j+Y zEtmsXICi?;>ly~@bFaq{UX**%2m%=QE=FVYhBqT}Q@t{CyzTRB*@s)JeQ!Me_ur#F z!lqmwGJ#a9eP?IcsvJGk)k)QRO`k%b1$yZPdud(;$V~nE7Am)lTJP)pXW|$3;c3R^ z2k3N|8b2PB5Bv+yV%A7s)<}R_9b|-KK3z8Qsr@nW!yQqj_~X5ThHbu+S7lR!ej`bnNKf;FM;!D<>mJ zPe@KD=FY}ncJ0ARPRGLW!|kbPjW&NQl`|uJm6JCIQf&@jBa=lzG4?0%-AoQd8b&xr zyvbhb8g&o6m7Pset}FmzZUGiN9IqGI$fDdXOd`Dby4Ltq?nSzs9W7xvVng(Bg8#JX zDS>h$P2M6GNVVGg-i7oBQ@F>t>vNAd-r0<|Lll8=8;-FO z$I(h0dP4RO79;9^IMvq$DK{6X!&FVBlxh04__ z!oi^TU}$(=v2yi&Go6Zts8LOM$X;4PyBn=YpmMaI(k3W&O)3YrgL|%wdupuO0^9{D zh*ox5J}%N7;VgCZAn`JE6r* zUBa!z(G3W{%P!}3(VeYW<{(k5wJEmYrOvT20Ng7(Pbm`=8Ke4dc}py~$Md%7=n_)5uX+Mz zOpO*NaO*BEX+Tof;gV2AATO;pj9Dv>4PbY@f^sLd{))!f~Mf|5>^IWwVd4!&IJ0tPYECDdhkNfNw_~S69vxGpv7codFIu=za>R zU`AKHUwRsmN9NZrN5L1YoRia9LH8l5CsN=Pw&UATrkwYURe{Eaa&$EV5+;D<499@-kRB=YI^C1=~k}697mi_nwC>; zuBvjJn(Nnr>zyjNq-lDD+hm*jvKo z?i6XoTG-aegxiG!Y3f#Por($y=-G;j`z|Ous=v|A(IQRdfLabG9a+b!J9l_1!i-gN zKqqFBIjtnKTe(2;vYSCy-^kH7lykBA8P)H`7bZF7=HG?=Jr!1V+-Q=5ugkFGae{*I ztnZ0(oYr$9V1lFea{)^j4(uo@#(4`E)jtDY_$n3Q?~-Ttzwmij{BJy)o&-x2HgPXc}YU~ z{%4(i98dQ3K$n9Ou=VqZfxXU#7QqN{)&)2wED4o)+1tzk<&-1}wx+YNJW@oPdJeYjaKktc>)aSf% zMESJ190&L_z;lr+z`2isT~Exsf}ydFaloiHQVmcxNa$Ciphh{^Is3`;q}j70jwP^Rh+mejs}vBX6&;yIdp40ms&M;VsxcAjqBPc?$&L+YvV5 z@)g;4l~vviS7S<7u6rA}ZDQrNzmSso9i5Fa4?9c$Fv?W&w@GblAJatxb~%%qrG#VU zK%&}`VEvF-Z885c*iA?F(OnrP6MIv}Dcyxv^#wY@70A*q8pL7U}>jt%&7Y}IR*kA2!Q(FA@ zKbx*zgxM1=AaydF?osDugcrJ8H|4;qYFy-U-7Kg>>TsMYcRH33tOy(^X5y#eZqEJ3 zPxjur(Y};&z-<}%t8fx-@yQ|pb59BOR93G2zC95K$Au@#cWc^V_rM+#LtTx-BA5G* zvB}vyPn8=4c2*k~d=d^DXrF$(Vga?fz~o7&g##D7_>iVsRkFR^hjxe-bHMCS3*MDa zl-L7)Fz@4HpD5kHo`%UFy@P>W&W_DWQEkb?@kluxICe8UPr1@hTy$hkJ*-^v3{W|r zg|kS&#s7)gGql=C)5T>|RT4b_86fE?*Xi3cO zND@YdE9@*Q=kx=8KK_tgVCGc<8N#hB{z(uJr}YkjO+nb~@=X)wHr5ShRer9w0ok#v6_bdzbWG)(BoGLziKX6Ck4@SJjAbolG^7WQ{y6n}!^Dx7c> zmSeR0IJ9KsvkT5NJXEbcFRct`vv;b&io|LwY64#+$*_hiXQbS4Tn)!s(F5?&y=zT!-5xwrQXO;YY(;Z%7x?J6szqdZ%62F-pe%4GYFL* zFhtgNivVAC@uWCYbK{hqj5)269U4Z$aTy1eegd@X5T%gtJmyqbaIzfVMR$cXtoXt< zjHXy^1Cj4#rX^3Nd7c_8%_L?A(mkf;U=M_q{!N5ivu$GK#M`8hPI}bdM^Wf1DtwEH zx@Cn!g4wQt!X*KNrlfKRFdPgftTykC3lON4vtp%lsP+KG^VPAb4{OQiDuP&V*IX~g z7m^{?yI@YMtq0Wg7?IQ=Dc9rN=v3}yN8WM}2_qyx6H4*VBoKxQ?}oCC&NKzXR{JdnTvcd&J;%9dm=W%2n_2xCgpUS} zF=z8w0mlgah|)-)fHyKQhZV);`C#&48soDoNP++{DhN8r7GFa&oVJWNzm|S%i+|QQcbB3z0ju?1soI12{+|`;!^dzun3ahHoIvMldK;E;we7n=oMy(%eW@1!gre-Rb)wM)FFD;`gHSvVhP4GlsjlMikW%62h&(-QQ!v#n4I|jqY0S2plvc?gpA-ty9*48 zkZV6jDjHb0$|JO*+~_P|>HQF+Q)cxS)8v@58MWG*L|!AjnF8Y_8RY<)L`Mb~k_K8h zr5t0WMZx_lym_sm9Zb&3sfH6sKW>|r6oPj^=*J+B?d@_rn95O1kaCU!#v!2(d4{KSv>^0R+SS=F#Bf2D)5Mx$gskU2iHBbNX6vi>pAX%*aTgYjp zPRo7n7#>i!NiHXIqwAjBS2`qAG8xg`KE)&_-zVsyRt_5DttgI05Jl0$B799#5Filc zNT5C0O)`y@4pySjeapd+De%Sg@7e@L_+Kbw6~<8`c>jn@+^-mT>^OG}`m47N}? z*WJ29vQZ&%fdWPVP^=u0oFvGpoe**i-E(XF8u^9Z-6F6~ooL6Bp6=gIQOw~{4l5lx zcH;n(^HZt=!U+2~m%=z|<=!9@_kFBjfusq$f!VY?eJ-M^BJ8Dqc$^Q33(KqVlwbJE z^#g!9NL(ZhvHX!8IRM}${7S}1CKly1zfh#JOUhks?w(z_x~RYBqi{ZR zrKhmcU&TK^a&^xHg-`kZgJLi_C*s}RMLG?o%EdcB`5}U2nI`O*i$YxHMi~-uGw?iN z+~!iy+z)KYgqc4~YNK&MeU?zLHam=vbeke_hm4h$Js?;=@L(|c*a0SI@?(cFj!D$p zLMCoB0;UO@$_-_|$#Z=^mdo3qMrQmx|9KhpOr~;aNEG+>l7W>4ax^d}1_X0j84;|_ z3L})tF;|+g(t(uQ4JLo6dQ<5K8-wSnp|zGU92o@fNh@q^{%1ousg#DaYt*;|WM)HD&vjJb?mY z9G@GFdMzN7H+Aaj>JMluR{!Cft>{<3QPk(b`+T6ZS1>fztbWTS40TgDVn51gU5@VV z&s1)Am6g+2>4oLZfElH%+`&zGV$0mwpds)m9CFiRi*g-*LVX6D3jh>?7kj5MgJcc7 z{egOSmR7KUT2w+GAL*>?zMEk)OgUPMj^hKY*-wG$(z~nVS@M8Unq;mX_7;g{l zCMm~6YJ5{IoBI%2r{{)pg#}E9giI#kMrqVZUGbclHf7<|@4*4o$v|VJ>3v(z$UPvM z=_yLz%0e!8_{aDszxwqQ-`_^rq|xuEXoxx?c*mmVA%pjBAx*fxMrV)3-TvYP``kmW zGA=K|5y%JYYM!wgKhhyVXFR-S<<2F@cq`i ziFx&FldT#v9=4m0RwMj_##ZG@XISU-B=3)Q<1NH-BKo(oa?9lf= zMZ&E;o8Sr=Ip4cQs}qQ@W_Yoo9KCX+GNv1u-WK-TvdxN{cql5Z9DUe>V7ys9$pmr9 zSZVTuF4p713mae!jbNJoP0a;FIFuhaIXlb_{R7o6$%@|FWdrlR5RIHCc5x4CR8;~Q z5{7cz0+N83O%Abdjt1w7X+;3232wjpcEcmOxJ z8kZUXP5J`Zsx4SMKD!)arM+l#q~Nj^H&AzrNPvEi@Y)zb(b;}csTNS*nbK=wO&P%)-al}cYf5z%BN)O_O=%%?R*|n~-jG3O0TA-V0!^_py30ws zEKDhC#Y8XW(r7=SjmUP6^QT8!CF!~XbJmokbT+78L|@g*%A^U8z)?1TKhGkK8{Yum(9X( zNn9Zi4;i?bloLbjr=U0Z6bzq&)GG{7b2d-xuyY%*^YRxWzTaerL*_%)?Yu zC|J83tQ7!dPKp*N^QjSf{+h)=`Q}kn*leZ!mXQJwe zI}>B=C@NrJ$(J#RID)R1V+sI^>~gLIscsGQjYx^qvJL6og33;ad?wi%JTEM&fv za6uBox2v4HlYvSZL~@g=FOXYx$aYyJFJ@^RE6}LsSJ(d%%2g7MI4$5r*SRw>pF6

@r)_VP8Gb^t(^NRh4Ld{CMB>|*REW7%+wvj#fs5SsR!I~Dp&q0 z1vh_9XsVuYi$Iy7x^m?)Q{F*-(@@w*2QoEIz{quHYII+v;0_FQ*aq6NaGd5WnZco4 zb>W!8d^0kHvmh)fH6rpS7LKA){wjr<6DUl{7@2=i1~J{B1#**r4a#LH9p_)?m$los z6Zi-wW5fHpuTn6F3kWu3=ASFg1>H0%wy#OK-W0zGmCJs*SO=owIZ~qq?eD%yq5Nnt zhL3_H%P!pO7iujR$hdH*)@oUJnY^lPlPB1Brbe@ zyx9G=eJ;pwQ!^w+O&b#~0^iLe7K)W~U!`Ch=L#- zF7S*wat18ib(KPS<+LrAvGWOT!pEqvmOaLkMtxB&SlyVZFZ>Sc2A3f4@yo6!%&>G^ zrQlZ1v{lf|Na)EhEM~7zD$T7Hheh>ZolK;x?htjRBP>grt$j+w929NK5kzrU0 z*HsEHQMA1RuDue@ZX2Y^=_0oGmOUs6K`x#7l4?e_Qkns4%k_$K8r<}cCN zR+VJ%_EUh{&Z`t~^;+jXI!&tElihwFtXWmXMORUum2OY=pwtQ(7f#89!=n6fQaS)Y z@l68ao3wU7o6wbn!YY4Nh#j>b~IRey&<*rib1GK_SZLPC`VapJ)bnkB&q;czy zeP5=y@V&Ry#Fcd8ATnS{Dc{77{!X$4K3dC#E-Hi@b6=%E-bUPnMDO17W{8m5D&?L? zPC8DhZReOqXwvYBOg?co0H_1N!U`jMt8^sHFe-p0MK%l%r$#B<1ez5`QJJe00O;Nv z_f-mHyPk!+25+HgIN^`NxJsdW?z&2Wb<5+ax-ZDK9bAMDmXTp?v0c}ob;gBju&c*WQDqQo!k}~* zup|q@k_mjnBZg){t;$sjCetdJ#(-r=%$i}n6M-m7-kchUSiGGaUaZTYh@p zX`?6L&fVvb0lQXkIx~#;8Ew)Wv4SN915pNHnJk?d(5#AADX{G^{xb=@Q=&sAcNag} z=+>0f6;!ifrWlq)e3P%3Z{pyX9~jWAYF8<+a@zJdXPaSIy9i6H+?a9U)s!8DKH*pa79+}Xr3Rfxc5Yo0SnGQ4$D<_{6nZ~4?aA7Hr80;#g zt~4kVG-e7nmMq?Hr^p{khB>(rGvCBWjmP=a$k41{uz)YWDqN*t+5#yzJX~uZD*~@B z5N8u~@f}CMkO8|^SMK{Dk;>={?;&PNqeiJGQ6xqHMa2t?IOYd8RrF|R*1c(HmbZ)> zsc@A-ZqO>FEf9fam`K%oT>p__9ff)2G9@KR!LDZ`33jcZ9COl|Yc&Xh_xv{E#uO~6 zhe04ojLQ*&Ycd2rzyNQqrK$1!Sf$1{8E96Os}#)9L?D{vh_p#MQk@yr+mc~zLN+Cv zYFar4yKXRFyMlVOC&2yqDR3Tnf{MiWjiQZZluJ40O-_wNl^Xvfp;=s1DqN*tj{Bk` zQF45lK!gq zZ!_|bbN5=xrn;Z#-0-7MN$O9f)C6|@7L}uQ{ZevMF9=*Sckj)zg)-F?wI(SCiz!QZ z;|z<6gk~+Bs^+QkRSG7Upo6BVZPc4MInAh*TzD(dDG4&z^ zOH@2zCnWZsFxa*FVALq#O(Zf4m21RfBp3b*uPHB{uTmq0-fz)M z&k$jW93GGTw8~Wqrq5}faH^cVN?;6|VWddR|7JW|(e#0`>blM+5lwXhpnSBNawez^ zG~R@KE<*YW2_t5tM(sd=UfO#th{MB0rTSG0%wg_4eyn-I%|!8p&!}^H9o<7qO+z)S z9_GeLR>htqLb_thL+>`Gs;nGiJW#mhO-Y8?wM_9Yr$!tE*gUCuaWv>L4Xwge3MSWH zkwdTpN>b|J6F9*!6aeriTqUpb1@c6i{|sS&g0IcU+6Un!iNTr43u0Y;c}?a zIz%A?_!OqinHoh3Vw~IZMyFg9OWUCI3wI3kM)TVrS7{ z(?H2p6fTEM0Eht?GG!0FbUSl*0O7uy_kPSprTSG0Y;1tte}FX!Fjz5Ky9`UT1O=J) zZjo~L#)E*n`^w|(&rG)22DCoFX~AApvH_0q?cun$%0;EZRSNF0COfC)kM9jm$+BR^ zzsdxKLgFIxdep6ilCz^m8JPuQmA7I^T6==y8xgfTp;1&SUZr3k)Hxv;&Kor?mh;(u zL7>*yFhm#o6cwy=MW@3gQb4ez2(be0^4L^>8w7RbqEhWD1^4h4JR0CzEaw#xSMX#| z^EPp!DkwQKjfhKPYou=3`~BDAuqEdCDOb8m!9Bhs$#BtvShcuZ=P^Iq350KDlP?#z zp5YKqw+YkpH!w4Xwdn}1a+QL6+_^yjUa(Ht@h5C5hVUUuj-#R?A+SPf%sOg7nGu!a zKBnqb3T~Qk46T|4{_PuVDu4*$Z6@NDnW6$S$vOZaPeKzEBSx%NxJtn_0P8<0R~W2C zl^ky1JmqKN6gD%7D6_p~2sK;xC~bR3P^`W~@kq7%GTQSv*XTq@b=> z6&%lvguA*&5Vt7}tU&I&9_4yje$B$)3gqax z&k)FiU`CY#apr>b+L3U|>RH-&}ZaBv>tCfuN|KQl&yJhe)U+LfEc z+nuX^EgV^a?0A-4RSQ-|(R}^C_uX?aZfZ!%ZQq`|l5o6up2CPXkc7!AQIN+HnCdfy3VB-L~UtJ7>1(YR(dFquhqpeHlO7&}(1oWtqR;~drd zJVThgOh*=E$bG+CsNJrAyCgoucbg!d&_X}5FlAyH<411Xl<9IaMQC)ndP{7vLpcYz z@2x6WG&jU2N#ZOxs+fMndaH&m*)EK6;dVK@Tk|Bp)7aumC>Q*8dQ+&J(J)k0u0fb3 zBU&TzF5YKV^9f2M*>HV38HH&)F6Cys44vz> z+uOASQXt>jH@oso#iO%t79o=e_o0L)Va<{*j#F66!?8;_625;`R1n5o4u1qUCH_d# zk5-UKv{PsptTTlrcp_uF570iMrPV==K7bu1Hhc#8L&2&UtT`gw-+h9}Lw0ZeLS6}S z-`^qguEGF^O*nQ=0q zAMHrtOhj3>tiD1&z4^N-<g8MiLbJ>&Ggj`kT;RC1vpkk6aS^qXsL0SWYeq@DI$Yigq z5S>Mo(hzk6amgDwd=@TGgnOl{HwEc|$_GT>i%CJ-Jx#})O*GmIZh+(^-a+F#-U?Je z7&d0$k0$h^maz2n2B=Fa*Hf%57Ow1#9E33kORCa+<`YSTL*+KTIms;+7TqXz3dns_ z_QKD-%>^>H@Dd%viIXwtM`f&%u-zM<_Ux2WK8PAOa?ESt%<9N}CIBETvKO>9w$RF- zW8{rN?h7=zFD6FSH7NHgLq7tuE}Da(V-m$DE_WjbHMV_Gcz9x#o`OY6-ZRyF7S6%0 zo1*?nIwfY4i0a;TD0h&dAAuXqr1@?H9UET|0E(n@v{`&80RM?axWvNJqs>F@%H%#Y zt|S~|9ggz_B11nCC6x<;9+8%awG}Nv`FkavDR92oYny;l-aHFu!Xm9tmW&yfSW&ql zq^zLHpmuheesq#gBbEW^4H83hfmpN?QC7Jx=m?~Jz?*i=VG(ANv4z6s(e|8samBKg!ULMBe8BfD~r0ATxr{*jbx44ALi3IQde>i{sEr zgd;~HsOd;~89g=KG$lKZMT9V3iLxkE-6g~>GiD94TZ{tF?MJ^-K;$uOSq zV4@r&svJ$EFNH(fTBbqkj!R$*BTFDzmAlYoFJN+Cg;8Itx0?aIGC6>RI&TT_Ihdv& zJ=lpvo}!`oBTNgD$_;dK9K;_DgdIDtKk&eFsH_bNo*ok&*-{=kA&hwQ1DIX*5~FDv z84W|F0i**dA#oE!sX;r;(vR}ZdcC;@S~>MXU0MB>ni67XeZ|B`3t>CxYV7w_(##5UYR^O?hZ$_4C6%V^x&v$31Wqi7^RS73&a+AzuMlS` z-wlxexP{5F1q*kJSZaJ9kOQ91M7ZF+-98fGp0<-?nW{D^A1G|$QV^r;u5D$?-m)}C z)psZ+hTocU=|_)DKl;uNgLsNLORF7Uv3Q^j0EEWf8J~E|9$Pu@GFcj1;OPxfTMRm= z+@hai3y&fKK5J}YKvTGsNk7l=Bcm6O0{g)JO(9m>t;llQ|v##_IkvbW8& z#7cv~Km9EIXb!9Y-E%unuA|X-AheY{P(weQ1HFa|Kdlopr6;7UhEx0DN?M z?o#d-2$P%UC1OZy?VxekV#s1;pX)HMBeEjHa{08$ui{P9EX~dLWu0A2s zj!+>%$z;UIyLwOJGfaf(N8YB!O$j$=iN@<*fbc8~*5^dqOb*=F`sCp08v~JD*94Wh ztD+SXfdn2ROjjjf;baRk-KNo##sT9gE06jsW24&2 z$75n`?K8;8dWI)>`Xh#?=WgWiJ2-_#WdbTk@z#^T=ec*(?%m31Mhk}o5V=p;ejCcY zErrW}`zVsynmEhX^~SHX{d5XHuK~$`?RwJprK$ z7b@{S?VjvsSH0|qkv$@N3MBU~8<52+(t*gsRH886ju^yK!ciN4=rvy>1xiu6OyxAy z9fkpsByQX30U{YDL`P2H=?}7pf;yuzH5I0wV*6I!ETeLc0^#S92@w8KG_V1}WP*xt7rY2#GgkDXe+c9Aiqua6TKX%)?Kq?sVgWJc(}1 zf~VI3-p!8n}>{>XM9Yccnlq#8AqjJf?`4z6Oh1|UP+ zR6xjg+(1-!BG1b+QLias$8*>{Uj`G6esjmE91Sy>5TEk9*Xwc(xO#}s+p3Dd@+hFQ zOX-`!6?zhOEHTlgm7@#6BW{;2F`yO2oJ`6MV~%SJad3dqK(Wd7`%u{^5LbFo7O*|% z5y25?`~55Q5WvZ#%y{5!|D}|J(l74!P`N{e?8RU$jfqBo3uBPm7gu_+oJ`y!VAj-i z4-ih>YV+#d4;@7Ts8OI`Esco=zz!z*p#1htK&4+&^G09+>$t|9>yQ?8>pcF<*KBeP zPmjGzVWMFPs9m~3A`S*3pG+Lz$yHA0UFz}ttwZgqFYbSNAau`$ToTY=v($-h!?sAz_ z7GqW}vA|{eR!9AvksPZF=db33Yar|x%3-2|tCf4^ry^}ZT$*8cPRP-1g3Gvx z6W!wsGO_|K))?P4*yMq1PFKqacYIauZlL(7&8{P1SwSBJ)+wP}BZrLiL zG(VIOPSInp=5ovtD_dCe${jhC(~inew1r_<0TJkAlfxxZnT=rm&SjHak`_rLgrEih zmR>H4Bsy{_YMP8SS$ z_b%n^X`7UTuRkCOItt;lD@VT&SHWgq{BNI-&}byTq4_RoqLDQ>lG?)}*d`RV`;8P7 zG*?}z8Rh=irkopj2s(tcxAj4dydMOI8Fqp%nJ_#EXe5O*^9d^#D|{adz>Zp6!4#rO zeCt_mY%TY0t_Y`X9YP(&pa3z+ScQPIS3y9C6dR@s%&;&CP>a4EsG1cg7szO`G))yp z*Fa@*YyB?J5bj_lTM9j23MZ`O*~U5p&is@K*WXi^u0H)k&jB$Twi!#!R{bXg=0Wk% z%_Zv%tS4kg(^Q?U&E=k!_E_@nh&Sef@#s|l1z*lts2t<-&lzw=bhB2ddMfqLoG1(1 zr1E3Hj4bFZl-$xZRqs~11}ZZ|XM2+R!|s#Jn(PIS91d;zd71x8m>o%yB8iBq(~e}e zcf&Sc5p45ihh|CfQ5@fW5bol~MFRPzl!Ku!Bwz~Jp&nLqmO!@zkgt@>a; z68(M9%>d5G+kPiuQxeN_8+lW=XW=lq-Sfa-& z5lC+Qr>{qJHBAfvr$p3A5vP5qKxC{na*)wfH&KEw{?{z}OR{?kz_?=*b27{zi5PH3 zRGyK>bQS8ho}rEb06LInXL&f70Ocxv)HJDp>Qf~Wl_;RRd)og?U&d)4+)R6J6<%T5 zR&r+?A)B!RLI>oeJ2o&~1-fNmn+!n;f;O_V?tDz>tk8L}1gCI+k3Zk4LZ0QmRQgRv z=Xg#aTpz6kFX+nTGaW)i65Fx=UV{-SnrEajT~O$6xIhEt!}usWPmW*8FfB+oO`_UW zGfeK&m^yYi!AC_< zviPMboQi2><+$9-qQwy>O4%MyAp>qwl|1aN9eR;R5H%1+EwRCz&LmKdFkNPDG#Q4+ zd3F{Xlxmv#rc+cvL?@}=^l#{hD=+$S+FwZ6!f8Oj+8y>d7pChl2nf>^5L;#m9MrL4 zo;o&W;oMCVm%i#FAmP|=0BiS@a^8w}+iiQ!Rg#obxjqzSl?z5aiA~60x?EV5qhP|$ zY6-h=LBg_Gnx-rEBSFTS1KF2Sca?ZFR_wq>It^fkHP7EG6m*LG{Ua+~yC0lVjN%DIrmj2x3aLXQd2 zE?lGu54}LAiVY&1AaFA%!P;?_I!1m<5zg!^30V04yZDl9B8SOZj!0B2cDS3JRVeNY73qztJ;oUB6Wr|5TsV&wvL+_g7N z;@ej)x}}x7pmHxRK`2E}Sdy0GwHeCQg#w)UPgyy}bbS^7{79I*Hqg|ub~02UuIlmD zKq4cVoy8dr$F%P-iTa_~jr7~qn$tS#8+v4V> zaw*^pm19ho1s%{_Yx;12Rv7}+8}w6VXSqxNEi8MZv}tNxRXOVD4an$FF%KE|DD1Ky zkaAq{q;d~s2&r5@dJso8<+6aYRy6+84}U!x%pmK4sQdn+BtWrpZ=|0RJ4-6(F8v1- z4|W2$d+_gwRY#u%?=Dfm$)dHz<=#;4h3plY!F^OtSyT4e)XEXKZ;ZKq2H=d9gVv75 z^0e+UIKhI9)C|LD;SsU3B1tTJpK)@I(tm5ZX}WTS0O}8D^W4!7b*j>Y=-8^9{`EE~ zhr|F$i##TO^)z+$O9Y8Mk7p^jyUNNbCeg{l@@62Fvm+x3yrmsACa%L6BOC%|XYp$S zSJPBMIoZ*#-8|48J(K%-s<|S+`57uFEJ$d{i`Ic2;m|!Y2JSLCXRk1 z@pH-(4lK&$m_!>R6pk=mb}G;OV_#9n6g>*C6h)ZnTExz>Dwhq~M7Nugil$yIR2oeH z|Gvg0s5qe1yYsV+0s76^3Lk}vx3jBqz0TXx5h#RU>7mM4cI6mE@Pi(nluzcy-)x?; z2sRSmdLmhyO@)(tXFOm6l=%uZ!M~ZNNuuh}?W%$gvt~S z;GvR1+8)Y;MIfP)tkYe>vU3@6LWb`1uxnhNuHZ1LE>uwI_g+_4>`1-6sKbx$j9B(Fj7I>ge=2pW$@}Z3$7s?BTsLzOYi% ze2H^<3R%EeZ(-T<6qCr}r#WQgYXWcK`STPRNXA40wN=QQ|21uzWUETbMY?HPi7P5c zoXyYVss}8eEQp&XYB$F}L7FZ#O+T-|?B#U5O1K1ao1{rF zBH}%M<1u&F4$zmv0n{1^Ng-qiNkH6PD}fCr!twCp7Gb&;rOVk#d>~jDq1joAR%t=r zKn}6J6=M$nlpz1jE`ydTC`Xe^(1bvyB6SD?Yu4bjJ6pMZJ^FGZI)sAPG{M>E^nCwc zEVh85nr9NxWqz#>=55M-m#Jf{Ont$_Av?og*Z?K-m>wB-Ozq}BQ4VLwe|6<{HJl14 z;3V&H-~c`pCD3b%j=q@{6XqBIK3q{F!NE(@c9BH<(f{KM-2Y%@z|byr+9b(h7XSP*JX zFsF)eLq7Mbg_=CFwHA#t^))DXg;5umVpTl56y+mOCKTZ|6Zfly)v_*ky8?vo+IXuB zZ6UJE_U$_&i<5?#V9vzmr%zo@)7@(=rCW)pNOX%Cpkn>gfsAP z+q>h$u9=736Hy)vM=~@5rg^$%3KUB%=ni9HGpT08-otd5B=i*y;_W_wqB8ZZD1#wK zxMiN|uNKyo4EUe2GBna8On+P^{D8Dk$$1({hVntb*j=Tci0=W^wFPoSER;l!@UqIy zxx;go3`NQnkTkmXB+MdIG2%&>tK<93TwohJ${=p52+vQ$`^nvMC9Z}cNo30ebHb^d zHsK_E$0>qoblYL1Ct>BjP|O8`RUs_&432O^xWa%~PZU5+l*jjX6MjSzQe_~=`i0)Z zq*`|>F^v{n*vCeYQO?)oFvCd9;`rp?a~R~3XH}T7h6_ zHj^Qz5@$eg&10iH6i(QnUZfid*Afng&~BieTf*nUnm_NWaUY~`7J^!W0JU5SCMpe8 zaj@bE*cZ;f7KU(E>MW-ccR&Qz%*_)OK)qfuRp%{8BH=u)8F)!dkDX}{Sl=eX@EK%_ z*L-Kv{S?jH%i_H<*De7l;q2uL3OJTz1QvV`8y!tY5l@tddUb>D%RN~c+UP$n<$`=} z#IZj;EFiG1nd*shrVM}`!CuABw-tiKmxD}6ID7fxB&_j$Bm%>q${6{QQTjChT!Vxu zA54cymAh?gOj$YRB&KwwJ(R!>0%K|)rFtEw0GcfH3o8Rl+a(g0G&N(@`p2AL5LvxlGXg`h;=v>Iv$0GiFxBTrsPHb0Y(w7~@Gp)M0jvbE;Rm zG01ZEj!*(pj&(x~z=bcA9Lo<;f+rKB!hk3+A``}CiXy0&4A|ZNO`@hBMv#1tXet5{ z?bxt=(u_Dhv<@?upvbYzWD-%hsToH7{6vim z)N2ieL*;rw`@!<&9Z9AF8_IzBPr4WzE7o_1Q9fqKQi& zT&~T@WKWsA1yX^!8&JwdGVwqGeUDHbCgo#-rm{i_)-@J|BAm!s&)SCdv}oJlQ3seG;wze6C=fYoYO|kB1#Gyc_u!ml7}57+i3{h(7xp2A@ICr63R@A_GfB>f=ZVVU(1u_~ zQxVD_$w3yFsX{aw4A)RNQ#}>--nk>HeMAV9h?59P;tK<*+$<&-GUy!h*p*}Y z+~{n?tcr3p*rRD0&FobFiVke5d8V@pr+W8}hRlT<2k1c%eP9-T17E0cj0(bM3D=;T z3{xYXXEaKUB4P4T6ks$@`8Xpq6_{wMU}%f*r85_ehI<8K&%t?`>PPlePY%R8(xpG; z!Vysqz-VTN$@FHl$r(fVSZp51oiMsunuk20XBZJ5*=T;-Q3k z9RzCz<%293P31-zke`k;Ld~vRws;MLAke2gTdGI33JVw$^$dKW8^ULY)Z6C~c|Hmd zTgjk&{FW?Yg{BG!O=T*V2O!BbH=0eOsZI9^s^i|!DYzJ+hC3QscSHq@W#BCAhVYr8 z%2w`qn2!P)hXzdfU^LbCt>+TkXQB)+zF9a@j{Vf8T#zeX6hmpMZxxh?hGj=77tVyk z1eV_Z2u4<(49jiKV;b>T6Lpy8_D!H(TU!C6sj|881)x}xX*xybl#_g_{IpoPAd^ct zk#MRnhjAnxBO^}AF^rIka>gdkX|&OpjZEe066*CHQ9f2R;^b)a9s!niPTyB(syr&P zDQU1l&`xtUIqK&O&e~}P63l5bd())I;b5eCw=WE3=O_^;U*=?JShFxg_zILOo+de< zv|Th0&!@S4t10Cp+QDCl6GDy9R6p0;0H(p#IXA8$nNtBKKiBvtDk`G~E0M4hHkIJ^ z6wJz5b|gb6CF;2uMng?SIb#!d(IX>s9@Fg>GxWJ$glMX0gvyz$in=7v0kNa*50k|S znREFOsvRpDO#yPOLG{N(HxFznm~}8^koD`2BZW9Ap#zuuN28(J1`HSh$bye!DqHq&%R*Fa8FkL4T(4j z2HqV*1Sa@pA$(-AwS7A9yh7#j;G@mVJTvHX6R6iiY!bGj@kta$3|Pve3<7x1hsBAX z9;)BtOBxMDcqB>`$ropw>MyArAwaQ!-8y}+6I$?vjGfIw_(l&t4n-j?@>u@O%=0Fl zhk7$}ysM#JTDc9Rd^{SzCN!0uxUg1R>^#N@S2jrx_p%d>kz@b^j&QDCWmCOnM~VEa ziqYp0)vx$eR{n2R^2#aHu>$s@je@5#gpYYLS-Is=3ec39hY_i5%ws^kIt2BSa2SxM zH6jNvV96XJjc{3z4+rR{pN@$}Gms33Blo-KVRERm52s)gJIXtv4w8_1KZ-vcwkl&t#s8nzBP(Yon257%2$fNb_Xagylvf&<6ry)shj`$tW|A73#GoDIawtF5o)? zKs42$$E*r#gv)|_xG|;yM5AFpW#wk2`VCI?hH@`}8lbd{t73#%_$R-K#p&L;G<)sC-G28XZFO~>S>BW9{NQ~l?YRKJBO*fUaa_l3|nd@AE9>=?6fw1sc0 zThJ=T&O)tDz+TzgPau5J){blzmZV8&z%`nn+l92~Q7R!LoCgNV$f}$YPCFfOE9KvQ#dvPN>|HmcQBXI*(>!*HNfFOMo=VG3r1Scd_azip0sL^$!z#`elj-k>{F7D14S zJ#*9GdFTnrI@z;!7=-;cey{7@@n}e=0t>G#1LmyPP`SBi6B(NY42Z5Qk~bOKC*gC4 z601kq#{ndKmy}DnItNX~=xTgAKGVuMJ5)?1l!Y5T7Q1j{=eeLdS&Ji`e@vq~BY7B* z5=YoBTG3SGr-~glv6@@B`;CWS#St+e^0RamC7P7OA_=;95mt{?Yrvv2}HOt6takX#hZYP0-W2km5chE}&UN#(h{!vF*7Rlh+9 zHTaNm4kmog&ob*);_b-$7-=-C1%BGVBH1M1A!GYg!cy61Ssn81%5@a%n94Yap5$~; z=~tAhnb=wEP)S)?zsQ6$Rw0W}^4<1j(Ib*dPsm_B=XsnItU5ppEoRTzXl-l(Ek&bQ z+%Mv0394K*2-dK8rO;aPoil`4d1v3;&2&H3c2iX&Avqnmr3>Wgox8EKX%?0yzh{o6 zjo(9#3KJg4%Ex1*+g^r-1t6(?yTU?1GT2dd*g~vw0cb1gFrr7RY*do-QJd$mGj-Sp$V<}- zL$u+tVGK~%KApG;S$skm%aKZ04&|oSA~Y3_)39lh2g>|`O#X&VEXrkAI+EasHr!#9 zlt;1M6F9fYk{3~%l zmtY<{27r94{*C}a?zHg|+ABM5;$a11Se=1~0%GIW`Yy&U!JwmyDzxkGC_$!`zl2(o zkkWm!AErzieU1^9m{_)NhH! zSo&1M?Z(tz`;Pz#m1ZYll} zUJ>FOE}f25gvOneHkLt5TXgeMC$Iy^fJNL=#3gajlU!rKXD)rcn480eq9^xa^X7$1 zaH^hk==M3vz&Sx~ZnzFvT}UypY~QBM>n)_}X*ZmBn_*f25*0msNzv=Z&(6$gOW~HZHDRi z$P7-gNod1((_un92PuSDD$sKX9Go;*ot$~%$jLH^XDtkAwLq|1EPgC6t7k2~!tR~} zt-8gzk{H&)v3-^$z{%PFX97y%B$X_i{kk!Oo4m)#8AzqUGmtvBQ;SpGzeCS#S93QH z1B8OS(;+pm7WYHT&+V^3LD%@oN{pmpajFp_Y90y#)sU3kd43MRc_`>i(IiUoIGx}& zvqpudR3x6O!^v$wdMLVRlarETC(0~clv9Kj=Aem+ zu18yFQes3It&dn21)-qq!4VbnhRI1@lyNSK268e>R8(*ei4|qG4HTq)&JUJXlcKcfHOdt*|^M7X4#FJ`1tt$W`F;`%2}32S^xk50d!JM zQvg8b*k%9#2dha$K~#9!-J5}u+B^(|QGB@o0p9;{o5Xe^%hFo*U1$FOnQ7s=U3n8Y zF#6E#_Fp}w?HCdpT7QnO@2_veheT|&B{Rro`QHCbog&n>kXB6`qMiT}fp&)MxhR)OIRPYM&8}%2A%yLJhY)Xt3yIK}LTZv3WLcK*z5l)6 z#=)te)oKOArWdpD6A%amK4W)J*Y?oS{-tBJW&FFEU$x_BGBrPuBU8B z^&UlGYKyieLe70j9uICKhX}MXq^Jp_gwwRtuWY7hYa-<0erXHrfj#b%PXwAs8C*f` zpU+h=te+6bCqg4nDK(Jfsu;E(KI9V{8cQOIf*_~s@Gut=n?_3mN#5`1n!|SYEee`q zL(56(qIQz^>$z2&=Mav&?;?pUV(m;>7X?Y4_vdy7`$gREiX^7k&~nPUs2wF1JdS80 zp9nN1rRR5NeeaQD!R_vQC7%d2o>CS?QLcjTwe%nnXk|)S)Q)mrlj*Zr$S(qorBsUA zpLU4W;~=8?6OAcCV@|1QAj$U^9mkjU*~%0fT1=@GHQ)ax_Hk{Rrt*WADF&#WDV3r| zj^l-Jno_}O-%C*WA>$JFpUTZ%Y2+G9DT?Ap^t87F(0+K{4m1$|OrVhgYFR--A?*6$Me~cp3UU-|zSPncmAE$3O2m ziHpa6FqW&dLyXn37GGXPQ9B9c?L;=Md!bY^locn8U3{jZg;hW3+)tFIv>b6U zR?FqWt273nm1=9_#!ccaB#A_uK;=nXM&c_`HWCr-H&sy-C7YM#7+p#SZ5{Fj%UmVi_lSs~AbwOOwa*lBo-32)ZT<&m=aTU!4IR{+sf*Au` zrFKEi0hi;>F|I;>&Hk8y~qCokjpbs6afqr^=M6c>X{=AXFb+`_X@Z>NG%AZ-#v!UwnOwLc z`&45GRk;>ZOfFoZEp{3^s0#J~&T#|Ai*vZCN`RjI&7?pX^g$KjNgri2 zl%W|(Zb&CaRq%VUfGUaLh>EjGKwU^xM}+ZBZH8%Q3l-J{Q;2C;1#H^tw$Ld%5d2y__|@KF${EZn&7r@XSIqd4;RRF85?|D#JB_FxKnGQwCvVD&zNN zC}uRwF_ZV<>Fo6jdQf-t#r2wATloXq1LaL^S9CF72b9~Yi*yfuF?S9!04@>xINpG{iHDwUw_4-g(Nq@7Swfps! z{*Oxbj8L$yz24IApUPmYNk7cyxGMZbxqcuO(-|e3|$1)mo8Eqqp@Al_y zTj(6iXv}3ef?NXw#h5|bmc+4))l>7L4t$ir5hV>g6axd->_SK|CXQvSt7}3eQ3o-& zfJZ29eBj~ynm*-bdPX3|^=c!8r+b7VJ`?mLdBo-T>i#uM(5_ii2hRvabjtR19y2&D zv~j(B2!RbQc>4V$+t;~=l^!`>^5!1PC{E5lLeaR;EM-s4%SJ!%&nqP19~n{j1N^D? U6<`(rIRF3v07*qoM6N<$f?TKLMgRZ+ diff --git a/public/images/pokemon/exp/754.json b/public/images/pokemon/exp/754.json deleted file mode 100644 index 64490baa49f..00000000000 --- a/public/images/pokemon/exp/754.json +++ /dev/null @@ -1,1133 +0,0 @@ -{ - "textures": [ - { - "image": "754.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 93, - "h": 68 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 93, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 68, - "w": 93, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 85, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 85, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 85, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 85, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 181, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 181, - "y": 136, - "w": 48, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f79fcee4451cea6aad915f561b31bf78:95fdb55190edb6ce0d5847a4e46b4d5c:f7cb0e9bb3adbe899317e6e2e306035d$" - } -} diff --git a/public/images/pokemon/exp/754.png b/public/images/pokemon/exp/754.png deleted file mode 100644 index f6410e02a1137c8c8ec3cc4103ddd52c1cbacafa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3754 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 diff --git a/public/images/pokemon/exp/back/672.json b/public/images/pokemon/exp/back/672.json deleted file mode 100644 index f877b9abc2e..00000000000 --- a/public/images/pokemon/exp/back/672.json +++ /dev/null @@ -1,479 +0,0 @@ -{ "frames": [ - { - "filename": "0001.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0002.png", - "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0003.png", - "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0004.png", - "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0005.png", - "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0006.png", - "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0007.png", - "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0008.png", - "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0009.png", - "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0010.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0011.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0012.png", - "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0013.png", - "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0014.png", - "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0015.png", - "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0016.png", - "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0017.png", - "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0018.png", - "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0019.png", - "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0020.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0021.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0022.png", - "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0023.png", - "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0024.png", - "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0025.png", - "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0026.png", - "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0027.png", - "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0028.png", - "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0029.png", - "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0030.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0031.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0032.png", - "frame": { "x": 118, "y": 97, "w": 40, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0033.png", - "frame": { "x": 41, "y": 98, "w": 40, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0034.png", - "frame": { "x": 78, "y": 0, "w": 42, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 42, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0035.png", - "frame": { "x": 118, "y": 50, "w": 42, "h": 47 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 11, "w": 42, "h": 47 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0036.png", - "frame": { "x": 0, "y": 56, "w": 41, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 10, "w": 41, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0037.png", - "frame": { "x": 0, "y": 104, "w": 40, "h": 48 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 10, "w": 40, "h": 48 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0038.png", - "frame": { "x": 40, "y": 146, "w": 39, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 9, "w": 39, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0039.png", - "frame": { "x": 78, "y": 48, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0040.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0041.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0042.png", - "frame": { "x": 39, "y": 0, "w": 39, "h": 53 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 53 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0043.png", - "frame": { "x": 0, "y": 0, "w": 39, "h": 56 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 0, "w": 39, "h": 56 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0044.png", - "frame": { "x": 79, "y": 146, "w": 40, "h": 47 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 47 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0045.png", - "frame": { "x": 119, "y": 146, "w": 38, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 8, "w": 38, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0046.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0047.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0048.png", - "frame": { "x": 39, "y": 0, "w": 39, "h": 53 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 5, "w": 39, "h": 53 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0049.png", - "frame": { "x": 0, "y": 0, "w": 39, "h": 56 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 0, "w": 39, "h": 56 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0050.png", - "frame": { "x": 79, "y": 146, "w": 40, "h": 47 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 9, "w": 40, "h": 47 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0051.png", - "frame": { "x": 119, "y": 146, "w": 38, "h": 49 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 8, "w": 38, "h": 49 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - }, - { - "filename": "0052.png", - "frame": { "x": 120, "y": 0, "w": 40, "h": 50 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 8, "w": 40, "h": 50 }, - "sourceSize": { "w": 44, "h": 58 }, - "duration": 100 - } - ], - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.11-x64", - "image": "672.png", - "format": "I8", - "size": { "w": 160, "h": 195 }, - "scale": "1" - } -} diff --git a/public/images/pokemon/exp/back/672.png b/public/images/pokemon/exp/back/672.png deleted file mode 100644 index 2201da3b627868ded81f15570ebc12d6a7921c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3350 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 Hu0mjfP_*US diff --git a/public/images/pokemon/exp/back/693.json b/public/images/pokemon/exp/back/693.json deleted file mode 100644 index 6358a8908f6..00000000000 --- a/public/images/pokemon/exp/back/693.json +++ /dev/null @@ -1,902 +0,0 @@ -{ "frames": [ - { - "filename": "0001.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0002.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0003.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0004.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0005.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0006.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0007.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0008.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0009.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0010.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0011.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0012.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0013.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0014.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0015.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0016.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0017.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0018.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0019.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0020.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0021.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0022.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0023.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0024.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0025.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0026.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0027.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0028.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0029.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0030.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0031.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0032.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0033.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0034.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0035.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0036.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0037.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0038.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0039.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0040.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0041.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0042.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0043.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0044.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0045.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0046.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0047.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0048.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0049.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0050.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0051.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0052.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0053.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0054.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0055.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0056.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0057.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0058.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0059.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0060.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0061.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0062.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0063.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0064.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0065.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0066.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0067.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0068.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0069.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0070.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0071.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0072.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0073.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0074.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0075.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0076.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0077.png", - "frame": { "x": 565, "y": 196, "w": 90, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 6, "w": 90, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0078.png", - "frame": { "x": 278, "y": 266, "w": 90, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 90, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0079.png", - "frame": { "x": 189, "y": 199, "w": 95, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 8, "w": 95, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0080.png", - "frame": { "x": 193, "y": 1, "w": 98, "h": 68 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 3, "w": 98, "h": 68 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0081.png", - "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0082.png", - "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0083.png", - "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0084.png", - "frame": { "x": 1, "y": 136, "w": 94, "h": 63 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0085.png", - "frame": { "x": 95, "y": 72, "w": 96, "h": 63 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 12, "w": 96, "h": 63 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0086.png", - "frame": { "x": 381, "y": 1, "w": 97, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 97, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0087.png", - "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0088.png", - "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0089.png", - "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0090.png", - "frame": { "x": 191, "y": 136, "w": 94, "h": 63 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0091.png", - "frame": { "x": 95, "y": 135, "w": 96, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 96, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0092.png", - "frame": { "x": 572, "y": 67, "w": 99, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 99, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0093.png", - "frame": { "x": 284, "y": 205, "w": 95, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 11, "w": 95, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0094.png", - "frame": { "x": 1, "y": 199, "w": 91, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 12, "w": 91, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0095.png", - "frame": { "x": 1, "y": 259, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 12, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0096.png", - "frame": { "x": 193, "y": 69, "w": 95, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 5, "w": 95, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0097.png", - "frame": { "x": 285, "y": 141, "w": 92, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 8, "w": 92, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0098.png", - "frame": { "x": 96, "y": 318, "w": 89, "h": 58 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 22, "y": 14, "w": 89, "h": 58 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0099.png", - "frame": { "x": 564, "y": 261, "w": 92, "h": 58 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 19, "y": 14, "w": 92, "h": 58 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - } - ], - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.12-x64", - "image": "693.png", - "format": "I8", - "size": { "w": 672, "h": 377 }, - "scale": "1" - } -} diff --git a/public/images/pokemon/exp/back/693.png b/public/images/pokemon/exp/back/693.png deleted file mode 100644 index 1ff5db69b60d4ceee2ee140b113c2591b6d2292f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21703 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 diff --git a/public/images/pokemon/exp/back/753.json b/public/images/pokemon/exp/back/753.json deleted file mode 100644 index dbd9fd7d635..00000000000 --- a/public/images/pokemon/exp/back/753.json +++ /dev/null @@ -1,2582 +0,0 @@ -{ - "textures": [ - { - "image": "753.png", - "format": "RGBA8888", - "size": { - "w": 140, - "h": 140 - }, - "scale": 1, - "frames": [ - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0087.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0088.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0095.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0096.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 0, - "w": 31, - "h": 47 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0089.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0090.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0093.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0094.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 31, - "h": 47 - }, - "frame": { - "x": 0, - "y": 47, - "w": 31, - "h": 47 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 31, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 31, - "h": 46 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 31, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 31, - "h": 46 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 31, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 31, - "h": 46 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 31, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 31, - "h": 46 - } - }, - { - "filename": "0091.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 31, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 31, - "h": 46 - } - }, - { - "filename": "0092.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 7, - "w": 31, - "h": 46 - }, - "frame": { - "x": 0, - "y": 94, - "w": 31, - "h": 46 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0065.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0066.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0067.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0068.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0069.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0070.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0081.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0082.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0083.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0084.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0085.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0086.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0097.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0098.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0099.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0100.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0101.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0102.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0110.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0111.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0112.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0120.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0121.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0122.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0071.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0072.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0079.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0080.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 5, - "w": 30, - "h": 47 - }, - "frame": { - "x": 31, - "y": 47, - "w": 30, - "h": 47 - } - }, - { - "filename": "0109.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 30, - "h": 46 - }, - "frame": { - "x": 31, - "y": 94, - "w": 30, - "h": 46 - } - }, - { - "filename": "0119.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 7, - "w": 30, - "h": 46 - }, - "frame": { - "x": 31, - "y": 94, - "w": 30, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0073.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0074.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0077.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0078.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 30, - "h": 47 - }, - "frame": { - "x": 61, - "y": 0, - "w": 30, - "h": 47 - } - }, - { - "filename": "0103.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 29, - "h": 47 - }, - "frame": { - "x": 91, - "y": 0, - "w": 29, - "h": 47 - } - }, - { - "filename": "0104.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 29, - "h": 47 - }, - "frame": { - "x": 91, - "y": 0, - "w": 29, - "h": 47 - } - }, - { - "filename": "0113.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 29, - "h": 47 - }, - "frame": { - "x": 91, - "y": 0, - "w": 29, - "h": 47 - } - }, - { - "filename": "0114.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 29, - "h": 47 - }, - "frame": { - "x": 91, - "y": 0, - "w": 29, - "h": 47 - } - }, - { - "filename": "0107.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 29, - "h": 47 - }, - "frame": { - "x": 61, - "y": 47, - "w": 29, - "h": 47 - } - }, - { - "filename": "0108.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 29, - "h": 47 - }, - "frame": { - "x": 61, - "y": 47, - "w": 29, - "h": 47 - } - }, - { - "filename": "0117.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 29, - "h": 47 - }, - "frame": { - "x": 61, - "y": 47, - "w": 29, - "h": 47 - } - }, - { - "filename": "0118.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 4, - "w": 29, - "h": 47 - }, - "frame": { - "x": 61, - "y": 47, - "w": 29, - "h": 47 - } - }, - { - "filename": "0105.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 46 - }, - "frame": { - "x": 61, - "y": 94, - "w": 28, - "h": 46 - } - }, - { - "filename": "0106.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 46 - }, - "frame": { - "x": 61, - "y": 94, - "w": 28, - "h": 46 - } - }, - { - "filename": "0115.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 46 - }, - "frame": { - "x": 61, - "y": 94, - "w": 28, - "h": 46 - } - }, - { - "filename": "0116.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 28, - "h": 46 - }, - "frame": { - "x": 61, - "y": 94, - "w": 28, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 29, - "h": 45 - }, - "frame": { - "x": 89, - "y": 94, - "w": 29, - "h": 45 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 29, - "h": 45 - }, - "frame": { - "x": 89, - "y": 94, - "w": 29, - "h": 45 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 29, - "h": 45 - }, - "frame": { - "x": 89, - "y": 94, - "w": 29, - "h": 45 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 29, - "h": 45 - }, - "frame": { - "x": 89, - "y": 94, - "w": 29, - "h": 45 - } - }, - { - "filename": "0075.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 29, - "h": 45 - }, - "frame": { - "x": 89, - "y": 94, - "w": 29, - "h": 45 - } - }, - { - "filename": "0076.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 31, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 29, - "h": 45 - }, - "frame": { - "x": 89, - "y": 94, - "w": 29, - "h": 45 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4209223453e7dabb3758c23bb26a3f91:234fdcf4efd83f52e8b51f13ec19a55c:16c1874bc814253ca78e52a99a340ff7$" - } -} diff --git a/public/images/pokemon/exp/back/753.png b/public/images/pokemon/exp/back/753.png deleted file mode 100644 index aa1fb7067451bf45a6cfae43f0a9e2f6a945ab38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2062 zcmV+p2=VucP)JXlcKcfHOe9zrV~9o5Q*1+|kDH z@w|U`qKf(~+OKMq+~qCfXgzf}Jln5m404yZOonUD;dnB>07069+@=1>aNQA;@dRs0 zQ;=LfUr&bM_!T*R?%4Y^Zsi*6p<|?8ocN?ENG|^vT{EuM;McJrcX`dYbasYj@p0K= zwePsjh}6`iwk927EVVUhT3%r;4eh0A;G+ss7;JqUpd0Lf9HQo~9oj=Tc>*#VrRAJU z2nu7nYT()Hu1&%6TZ|TkAfAnoPZ* z<+-f>`?I;c%!MOqrSN{Bq%*G>*?RLCDp@X zaUJ5vksIDrYE16g+l9`7oRtzRkf*Pq27c82m4G9nV_nFtx0Jb=&57x3THF~az&)My z_D*lG29J0h>*8)@j5AnV>6{mUoNI|Ax=_=Fnk5`SZC%`@G0yIF7acQQe_aNzJTadN zlse|B8yQ3<)9@(}5?b5VQCVHItn3(iFiLwiUl zq$lY(VqDZZhZb!JQb4zp4<{H)9;7cA7c~s+P5df~4E;9pq2XvlHP378mYUR_Pl>M@ z$fq8JHX@&95NanMK4pv$#S+c1iG28Q5NanMKC9Syi71w6(kAlZV`D#-h+>H*ZXh2% z9E94*hYts#cJkrFL1+{5@fty>oqYIk5NanMJ{*KLAs-qJLha^0ROGTlA9d4vR`Yo>dEI!Hd#3i$|74HKNs zez-oJYA695cm*|cs98cqg?!qkI~&Y{sf7~1>x=DBSE0mMzve~AB^Ut|aGtB2;Z->5TM&YnlVb!EqRf_vzZjCiB*CIL!fJXQN5#0h5G z;LSS=Uo=7eix49iQ4rqLfe^5UlXFOf)PmK}VjIC!OjfhK0eTQ@#UDj5#3hXcgR+TW zcK=CDJJ19#Yin!{94E&KMjVk@144g#EXN3D=ggQ?!$2rvIYux7q2Q>v|L&?DgeLox z;{;=C&d|Q710kdzmScRQYrr2eNF$GGheA)4~EWvyUJQL5RJrK9RCDO&BE(0N*y8?+dmSDsbd?@bBpl0dK+!~R*9?juN z$bb;O2<`p?Ih5-JBRWVIcq#}A{vf0eUUz1|Q|7@%gAn{gMli<5uL|JreKo$Ib^sy2 sd+gV~-2}CKhey_Oq&6ZL;eG7<4Vg+-K{zz)2LJ#707*qoM6N<$f^$j7lK=n! diff --git a/public/images/pokemon/exp/back/754.json b/public/images/pokemon/exp/back/754.json deleted file mode 100644 index 86abaac1814..00000000000 --- a/public/images/pokemon/exp/back/754.json +++ /dev/null @@ -1,1112 +0,0 @@ -{ - "textures": [ - { - "image": "754.png", - "format": "RGBA8888", - "size": { - "w": 222, - "h": 222 - }, - "scale": 1, - "frames": [ - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 92, - "h": 68 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 92, - "h": 68 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 92, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 92, - "h": 68 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 88, - "h": 68 - }, - "frame": { - "x": 92, - "y": 68, - "w": 88, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 88, - "h": 68 - }, - "frame": { - "x": 92, - "y": 68, - "w": 88, - "h": 68 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 40, - "h": 68 - }, - "frame": { - "x": 180, - "y": 68, - "w": 40, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 40, - "h": 68 - }, - "frame": { - "x": 180, - "y": 68, - "w": 40, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3adad944aac48ad53efa41f8c9916d1c:ea15b954875ad08814f50cbbf849c1b3:f7cb0e9bb3adbe899317e6e2e306035d$" - } -} diff --git a/public/images/pokemon/exp/back/754.png b/public/images/pokemon/exp/back/754.png deleted file mode 100644 index 66bd6a1b9758f405bbc4754bcad9fa3c6e1db256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3640 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 Hu0mjfmxbn~ diff --git a/public/images/pokemon/exp/back/shiny/693.json b/public/images/pokemon/exp/back/shiny/693.json deleted file mode 100644 index 6358a8908f6..00000000000 --- a/public/images/pokemon/exp/back/shiny/693.json +++ /dev/null @@ -1,902 +0,0 @@ -{ "frames": [ - { - "filename": "0001.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0002.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0003.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0004.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0005.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0006.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0007.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0008.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0009.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0010.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0011.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0012.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0013.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0014.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0015.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0016.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0017.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0018.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0019.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0020.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0021.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0022.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0023.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0024.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0025.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0026.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0027.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0028.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0029.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0030.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0031.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0032.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0033.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0034.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0035.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0036.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0037.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0038.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0039.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0040.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0041.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0042.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0043.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0044.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0045.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0046.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0047.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0048.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0049.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0050.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0051.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0052.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0053.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0054.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0055.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0056.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0057.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0058.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0059.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0060.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0061.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0062.png", - "frame": { "x": 472, "y": 70, "w": 88, "h": 72 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 0, "w": 88, "h": 72 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0063.png", - "frame": { "x": 378, "y": 138, "w": 91, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 8, "w": 91, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0064.png", - "frame": { "x": 187, "y": 260, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0065.png", - "frame": { "x": 379, "y": 257, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 16, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0066.png", - "frame": { "x": 572, "y": 1, "w": 98, "h": 66 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 98, "h": 66 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0067.png", - "frame": { "x": 478, "y": 1, "w": 94, "h": 69 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 11, "w": 94, "h": 69 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0068.png", - "frame": { "x": 560, "y": 132, "w": 93, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 19, "w": 93, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0069.png", - "frame": { "x": 474, "y": 257, "w": 90, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 22, "w": 90, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0070.png", - "frame": { "x": 95, "y": 197, "w": 94, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 21, "w": 94, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0071.png", - "frame": { "x": 99, "y": 1, "w": 94, "h": 71 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 71 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0072.png", - "frame": { "x": 291, "y": 1, "w": 90, "h": 73 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 6, "w": 90, "h": 73 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0073.png", - "frame": { "x": 288, "y": 74, "w": 90, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 21, "y": 11, "w": 90, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0074.png", - "frame": { "x": 368, "y": 317, "w": 88, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 23, "y": 17, "w": 88, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0075.png", - "frame": { "x": 96, "y": 259, "w": 91, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 15, "w": 91, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0076.png", - "frame": { "x": 381, "y": 68, "w": 91, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 20, "y": 3, "w": 91, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0077.png", - "frame": { "x": 565, "y": 196, "w": 90, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 6, "w": 90, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0078.png", - "frame": { "x": 278, "y": 266, "w": 90, "h": 59 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 90, "h": 59 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0079.png", - "frame": { "x": 189, "y": 199, "w": 95, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 8, "w": 95, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0080.png", - "frame": { "x": 193, "y": 1, "w": 98, "h": 68 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 3, "w": 98, "h": 68 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0081.png", - "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0082.png", - "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0083.png", - "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0084.png", - "frame": { "x": 1, "y": 136, "w": 94, "h": 63 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0085.png", - "frame": { "x": 95, "y": 72, "w": 96, "h": 63 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 12, "w": 96, "h": 63 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0086.png", - "frame": { "x": 381, "y": 1, "w": 97, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 97, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0087.png", - "frame": { "x": 1, "y": 71, "w": 94, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 17, "y": 10, "w": 94, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0088.png", - "frame": { "x": 469, "y": 196, "w": 96, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 96, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0089.png", - "frame": { "x": 1, "y": 1, "w": 98, "h": 70 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 98, "h": 70 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0090.png", - "frame": { "x": 191, "y": 136, "w": 94, "h": 63 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 94, "h": 63 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0091.png", - "frame": { "x": 95, "y": 135, "w": 96, "h": 62 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 96, "h": 62 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0092.png", - "frame": { "x": 572, "y": 67, "w": 99, "h": 65 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 99, "h": 65 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0093.png", - "frame": { "x": 284, "y": 205, "w": 95, "h": 61 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 11, "w": 95, "h": 61 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0094.png", - "frame": { "x": 1, "y": 199, "w": 91, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 12, "w": 91, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0095.png", - "frame": { "x": 1, "y": 259, "w": 95, "h": 60 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 12, "w": 95, "h": 60 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0096.png", - "frame": { "x": 193, "y": 69, "w": 95, "h": 67 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 5, "w": 95, "h": 67 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0097.png", - "frame": { "x": 285, "y": 141, "w": 92, "h": 64 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 18, "y": 8, "w": 92, "h": 64 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0098.png", - "frame": { "x": 96, "y": 318, "w": 89, "h": 58 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 22, "y": 14, "w": 89, "h": 58 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - }, - { - "filename": "0099.png", - "frame": { "x": 564, "y": 261, "w": 92, "h": 58 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 19, "y": 14, "w": 92, "h": 58 }, - "sourceSize": { "w": 111, "h": 83 }, - "duration": 100 - } - ], - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.12-x64", - "image": "693.png", - "format": "I8", - "size": { "w": 672, "h": 377 }, - "scale": "1" - } -} diff --git a/public/images/pokemon/exp/back/shiny/693.png b/public/images/pokemon/exp/back/shiny/693.png deleted file mode 100644 index 6884c2e28c7cc0a973f46300b758328f9b60c0f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21707 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 diff --git a/public/images/pokemon/exp/back/shiny/754.json b/public/images/pokemon/exp/back/shiny/754.json deleted file mode 100644 index 8b1a3d44a4d..00000000000 --- a/public/images/pokemon/exp/back/shiny/754.json +++ /dev/null @@ -1,1133 +0,0 @@ -{ - "textures": [ - { - "image": "754.png", - "format": "RGBA8888", - "size": { - "w": 222, - "h": 222 - }, - "scale": 1, - "frames": [ - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 92, - "h": 68 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 92, - "h": 68 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 92, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 92, - "h": 68 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 88, - "h": 68 - }, - "frame": { - "x": 92, - "y": 68, - "w": 88, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 88, - "h": 68 - }, - "frame": { - "x": 92, - "y": 68, - "w": 88, - "h": 68 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 40, - "h": 68 - }, - "frame": { - "x": 180, - "y": 68, - "w": 40, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 40, - "h": 68 - }, - "frame": { - "x": 180, - "y": 68, - "w": 40, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7651b73927071f2814265b66582a8d13:a2d1ef3cf0c2458640f77c2fbcc821a0:f7cb0e9bb3adbe899317e6e2e306035d$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/754.png b/public/images/pokemon/exp/back/shiny/754.png deleted file mode 100644 index 1f7346ed822ae7a5f5d53874880134a108d990c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3640 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 P00000NkvXXu0mjf3{pa$ diff --git a/public/images/pokemon/exp/shiny/692.json b/public/images/pokemon/exp/shiny/692.json deleted file mode 100644 index 86b535260ae..00000000000 --- a/public/images/pokemon/exp/shiny/692.json +++ /dev/null @@ -1,794 +0,0 @@ -{ "frames": [ - { - "filename": "0001.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0002.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0003.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0004.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0005.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0006.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0007.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0008.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0009.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0010.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0011.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0012.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0013.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0014.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0015.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0016.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0017.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0018.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0019.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0020.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0021.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0022.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0023.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0024.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0025.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0026.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0027.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0028.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0029.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0030.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0031.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0032.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0033.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0034.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0035.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0036.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0037.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0038.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0039.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0040.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0041.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0042.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0043.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0044.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0045.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0046.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0047.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0048.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0049.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0050.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0051.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0052.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0053.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0054.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0055.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0056.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0057.png", - "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0058.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0059.png", - "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0060.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0061.png", - "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0062.png", - "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0063.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0064.png", - "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0065.png", - "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0066.png", - "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0067.png", - "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0068.png", - "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0069.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0070.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0071.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0072.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0073.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0074.png", - "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0075.png", - "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0076.png", - "frame": { "x": 117, "y": 72, "w": 59, "h": 33 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 33 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0077.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0078.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0079.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0080.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0081.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0082.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0083.png", - "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0084.png", - "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0085.png", - "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0086.png", - "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - }, - { - "filename": "0087.png", - "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, - "sourceSize": { "w": 63, "h": 35 }, - "duration": 50 - } - ], - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.12-x64", - "image": "692.png", - "format": "I8", - "size": { "w": 239, "h": 106 }, - "scale": "1" - } -} diff --git a/public/images/pokemon/exp/shiny/692.png b/public/images/pokemon/exp/shiny/692.png deleted file mode 100644 index 86f8cf51e927f901f82eebd19c51b559b8bb1977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2580 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 U@SQEz%m4rY07*qoM6N<$f@D_Uga7~l diff --git a/public/images/pokemon/exp/shiny/754.json b/public/images/pokemon/exp/shiny/754.json deleted file mode 100644 index 18bb597aa75..00000000000 --- a/public/images/pokemon/exp/shiny/754.json +++ /dev/null @@ -1,1133 +0,0 @@ -{ - "textures": [ - { - "image": "754.png", - "format": "RGBA8888", - "size": { - "w": 234, - "h": 234 - }, - "scale": 1, - "frames": [ - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 0, - "w": 93, - "h": 68 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 0, - "w": 48, - "h": 68 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 93, - "h": 68 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 93, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 68 - }, - "frame": { - "x": 93, - "y": 68, - "w": 93, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 186, - "y": 68, - "w": 48, - "h": 68 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 85, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 85, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 85, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 85, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 85, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 133, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 181, - "y": 136, - "w": 48, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 93, - "h": 68 - }, - "spriteSourceSize": { - "x": 23, - "y": 0, - "w": 48, - "h": 68 - }, - "frame": { - "x": 181, - "y": 136, - "w": 48, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:05bdd50d4b0041ca84c3293ee7fdf36e:adfe2b6fb11cad37f71416b628cb08c7:f7cb0e9bb3adbe899317e6e2e306035d$" - } -} diff --git a/public/images/pokemon/exp/shiny/754.png b/public/images/pokemon/exp/shiny/754.png deleted file mode 100644 index b1d4806163aa503f2e6f9d32ee7174ecb103bebe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3754 zcmZ{nc{~&T>k$Ch0*kV=qDmMc_$NLJ@LWXDc+`jFM3N-A{5@(aRWt?<}0 zx~k$z}U%{lq3Dl_PVn>-HiG`{+`)kB`0$T#&>&o{g7MZoUg~%f-PRW zKYp%G_4%1uzaJh{#Oqx0;qCY)?sM11AB#Fa_-nBW66^f+(1oAdc7*4HE+t;?CAg9= zLUn%e_xWH_ySo?dJ8zmC3kp>G?otf!DpT~zrQIw9j|$Ym;YUP82xq-6z(=y;2ftxM zWheuvJdcow<=hbBlDBkdhOy3RKt$? zVK`OF8D-@=@YlaKE~f|6+-dB-d2bq#^{3f1KMj+j*(?tZ$sEX4S*kM|e* zVSCVy`%)AIo-j#|^ua9n{ko4<7{^GePKxu@e8U`zeEXW3GGk zDG(WPA&LgE+(?30tu41zp?I;SlEUv5ddE^rO4g{1DOuE=iyhBu0U`8M@nPE+_5tw4 zNT)G?ai7E#L`s$)J|Rdw0n+^BljTZ(?guk9Bs13Dx5$J!YVoggr!x(HDZV~!RPnNF zD@*5_%0K6SB(>i^(otR@Iqw2&&ub?jnn&5BYH94S3Cb@)%Va# zvhm3okwNDBj_7+&KR$ZB45xs(90m;dK6@@m+3r!Qf^}?P9mfyXpK$cpYSU!Z(%ryB z<_Z=s=#81eBQ9*()%{ATd1DD}y{{s>CezURn(%%8HZVE0J{k>sxA5u#CGzc>_O$QgdxzaW{^`9YcXL>CTA7BoFY z3s_w|@)6g%XEr%*ZOnEnOXMzmEGg&U=ob!Lz&u^`%8a=67S;8Zj^l_;k*K%fI&lT3 z4I=}8suUAj8|?Jqx)DjBV?Q7P@v&Y)MkYE&Hrgq=_E@2Cm0+8wN1;%J&;9w+%LhH& zRCL4D&b_gmy*GdQ=$0{AeXf7=Vby-r`$OKXzJ|}ISy$-7{>TIN1*_=evxznD9--Zz zMNI~4sH)ncB~B6}4>KABmmp zB2lEIRT4(P6Bx6-+54rrOZ9WElyiy~20?($1`_2fK@>-+ff+F&n5{aGa0#9# zdCt499b6Ru{$tY=w(jqC_wb)a?HToR&cPN;CDQ4eOh}pYq(rbCQ>j7*kBlF;l4VjK z^P!~8Y;NEuQuK4g?KkQC!yan~X?sI_c1)R6Tdn4i!KN?Z*I(C`FGS8@i!?$-n4>N| z3{rG5B8+i(=sxmxZ483xo<>|GMW^o$xeX0~Elc~&7O>rOb+<_RDL@24ZZbW18apB> zZ9$^+uqUcXn_b08a{op!sc>-7vn#DJ%+Wxu1}Qo~C6dGP9r{HFhg@YyS8p$1Z)DdJ zlPvSz8t_U3T(cNUcNpQWcQ1=(I9Ek1^HLD-q|p-f1vfu%?INcv23T!u^c5*D41WL%Qeo4jlj*MwAoNqDRQ`;`s=>ymlQ1p4l7CTfC{)d9%9C|D3$70)U<@Fq8E~~Xm%FNUnTwJB+9c0tx-Q@l0WQw zhiJLQYy{(-QxTyyfU6labE#bw%}Uy^@I^7wohFvBI3l9?Gn+Loddkl?f}vJz6v4RG zCz6@~^z3P=mK;Bj^9hW0y*mJw6GzzhY}n8ZqHR4ED3uYV^&=$Am<`I5Z z^&%-c6vs~^MO*eI^nsUp*hiT88k}kDj$>K|^0ST#^H+*%ocmgnf&6%2iRvTnnCVxt zxE)N2Lvf4}k;_j#I#Ba!dB3KftVxx>!=!>c3Y6&5UG_nT%yJZZQ)rXyk7{|f*9V$a z{dqFc;lMvJnr;QH!sWXl_xA=V|AB^rBY^*b!iU&Oe?T?;`hP$d77ddAGi{c6{Evha z>n^U`C2dUt-C%1rraJhVLhsc`wNU3%;1uj=$X>AddZUv+AC{uAopZGonT7SF^Hc3D zN))3!??w!BseXlNu3!5{X0}15O~M7Wc2(`{S`O08F~NNfwq`*o@}p*PaC9WRclz9P zqHZVOak{`|iC&|;wd&KiPr6V_k`!eZl$rcwf8Z$hr2L_{!dy?XCs( zUxw3njbI;(saKci$9i9?>sqXeEt+U_aMio;68fRo5pQBb|$6Rve!Ehzx1i(-dTW)Cv+3@U`tN) zroXdR5UXrF$C4Wf2&8|wjsL=Kzt@}$0)w5+2MO{bhE zE_6_qx?*;Hv8Hk!kKa6*yeeo^!9k@%*6s)#o7txvH`2B#E);VO6;R+Y##Mpk3`a!> zpaBg)@9LBl zQsKgx7^xiGF>=Mavxjj`l+3E3#W51f-u5wq)Wz5>qz`&~#+b!GqkU)KKSiH2RS z_Rxj5DmQz4QXKNo+_0_C9o42& lxbnmwGX4KHMcR3in&F2nj@{eZ*!@WYtYCKLBvY@%{{sbcX(Ipt diff --git a/public/images/pokemon/shiny/672.json b/public/images/pokemon/shiny/672.json index dfd98acaf6b..f337bef7d29 100644 --- a/public/images/pokemon/shiny/672.json +++ b/public/images/pokemon/shiny/672.json @@ -1,41 +1,479 @@ -{ - "textures": [ - { - "image": "672.png", - "format": "RGBA8888", - "size": { - "w": 50, - "h": 50 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 42, - "h": 50 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 50 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 50 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b346b616fb3566e3bb64cdd6b14c5d59:fb0b72a9ea01a28cfcf7731d5cf359af:2e4767b7cd134fc0ab1bb6e9eee82bc7$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 127, "y": 50, "w": 42, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 42, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 43, "y": 53, "w": 43, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 43, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 124, "y": 148, "w": 43, "h": 45 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 13, "w": 43, "h": 45 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 102, "w": 42, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 42, "h": 47 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 54, "w": 42, "h": 48 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 10, "w": 42, "h": 48 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 127, "y": 99, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 128, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 43, "y": 0, "w": 43, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 43, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 43, "h": 54 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 42, "y": 100, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 86, "y": 50, "w": 41, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 51 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 43, "y": 0, "w": 43, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 4, "w": 43, "h": 53 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 0, "y": 0, "w": 43, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 43, "h": 54 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 83, "y": 101, "w": 41, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 9, "w": 41, "h": 49 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 86, "y": 50, "w": 41, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 7, "w": 41, "h": 51 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 86, "y": 0, "w": 42, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 8, "w": 42, "h": 50 }, + "sourceSize": { "w": 44, "h": 58 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.11-x64", + "image": "672.png", + "format": "I8", + "size": { "w": 170, "h": 193 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/672.png b/public/images/pokemon/shiny/672.png index b25ec4f08d3793635a101a729d9ba37669dde734..8602e7a026b66294dd20c1094f6e47cef215331a 100644 GIT binary patch literal 3337 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 diff --git a/public/images/pokemon/shiny/692.json b/public/images/pokemon/shiny/692.json index fc36cdb3337..86b535260ae 100644 --- a/public/images/pokemon/shiny/692.json +++ b/public/images/pokemon/shiny/692.json @@ -1,41 +1,794 @@ -{ - "textures": [ - { - "image": "692.png", - "format": "RGBA8888", - "size": { - "w": 56, - "h": 56 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 56, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 56, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 56, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:19c1aa023d08bc22ccccf8bfeaa199e7:b92ea755c18e1ed1e6d509334c6f592e:2880def858c84cd859bedf13b0b49a33$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0002.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0003.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0004.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0005.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0006.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0007.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0008.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0009.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0010.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0011.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0012.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0013.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0014.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0015.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0016.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0017.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0018.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0019.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0020.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0021.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0022.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0023.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0024.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0025.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0026.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0027.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0028.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0029.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0030.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0031.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0032.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0033.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0034.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0035.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0036.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0037.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0038.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0039.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0040.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0041.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0042.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0043.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0044.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0045.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0046.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0047.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0048.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0049.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0050.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0051.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0052.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0053.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0054.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0055.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0056.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0057.png", + "frame": { "x": 121, "y": 1, "w": 59, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 59, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0058.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0059.png", + "frame": { "x": 1, "y": 36, "w": 58, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 1, "w": 58, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0060.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0061.png", + "frame": { "x": 181, "y": 1, "w": 57, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 57, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0062.png", + "frame": { "x": 60, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0063.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0064.png", + "frame": { "x": 121, "y": 36, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0065.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0066.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0067.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0068.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0069.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0070.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0071.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0072.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0073.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0074.png", + "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0075.png", + "frame": { "x": 1, "y": 71, "w": 57, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0076.png", + "frame": { "x": 117, "y": 72, "w": 59, "h": 33 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 59, "h": 33 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0077.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0078.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0079.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0080.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0081.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0082.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0083.png", + "frame": { "x": 1, "y": 1, "w": 60, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 60, "h": 34 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0084.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0085.png", + "frame": { "x": 62, "y": 1, "w": 58, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 58, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0086.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + }, + { + "filename": "0087.png", + "frame": { "x": 178, "y": 37, "w": 56, "h": 35 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 56, "h": 35 }, + "sourceSize": { "w": 63, "h": 35 }, + "duration": 50 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.12-x64", + "image": "692.png", + "format": "I8", + "size": { "w": 239, "h": 106 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/692.png b/public/images/pokemon/shiny/692.png index 8dc8ee90534866c392bd1d25bf699b5ce1f1c4b9..86f8cf51e927f901f82eebd19c51b559b8bb1977 100644 GIT binary patch literal 2580 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 KMNUMnLSTZ}Z5|Z> diff --git a/public/images/pokemon/shiny/753.json b/public/images/pokemon/shiny/753.json index 964519cb949..5b20ef749a0 100644 --- a/public/images/pokemon/shiny/753.json +++ b/public/images/pokemon/shiny/753.json @@ -4,30 +4,2571 @@ "image": "753.png", "format": "RGBA8888", "size": { - "w": 45, - "h": 45 + "w": 137, + "h": 137 }, "scale": 1, "frames": [ { "filename": "0001.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { - "w": 28, - "h": 45 + "w": 30, + "h": 52 }, "spriteSourceSize": { "x": 0, - "y": 0, - "w": 28, - "h": 45 + "y": 5, + "w": 30, + "h": 47 }, "frame": { "x": 0, "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0111.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0112.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0120.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0121.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0122.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 30, + "h": 47 + }, + "frame": { + "x": 0, + "y": 0, + "w": 30, + "h": 47 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, "w": 28, + "h": 47 + }, + "frame": { + "x": 30, + "y": 0, + "w": 28, + "h": 47 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 28, + "h": 47 + }, + "frame": { + "x": 30, + "y": 0, + "w": 28, + "h": 47 + } + }, + { + "filename": "0113.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 28, + "h": 47 + }, + "frame": { + "x": 30, + "y": 0, + "w": 28, + "h": 47 + } + }, + { + "filename": "0114.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 28, + "h": 47 + }, + "frame": { + "x": 30, + "y": 0, + "w": 28, + "h": 47 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 28, + "h": 47 + }, + "frame": { + "x": 58, + "y": 0, + "w": 28, + "h": 47 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 28, + "h": 47 + }, + "frame": { + "x": 58, + "y": 0, + "w": 28, + "h": 47 + } + }, + { + "filename": "0117.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 28, + "h": 47 + }, + "frame": { + "x": 58, + "y": 0, + "w": 28, + "h": 47 + } + }, + { + "filename": "0118.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 4, + "w": 28, + "h": 47 + }, + "frame": { + "x": 58, + "y": 0, + "w": 28, + "h": 47 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 1, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 0, + "w": 29, + "h": 46 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 6, + "w": 29, + "h": 46 + }, + "frame": { + "x": 86, + "y": 46, + "w": 29, + "h": 46 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 47, + "w": 30, + "h": 45 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 27, + "h": 46 + }, + "frame": { + "x": 30, + "y": 47, + "w": 27, + "h": 46 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 27, + "h": 46 + }, + "frame": { + "x": 30, + "y": 47, + "w": 27, + "h": 46 + } + }, + { + "filename": "0115.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 27, + "h": 46 + }, + "frame": { + "x": 30, + "y": 47, + "w": 27, + "h": 46 + } + }, + { + "filename": "0116.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 27, + "h": 46 + }, + "frame": { + "x": 30, + "y": 47, + "w": 27, + "h": 46 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 92, + "w": 30, + "h": 45 + } + }, + { + "filename": "0119.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 30, + "h": 45 + }, + "frame": { + "x": 0, + "y": 92, + "w": 30, + "h": 45 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 44 + }, + "frame": { + "x": 57, + "y": 47, + "w": 29, + "h": 44 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 44 + }, + "frame": { + "x": 57, + "y": 47, + "w": 29, + "h": 44 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 44 + }, + "frame": { + "x": 57, + "y": 47, + "w": 29, + "h": 44 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 44 + }, + "frame": { + "x": 57, + "y": 47, + "w": 29, + "h": 44 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 44 + }, + "frame": { + "x": 57, + "y": 47, + "w": 29, + "h": 44 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 0, + "y": 8, + "w": 29, + "h": 44 + }, + "frame": { + "x": 57, + "y": 47, + "w": 29, + "h": 44 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 57, + "y": 91, + "w": 28, + "h": 44 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 85, + "y": 92, + "w": 28, + "h": 44 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 85, + "y": 92, + "w": 28, + "h": 44 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 85, + "y": 92, + "w": 28, + "h": 44 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 85, + "y": 92, + "w": 28, + "h": 44 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 85, + "y": 92, + "w": 28, + "h": 44 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 30, + "h": 52 + }, + "spriteSourceSize": { + "x": 2, + "y": 8, + "w": 28, + "h": 44 + }, + "frame": { + "x": 85, + "y": 92, + "w": 28, + "h": 44 } } ] @@ -36,6 +2577,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0dfeaaa8dc9e984b8345da123854713a:ca6cbb0693924b86228f2fe9ab294ec9:16c1874bc814253ca78e52a99a340ff7$" + "smartupdate": "$TexturePacker:SmartUpdate:0a066207f4eaa63438f1b44ba24dbced:1c3824600c00c692fd9dab4dbe03a2ed:16c1874bc814253ca78e52a99a340ff7$" } } diff --git a/public/images/pokemon/shiny/753.png b/public/images/pokemon/shiny/753.png index e13412f2a4f3bceaace7423bcdf472f49eb8ab1d..12f0f7a090f25a4f94d78f930a5487b7512ad024 100644 GIT binary patch delta 2042 zcmVOSH8jNmbK+zRH4ZEg)i}ErAO% zbK8FRe0m`fYC$NhCVrL_$9z4gNCa9Pa&|mX0)H&8gPJ1H>X5FdY)JKyBIM$JX$$OuJ?@iF1e!=0TtV)i&s8w2pAg6= zLL*NpHIU@07`7iiCS?QLciowe%nnXk|)S)Q)mrlj*Zr$S(qorBsUApLU4W;~=8? z6OAcCV@|1QAj$U^9mkjU*~%0fT1=@GHQ)ax_Hk{Rrt*WADF&#We<_usMvmi!aGFxV zY2Qmw`61&H_n*qmUTNeSODT%tUF>{RoTjhTDC6PPwQv_>(6dW(B%i>B>SL{Tfr`QFilSzc z_xnk7yB1rM>q#-^f2PVLOFD;lp+(=5RE-q{QRsLX`aE8**Xxnq%b&+T?>UK!$9^!D ztF%Lm)v^{}UPVzm3FYlXHm!T1R5FwmFQwMF7`0t|q@smYKj_>~l%}*CaWPiQ<-)r( z2B4K{YvaaE;w>bJM4Le6NnA$aD^WHQ5$!isQ4}ScsIr`*e^QKTq-ocGarXR}sZWH) zv^@FSu`Lr4hgSPv9Mb@kNX}n%L0r*tj&T*;1vv*??r@HA70m@X2VCxg83SCUc0tYo zm*dVcu0np!0hgN?%oyM*1_>|=+RK$r>bxS-1#!hD+smEKo{M6eAm`X+=~N&{2Uh_m z$T_65SdBZ~e_REa8cc%8(MUJvIrIY_$T`wQVMf8I=3cI1njo%7A4Bxj6lWV}*e1w1 z4z=!ylLk6`Tm_gQ=QtmkSvhZoA+)&)FhS0t8fUTyiG!;k6XYDpSr|E^;tat@Gk^(l z4&A7Nj=3wz(_lC@=SaVErI9p(;N&XM1Ubk4YA+y;e_i_gRObyj$7!rjyD$z>6={N;<1{LZUB)4*Qkh)1BKuTh z2UWQie^X2@T%j#?8at>8_5jXt1ICMUxT#8jp8d_FKpEsRhLV9Cr?B)v72!!AWi*tb z8A)zPCq`B9d$E8jiQtHevw|xOV?{_d-*yV^k2}n=CQq@;IH8I}8H$l_^a?^Um7t>m zRqn#WKPsHyBrjhZcQKrpLn9=ifikkC#1&`7e@HF_%1FFL8oBQzBn&UKQHEq044fo7 zqN0p!y!!UVK3s}zl#wl$rvNAK?I(sZiX_6gY5N5ugOIdQ2HmQH+>;qjL>W7dc$aHs zJdje#XTpUSd`N|X00Bi~Ue;Y6S8@OT|E&OiL ze+F6@OWEcX04>-J{Q;2C;1#H^tw$Ld%5d2y__|@KF${EZn&7r@XSIqd4;RRF85?|D#JB_FxKnGQwCvVD&zNN zC}uRwF_ZV<>Fo6jdQf-t#r2w=%t~IUq7G9ZBZC8Hxa=3_@M4Ue?|0M^gs*<%C}^R}joATYRj?y!DpsX!fVJz1q{izlNqV8oUBG{PmvxeI1#~Xz+?w!=Lr2i*w5- z*HshFWq2C?%9z2ue=MUhm(kc^e@)Y*j~R52Wwhopnp?f2H9ytg?VmcwG8%IkZ6k^A z_UCO|=p4&v%w;%&Tmu8em_gc>#IcOkQ}dz@e3ZZuB@H|j0|VFWLP#(sj%BQ?YeFPZ z2Qj#SM<{N5;Nkq5KILY5Mj*!ZY9oY)dxRoB6Z9l`#O3(v{xwX{u31wDP|pZObjtR1 z9y2&Dv~j(B2!RbQc>4V$+t;~=l^!`>^5!1PC{E5lLeaR;EM-s4%SJ!%&nqP19~n{j Y18D*Q@SQEz%m4rY07*qoM6N<$g8!J$?EnA( delta 410 zcmV;L0cHNG5Z41CiBL{Q4GJ0x0000DNk~Le0000j0000j2m=5B01d|OwlvFq7Ol;de0wuP^Kz!}5ebJ-Py*_Xm zHx3JUXrJGumx{kjFBB&tQA9dAnvUb3y*}4bzh&z~v5cC)qCOnmcrHp*d%?lnCu71bH*hFrXv&4i+Et(^b07*qoM6N<$ Eg8inv3jhEB diff --git a/public/images/pokemon/shiny/754.json b/public/images/pokemon/shiny/754.json index ecb5b8a6779..18bb597aa75 100644 --- a/public/images/pokemon/shiny/754.json +++ b/public/images/pokemon/shiny/754.json @@ -4,29 +4,1121 @@ "image": "754.png", "format": "RGBA8888", "size": { - "w": 68, - "h": 68 + "w": 234, + "h": 234 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0036.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 46, + "w": 93, "h": 68 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 46, + "w": 93, "h": 68 }, "frame": { "x": 0, "y": 0, - "w": 46, + "w": 93, + "h": 68 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 0, + "w": 93, + "h": 68 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 0, + "w": 48, + "h": 68 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 0, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 93, + "h": 68 + }, + "frame": { + "x": 93, + "y": 68, + "w": 93, + "h": 68 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 186, + "y": 68, + "w": 48, + "h": 68 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 85, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 85, + "h": 68 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 4, + "y": 0, + "w": 85, + "h": 68 + }, + "frame": { + "x": 0, + "y": 136, + "w": 85, + "h": 68 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 85, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 133, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 181, + "y": 136, + "w": 48, + "h": 68 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 93, + "h": 68 + }, + "spriteSourceSize": { + "x": 23, + "y": 0, + "w": 48, + "h": 68 + }, + "frame": { + "x": 181, + "y": 136, + "w": 48, "h": 68 } } @@ -36,6 +1128,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f4866096a7f384feda7689540b5499f2:1c5d416a85ea018909e59a1eb9c84c3a:f7cb0e9bb3adbe899317e6e2e306035d$" + "smartupdate": "$TexturePacker:SmartUpdate:05bdd50d4b0041ca84c3293ee7fdf36e:adfe2b6fb11cad37f71416b628cb08c7:f7cb0e9bb3adbe899317e6e2e306035d$" } } diff --git a/public/images/pokemon/shiny/754.png b/public/images/pokemon/shiny/754.png index f50262ab10ed86de88ba36b22827ed93d058280d..b1d4806163aa503f2e6f9d32ee7174ecb103bebe 100644 GIT binary patch delta 3725 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 diff --git a/public/images/pokemon/variant/exp/back/672.json b/public/images/pokemon/variant/exp/back/672.json deleted file mode 100644 index c118d603d57..00000000000 --- a/public/images/pokemon/variant/exp/back/672.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "1": { - "3d3128": "69112a", - "67615b": "9e2c3d", - "615140": "89431b", - "7e6d5a": "b3743e", - "554538": "642509", - "efeded": "f8e2b7", - "beb8b6": "e3a378", - "0e5d58": "8c6859", - "09a77c": "f8f0e2", - "0d8374": "d2af94", - "c16a3f": "321512", - "c6b379": "552d30", - "a8905c": "4b2525" - }, - "2": { - "3d3128": "161526", - "67615b": "2d2b40", - "615140": "4c7a68", - "7e6d5a": "72b692", - "554538": "305a4f", - "efeded": "ffeffe", - "beb8b6": "d4b3d7", - "0e5d58": "363e6c", - "09a77c": "96d5e3", - "0d8374": "6885b6", - "c16a3f": "612c6b", - "c6b379": "9f5f9b", - "a8905c": "854d87" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/692.json b/public/images/pokemon/variant/exp/back/692.json deleted file mode 100644 index d4c85f37c9d..00000000000 --- a/public/images/pokemon/variant/exp/back/692.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "1": { - "337380": "783a1d", - "b3b3b3": "c8ba6d", - "595959": "c85b5b", - "61daf2": "e1ac53", - "cc9c3d": "53be53", - "404040": "7d182d", - "ffc44c": "a9f076", - "b2f2ff": "fada7f", - "47a1b3": "af6a37", - "101010": "070707", - "735822": "20734c" - }, - "2": { - "337380": "5f3c23", - "b3b3b3": "68a7aa", - "595959": "88cd56", - "61daf2": "e1d6b6", - "cc9c3d": "7743be", - "404040": "1c873e", - "ffc44c": "a36feb", - "b2f2ff": "faf8d7", - "47a1b3": "968144", - "101010": "070707", - "735822": "371c72" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/693.json b/public/images/pokemon/variant/exp/back/693.json deleted file mode 100644 index 3187a81e0c0..00000000000 --- a/public/images/pokemon/variant/exp/back/693.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "1": { - "224b73": "552813", - "4595e5": "aa6839", - "23a2c8": "c87a23", - "262626": "230808", - "cc9c3d": "1b3c17", - "404040": "3c171b", - "5f5f5f": "6e2e3b", - "61daf2": "f2bd61", - "3674b3": "7d3e21", - "ffc44c": "426e2e", - "735822": "08230e" - }, - "2": { - "224b73": "5f463a", - "4595e5": "c8b493", - "23a2c8": "beb099", - "262626": "295a1c", - "cc9c3d": "6259af", - "404040": "2a8c53", - "5f5f5f": "51c85d", - "61daf2": "f0eadb", - "3674b3": "9b8265", - "ffc44c": "a39afa", - "735822": "36235f" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/753.json b/public/images/pokemon/variant/exp/back/753.json deleted file mode 100644 index 26e48f43509..00000000000 --- a/public/images/pokemon/variant/exp/back/753.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "1": { - "234028": "2e1643", - "5ba668": "4e2c62", - "468050": "3e2253", - "315945": "0e2616", - "549977": "1b3822", - "69bf94": "27452c", - "d98d9a": "a55c36", - "ffbfca": "b47145", - "803340": "682c16", - "cc5266": "a55c36" - }, - "2": { - "234028": "531034", - "5ba668": "ce54b0", - "468050": "9b2d76", - "315945": "441342", - "549977": "5a215a", - "69bf94": "6e3472", - "d98d9a": "263b83", - "ffbfca": "3454a5", - "803340": "0b1d4e", - "cc5266": "263b83" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/754.json b/public/images/pokemon/variant/exp/back/754.json deleted file mode 100644 index 5fb99ea57c9..00000000000 --- a/public/images/pokemon/variant/exp/back/754.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "1": { - "803340": "82180e", - "ff667f": "c95623", - "cc5266": "ac351f", - "ffbfca": "f48b49", - "d98d9a": "c95623", - "315945": "122a1a", - "69bf94": "314e36", - "bfbfbf": "c9d6b7", - "737373": "859970", - "f8f8f8": "eff7e2" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/754_2.json b/public/images/pokemon/variant/exp/back/754_2.json deleted file mode 100644 index f32f0133f99..00000000000 --- a/public/images/pokemon/variant/exp/back/754_2.json +++ /dev/null @@ -1,1112 +0,0 @@ -{ - "textures": [ - { - "image": "754_2.png", - "format": "RGBA8888", - "size": { - "w": 222, - "h": 222 - }, - "scale": 1, - "frames": [ - { - "filename": "0036.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 92, - "y": 0, - "w": 92, - "h": 68 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 184, - "y": 0, - "w": 38, - "h": 68 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 92, - "h": 68 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 68, - "w": 92, - "h": 68 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 92, - "h": 68 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 92, - "h": 68 - }, - "frame": { - "x": 0, - "y": 136, - "w": 92, - "h": 68 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 88, - "h": 68 - }, - "frame": { - "x": 92, - "y": 68, - "w": 88, - "h": 68 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 88, - "h": 68 - }, - "frame": { - "x": 92, - "y": 68, - "w": 88, - "h": 68 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 40, - "h": 68 - }, - "frame": { - "x": 180, - "y": 68, - "w": 40, - "h": 68 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 40, - "h": 68 - }, - "frame": { - "x": 180, - "y": 68, - "w": 40, - "h": 68 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 39, - "h": 68 - }, - "frame": { - "x": 92, - "y": 136, - "w": 39, - "h": 68 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 131, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 92, - "h": 68 - }, - "spriteSourceSize": { - "x": 25, - "y": 0, - "w": 38, - "h": 68 - }, - "frame": { - "x": 169, - "y": 136, - "w": 38, - "h": 68 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3adad944aac48ad53efa41f8c9916d1c:ea15b954875ad08814f50cbbf849c1b3:f7cb0e9bb3adbe899317e6e2e306035d$" - } -} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/754_2.png b/public/images/pokemon/variant/exp/back/754_2.png deleted file mode 100644 index 85eadd7428f1f47714ab694948233ca6260f4d25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3646 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 aqf9^bo)+t5(&1;3?Uu2nQLTYX)c*kQPkuK5 From e50ebaa815912b618d83158c66e7d59e6daa9105 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:51:11 -0600 Subject: [PATCH 059/106] [Misc] Fix missing types in battler tags and remove DragonCheerTag (#6188) * Fix missing types in battler tags * Fix issues with dragon cheer --- src/@types/battler-tags.ts | 9 +++++ src/data/battler-tags.ts | 82 ++++++++++++++++++++++++-------------- src/field/pokemon.ts | 4 +- 3 files changed, 63 insertions(+), 32 deletions(-) diff --git a/src/@types/battler-tags.ts b/src/@types/battler-tags.ts index 0057280e4e5..211eb25113d 100644 --- a/src/@types/battler-tags.ts +++ b/src/@types/battler-tags.ts @@ -88,6 +88,15 @@ export type AbilityBattlerTagType = | BattlerTagType.SLOW_START | BattlerTagType.TRUANT; +/** Subset of {@linkcode BattlerTagType}s that provide type boosts */ +export type TypeBoostTagType = BattlerTagType.FIRE_BOOST | BattlerTagType.CHARGED; + +/** Subset of {@linkcode BattlerTagType}s that boost the user's critical stage */ +export type CritStageBoostTagType = BattlerTagType.CRIT_BOOST | BattlerTagType.DRAGON_CHEER; + +/** Subset of {@linkcode BattlerTagType}s that remove one of the users' types */ +export type RemovedTypeTagType = BattlerTagType.DOUBLE_SHOCKED | BattlerTagType.BURNED_UP; + /** * Subset of {@linkcode BattlerTagType}s related to abilities that boost the highest stat. */ diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index edeff293aa0..59b040ca9d8 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -34,15 +34,19 @@ import type { StatStageChangeCallback } from "#phases/stat-stage-change-phase"; import i18next from "#plugins/i18n"; import type { AbilityBattlerTagType, + BattlerTagTypeData, ContactSetStatusProtectedTagType, ContactStatStageChangeProtectedTagType, + CritStageBoostTagType, DamageProtectedTagType, EndureTagType, HighestStatBoostTagType, MoveRestrictionBattlerTagType, ProtectionBattlerTagType, + RemovedTypeTagType, SemiInvulnerableTagType, TrappingBattlerTagType, + TypeBoostTagType, } from "#types/battler-tags"; import type { Mutable } from "#types/type-helpers"; import { BooleanHolder, coerceArray, getFrameMs, isNullOrUndefined, NumberHolder, toDmgValue } from "#utils/common"; @@ -203,6 +207,19 @@ export class SerializableBattlerTag extends BattlerTag { private declare __SerializableBattlerTag: never; } +/** + * Interface for a generic serializable battler tag, i.e. one that does not have a + * dedicated subclass. + * + * @remarks + * Used to ensure type safety when serializing battler tags, + * allowing typescript to properly infer the type of the tag. + * @see BattlerTagTypeMap + */ +interface GenericSerializableBattlerTag extends SerializableBattlerTag { + tagType: T; +} + /** * Base class for tags that restrict the usage of moves. This effect is generally referred to as "disabling" a move * in-game (not to be confused with {@linkcode MoveId.DISABLE}). @@ -560,6 +577,7 @@ export class BeakBlastChargingTag extends BattlerTag { * @see {@link https://bulbapedia.bulbagarden.net/wiki/Shell_Trap_(move) | Shell Trap} */ export class ShellTrapTag extends BattlerTag { + public override readonly tagType = BattlerTagType.SHELL_TRAP; public activated = false; constructor() { @@ -1144,6 +1162,7 @@ export class PowderTag extends BattlerTag { } export class NightmareTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.NIGHTMARE; constructor() { super(BattlerTagType.NIGHTMARE, BattlerTagLapseType.TURN_END, 1, MoveId.NIGHTMARE); } @@ -1197,6 +1216,7 @@ export class NightmareTag extends SerializableBattlerTag { } export class FrenzyTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.FRENZY; constructor(turnCount: number, sourceMove: MoveId, sourceId: number) { super(BattlerTagType.FRENZY, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); } @@ -2199,7 +2219,7 @@ export class SemiInvulnerableTag extends SerializableBattlerTag { } } -export class TypeImmuneTag extends SerializableBattlerTag { +export abstract class TypeImmuneTag extends SerializableBattlerTag { #immuneType: PokemonType; public get immuneType(): PokemonType { return this.#immuneType; @@ -2218,6 +2238,7 @@ export class TypeImmuneTag extends SerializableBattlerTag { * @see {@link https://bulbapedia.bulbagarden.net/wiki/Telekinesis_(move) | MoveId.TELEKINESIS} */ export class FloatingTag extends TypeImmuneTag { + public override readonly tagType = BattlerTagType.FLOATING; constructor(tagType: BattlerTagType, sourceMove: MoveId, turnCount: number) { super(tagType, sourceMove, PokemonType.GROUND, turnCount); } @@ -2247,6 +2268,7 @@ export class FloatingTag extends TypeImmuneTag { } export class TypeBoostTag extends SerializableBattlerTag { + public declare readonly tagType: TypeBoostTagType; #boostedType: PokemonType; #boostValue: number; #oneUse: boolean; @@ -2296,13 +2318,24 @@ export class TypeBoostTag extends SerializableBattlerTag { } export class CritBoostTag extends SerializableBattlerTag { - constructor(tagType: BattlerTagType, sourceMove: MoveId) { + public declare readonly tagType: CritStageBoostTagType; + /** The number of stages boosted by this tag */ + public readonly critStages: number; + + constructor(tagType: CritStageBoostTagType, sourceMove: MoveId) { super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove, undefined, true); } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); + // Dragon cheer adds +2 crit stages if the pokemon is a Dragon type when the tag is added + if (this.tagType === BattlerTagType.DRAGON_CHEER && pokemon.getTypes(true).includes(PokemonType.DRAGON)) { + (this as Mutable).critStages = 2; + } else { + (this as Mutable).critStages = 1; + } + globalScene.phaseManager.queueMessage( i18next.t("battlerTags:critBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), @@ -2323,23 +2356,12 @@ export class CritBoostTag extends SerializableBattlerTag { }), ); } -} -/** - * Tag for the effects of Dragon Cheer, which boosts the critical hit ratio of the user's allies. - */ -export class DragonCheerTag extends CritBoostTag { - /** The types of the user's ally when the tag is added */ - public typesOnAdd: PokemonType[]; - - constructor() { - super(BattlerTagType.CRIT_BOOST, MoveId.DRAGON_CHEER); - } - - onAdd(pokemon: Pokemon): void { - super.onAdd(pokemon); - - this.typesOnAdd = pokemon.getTypes(true); + public override loadTag(source: BaseBattlerTag & Pick): void { + super.loadTag(source); + // TODO: Remove the nullish coalescing once Zod Schemas come in + // For now, this is kept for backwards compatibility with older save files + (this as Mutable).critStages = source.critStages ?? 1; } } @@ -2398,6 +2420,7 @@ export class SaltCuredTag extends SerializableBattlerTag { } export class CursedTag extends SerializableBattlerTag { + public override readonly tagType = BattlerTagType.CURSED; constructor(sourceId: number) { super(BattlerTagType.CURSED, BattlerTagLapseType.TURN_END, 1, MoveId.CURSE, sourceId, true); } @@ -2444,7 +2467,8 @@ export class CursedTag extends SerializableBattlerTag { * Battler tag for attacks that remove a type post use. */ export class RemovedTypeTag extends SerializableBattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: MoveId) { + public declare readonly tagType: RemovedTypeTagType; + constructor(tagType: RemovedTypeTagType, lapseType: BattlerTagLapseType, sourceMove: MoveId) { super(tagType, lapseType, 1, sourceMove); } } @@ -2454,7 +2478,8 @@ export class RemovedTypeTag extends SerializableBattlerTag { * @description `IGNORE_FLYING`: Persistent grounding effects (i.e. from Smack Down and Thousand Waves) */ export class GroundedTag extends SerializableBattlerTag { - constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, sourceMove: MoveId) { + public override readonly tagType = BattlerTagType.IGNORE_FLYING; + constructor(tagType: BattlerTagType.IGNORE_FLYING, lapseType: BattlerTagLapseType, sourceMove: MoveId) { super(tagType, lapseType, 1, sourceMove); } } @@ -3719,9 +3744,8 @@ export function getBattlerTag( case BattlerTagType.FIRE_BOOST: return new TypeBoostTag(tagType, sourceMove, PokemonType.FIRE, 1.5, false); case BattlerTagType.CRIT_BOOST: - return new CritBoostTag(tagType, sourceMove); case BattlerTagType.DRAGON_CHEER: - return new DragonCheerTag(); + return new CritBoostTag(tagType, sourceMove); case BattlerTagType.ALWAYS_CRIT: case BattlerTagType.IGNORE_ACCURACY: return new SerializableBattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); @@ -3813,7 +3837,7 @@ export function getBattlerTag( * @param source - An object containing the data necessary to reconstruct the BattlerTag. * @returns The valid battler tag */ -export function loadBattlerTag(source: SerializableBattlerTag): BattlerTag { +export function loadBattlerTag(source: BattlerTag | BattlerTagTypeData): BattlerTag { // TODO: Remove this bang by fixing the signature of `getBattlerTag` // to allow undefined sourceIds and sourceMoves (with appropriate fallback for tags that require it) const tag = getBattlerTag(source.tagType, source.turnCount, source.sourceMove!, source.sourceId!); @@ -3854,7 +3878,7 @@ export type BattlerTagTypeMap = { [BattlerTagType.POWDER]: PowderTag; [BattlerTagType.NIGHTMARE]: NightmareTag; [BattlerTagType.FRENZY]: FrenzyTag; - [BattlerTagType.CHARGING]: SerializableBattlerTag; + [BattlerTagType.CHARGING]: GenericSerializableBattlerTag; [BattlerTagType.ENCORE]: EncoreTag; [BattlerTagType.HELPING_HAND]: HelpingHandTag; [BattlerTagType.INGRAIN]: IngrainTag; @@ -3894,11 +3918,11 @@ export type BattlerTagTypeMap = { [BattlerTagType.HIDDEN]: SemiInvulnerableTag; [BattlerTagType.FIRE_BOOST]: TypeBoostTag; [BattlerTagType.CRIT_BOOST]: CritBoostTag; - [BattlerTagType.DRAGON_CHEER]: DragonCheerTag; - [BattlerTagType.ALWAYS_CRIT]: SerializableBattlerTag; - [BattlerTagType.IGNORE_ACCURACY]: SerializableBattlerTag; - [BattlerTagType.ALWAYS_GET_HIT]: SerializableBattlerTag; - [BattlerTagType.RECEIVE_DOUBLE_DAMAGE]: SerializableBattlerTag; + [BattlerTagType.DRAGON_CHEER]: CritBoostTag; + [BattlerTagType.ALWAYS_CRIT]: GenericSerializableBattlerTag; + [BattlerTagType.IGNORE_ACCURACY]: GenericSerializableBattlerTag; + [BattlerTagType.ALWAYS_GET_HIT]: GenericSerializableBattlerTag; + [BattlerTagType.RECEIVE_DOUBLE_DAMAGE]: GenericSerializableBattlerTag; [BattlerTagType.BYPASS_SLEEP]: BattlerTag; [BattlerTagType.IGNORE_FLYING]: GroundedTag; [BattlerTagType.ROOSTED]: RoostedTag; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 7aecc0c8e75..7cb6f30c99e 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -25,7 +25,6 @@ import { AutotomizedTag, BattlerTag, CritBoostTag, - DragonCheerTag, EncoreTag, ExposedTag, GroundedTag, @@ -1390,8 +1389,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { const critBoostTag = source.getTag(CritBoostTag); if (critBoostTag) { // Dragon cheer only gives +1 crit stage to non-dragon types - critStage.value += - critBoostTag instanceof DragonCheerTag && !critBoostTag.typesOnAdd.includes(PokemonType.DRAGON) ? 1 : 2; + critStage.value += critBoostTag.critStages; } console.log(`crit stage: +${critStage.value}`); From c6ca35c4abee6149ab041696f879585c1feb9742 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:59:53 -0600 Subject: [PATCH 060/106] [Misc] Set default for crit stage battler tag (#6192) Set default for crit stage --- src/data/battler-tags.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 59b040ca9d8..2e06b213e28 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2320,7 +2320,7 @@ export class TypeBoostTag extends SerializableBattlerTag { export class CritBoostTag extends SerializableBattlerTag { public declare readonly tagType: CritStageBoostTagType; /** The number of stages boosted by this tag */ - public readonly critStages: number; + public readonly critStages: number = 1; constructor(tagType: CritStageBoostTagType, sourceMove: MoveId) { super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove, undefined, true); From 93525b5803cf0891c709ada4210b5c03cd79278b Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Fri, 1 Aug 2025 13:38:43 -0600 Subject: [PATCH 061/106] [Bug] [Beta] Remove setting currentPhase to null in clearAllPhases (#6193) Remove setting currentPhase to null in clearAllPhases --- src/phase-manager.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/phase-manager.ts b/src/phase-manager.ts index 850f0c564ea..aa01a0ffc10 100644 --- a/src/phase-manager.ts +++ b/src/phase-manager.ts @@ -322,7 +322,6 @@ export class PhaseManager { queue.splice(0, queue.length); } this.dynamicPhaseQueues.forEach(queue => queue.clear()); - this.currentPhase = null; this.standbyPhase = null; this.clearPhaseQueueSplice(); } From 97ddcb711b5cf46a150a5e0366e620070e4071d6 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sat, 2 Aug 2025 15:40:30 -0400 Subject: [PATCH 062/106] [Test] `game.move.use` overrides summon data moveset if present (#6174) * [Test] Update `game.move.use` to override summon data moveset if present * ran biome & fixed errors --- test/test-utils/helpers/move-helper.ts | 30 +++++++++++++++----------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/test/test-utils/helpers/move-helper.ts b/test/test-utils/helpers/move-helper.ts index 041df916cbf..6a01e4110da 100644 --- a/test/test-utils/helpers/move-helper.ts +++ b/test/test-utils/helpers/move-helper.ts @@ -143,7 +143,7 @@ export class MoveHelper extends GameManagerHelper { } } - /** Helper function to get the index of the selected move in the selected part member's moveset. */ + /** Helper function to get the index of the selected move in the selected party member's moveset. */ private getMovePosition(pokemonIndex: BattlerIndex.PLAYER | BattlerIndex.PLAYER_2, move: MoveId): number { const playerPokemon = this.game.scene.getPlayerField()[pokemonIndex]; const moveset = playerPokemon.getMoveset(); @@ -153,17 +153,18 @@ export class MoveHelper extends GameManagerHelper { } /** - * Modifies a player pokemon's moveset to contain only the selected move and then + * Modifies a player pokemon's moveset to contain only the selected move, and then * selects it to be used during the next {@linkcode CommandPhase}. * - * Warning: Will disable the player moveset override if it is enabled! + * **Warning**: Will disable the player moveset override if it is enabled, as well as any mid-battle moveset changes! * - * Note: If you need to check for changes in the player's moveset as part of the test, it may be - * best to use {@linkcode changeMoveset} and {@linkcode select} instead. - * @param moveId - the move to use - * @param pkmIndex - The {@linkcode BattlerIndex} of the player Pokemon using the move. Relevant for double battles only and defaults to {@linkcode BattlerIndex.PLAYER} if not specified. - * @param targetIndex - The {@linkcode BattlerIndex} of the Pokemon to target for single-target moves; should be omitted for multi-target moves. - * @param useTera - If `true`, the Pokemon will attempt to Terastallize even without a Tera Orb; default `false`. + * @param moveId - The {@linkcode MoveId} to use + * @param pkmIndex - The {@linkcode BattlerIndex} of the player Pokemon using the move. Relevant for double battles only and defaults to {@linkcode BattlerIndex.PLAYER} if not specified + * @param targetIndex - The {@linkcode BattlerIndex} of the Pokemon to target for single-target moves; should be omitted for multi-target moves + * @param useTera - If `true`, the Pokemon will attempt to Terastallize even without a Tera Orb; default `false` + * @remarks + * If you need to check for changes in the player's moveset as part of the test, it may be + * better to use {@linkcode changeMoveset} and {@linkcode select} instead. */ public use( moveId: MoveId, @@ -176,8 +177,11 @@ export class MoveHelper extends GameManagerHelper { console.warn("Warning: `MoveHelper.use` overwriting player pokemon moveset and disabling moveset override!"); } + // Clear out both the normal and temporary movesets before setting the move. const pokemon = this.game.scene.getPlayerField()[pkmIndex]; - pokemon.moveset = [new PokemonMove(moveId)]; + pokemon.moveset.splice(0); + pokemon.summonData.moveset?.splice(0); + pokemon.setMove(0, moveId); if (useTera) { this.selectWithTera(moveId, pkmIndex, targetIndex); @@ -211,7 +215,7 @@ export class MoveHelper extends GameManagerHelper { /** * Changes a pokemon's moveset to the given move(s). * - * Used when the normal moveset override can't be used (such as when it's necessary to check or update properties of the moveset). + * Useful when normal moveset overrides can't be used (such as when it's necessary to check or update properties of the moveset). * * **Note**: Will disable the moveset override matching the pokemon's party. * @param pokemon - The {@linkcode Pokemon} being modified @@ -232,8 +236,8 @@ export class MoveHelper extends GameManagerHelper { moveset = coerceArray(moveset); expect(moveset.length, "Cannot assign more than 4 moves to a moveset!").toBeLessThanOrEqual(4); pokemon.moveset = []; - moveset.forEach(move => { - pokemon.moveset.push(new PokemonMove(move)); + moveset.forEach((move, i) => { + pokemon.setMove(i, move); }); const movesetStr = moveset.map(moveId => MoveId[moveId]).join(", "); console.log(`Pokemon ${pokemon.species.name}'s moveset manually set to ${movesetStr} (=[${moveset.join(", ")}])!`); From 1f5e0898182d763617dcc3d3882b20235a8f683e Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sat, 2 Aug 2025 16:48:51 -0400 Subject: [PATCH 063/106] [Beta] Remove non-Legend Fresh Start option, fix starting movesets https://github.com/pagefaultgames/pokerogue/pull/6196 * Remove non-Legend fresh start option, fix starting movesets * Move updateInfo call * Fix relearns counting for starter moves * Reduce array allocations and function calls --- src/data/challenge.ts | 27 ++++++++++++++------------- src/phases/select-starter-phase.ts | 6 +++++- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index aaa82a7d20f..fd6528bb3bc 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -4,7 +4,6 @@ import { defaultStarterSpecies } from "#app/constants"; import { globalScene } from "#app/global-scene"; import { pokemonEvolutions } from "#balance/pokemon-evolutions"; import { speciesStarterCosts } from "#balance/starters"; -import { getEggTierForSpecies } from "#data/egg"; import { pokemonFormChanges } from "#data/pokemon-forms"; import type { PokemonSpecies } from "#data/pokemon-species"; import { getPokemonSpeciesForm } from "#data/pokemon-species"; @@ -12,7 +11,6 @@ import { BattleType } from "#enums/battle-type"; import { ChallengeType } from "#enums/challenge-type"; import { Challenges } from "#enums/challenges"; import { TypeColor, TypeShadow } from "#enums/color"; -import { EggTier } from "#enums/egg-type"; import { ClassicFixedBossWaves } from "#enums/fixed-boss-waves"; import { ModifierTier } from "#enums/modifier-tier"; import type { MoveId } from "#enums/move-id"; @@ -26,7 +24,7 @@ import type { Pokemon } from "#field/pokemon"; import { Trainer } from "#field/trainer"; import { PokemonMove } from "#moves/pokemon-move"; import type { DexAttrProps, GameData } from "#system/game-data"; -import { BooleanHolder, type NumberHolder, randSeedItem } from "#utils/common"; +import { BooleanHolder, isBetween, type NumberHolder, randSeedItem } from "#utils/common"; import { deepCopy } from "#utils/data"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import { toCamelCase, toSnakeCase } from "#utils/strings"; @@ -685,14 +683,11 @@ export class SingleTypeChallenge extends Challenge { */ export class FreshStartChallenge extends Challenge { constructor() { - super(Challenges.FRESH_START, 3); + super(Challenges.FRESH_START, 2); } applyStarterChoice(pokemon: PokemonSpecies, valid: BooleanHolder): boolean { - if ( - (this.value === 1 && !defaultStarterSpecies.includes(pokemon.speciesId)) || - (this.value === 2 && getEggTierForSpecies(pokemon) >= EggTier.EPIC) - ) { + if (this.value === 1 && !defaultStarterSpecies.includes(pokemon.speciesId)) { valid.value = false; return true; } @@ -708,12 +703,18 @@ export class FreshStartChallenge extends Challenge { pokemon.abilityIndex = pokemon.abilityIndex % 2; // Always base ability, if you set it to hidden it wraps to first ability pokemon.passive = false; // Passive isn't unlocked pokemon.nature = Nature.HARDY; // Neutral nature - pokemon.moveset = pokemon.species + let validMoves = pokemon.species .getLevelMoves() - .filter(m => m[0] <= 5) - .map(lm => lm[1]) - .slice(0, 4) - .map(m => new PokemonMove(m)); // No egg moves + .filter(m => isBetween(m[0], 1, 5)) + .map(lm => lm[1]); + // Filter egg moves out of the moveset + pokemon.moveset = pokemon.moveset.filter(pm => validMoves.includes(pm.moveId)); + if (pokemon.moveset.length < 4) { + // If there's empty slots fill with remaining valid moves + const existingMoveIds = pokemon.moveset.map(pm => pm.moveId); + validMoves = validMoves.filter(m => !existingMoveIds.includes(m)); + pokemon.moveset = pokemon.moveset.concat(validMoves.map(m => new PokemonMove(m))).slice(0, 4); + } pokemon.luck = 0; // No luck pokemon.shiny = false; // Not shiny pokemon.variant = 0; // Not shiny diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index 6456bacd0e3..d6bd252c77d 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -99,8 +99,12 @@ export class SelectStarterPhase extends Phase { starterPokemon.generateFusionSpecies(true); } starterPokemon.setVisible(false); - applyChallenges(ChallengeType.STARTER_MODIFY, starterPokemon); + const chalApplied = applyChallenges(ChallengeType.STARTER_MODIFY, starterPokemon); party.push(starterPokemon); + if (chalApplied) { + // If any challenges modified the starter, it should update + loadPokemonAssets.push(starterPokemon.updateInfo()); + } loadPokemonAssets.push(starterPokemon.loadAssets()); }); overrideModifiers(); From 957a3e5c24879c0df3ebca645529e01ff847f7df Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sat, 2 Aug 2025 17:29:35 -0400 Subject: [PATCH 064/106] [Misc] Move asset initialization from `preload` to `launchBattle` https://github.com/pagefaultgames/pokerogue/pull/6109 * Move asset initialization into `preload` instead of `launchBattle` * Fix init problems; remove unused `waitUntil` util function * Fixed missing `clearAllPhases` call --- src/battle-scene.ts | 36 +++++++------ test/misc.test.ts | 29 ----------- test/test-utils/game-manager-utils.ts | 11 ---- test/test-utils/game-manager.ts | 73 ++++++++++++++++----------- 4 files changed, 60 insertions(+), 89 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 1864de2c6f4..e5a63285ecc 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -380,9 +380,21 @@ export class BattleScene extends SceneBase { }; } - populateAnims(); + /** + * These moves serve as fallback animations for other moves without loaded animations, and + * must be loaded prior to game start. + */ + const defaultMoves = [MoveId.TACKLE, MoveId.TAIL_WHIP, MoveId.FOCUS_ENERGY, MoveId.STRUGGLE]; - await this.initVariantData(); + await Promise.all([ + populateAnims(), + this.initVariantData(), + initCommonAnims().then(() => loadCommonAnimAssets(true)), + Promise.all(defaultMoves.map(m => initMoveAnim(m))).then(() => loadMoveAnimAssets(defaultMoves, true)), + this.initStarterColors(), + ]).catch(reason => { + throw new Error(`Unexpected error during BattleScene preLoad!\nReason: ${reason}`); + }); } create() { @@ -584,8 +596,6 @@ export class BattleScene extends SceneBase { this.party = []; - const loadPokemonAssets = []; - this.arenaPlayer = new ArenaBase(true); this.arenaPlayer.setName("arena-player"); this.arenaPlayerTransition = new ArenaBase(true); @@ -640,26 +650,14 @@ export class BattleScene extends SceneBase { this.reset(false, false, true); + // Initialize UI-related aspects and then start the login phase. const ui = new UI(); this.uiContainer.add(ui); - this.ui = ui; - ui.setup(); - const defaultMoves = [MoveId.TACKLE, MoveId.TAIL_WHIP, MoveId.FOCUS_ENERGY, MoveId.STRUGGLE]; - - Promise.all([ - Promise.all(loadPokemonAssets), - initCommonAnims().then(() => loadCommonAnimAssets(true)), - Promise.all( - [MoveId.TACKLE, MoveId.TAIL_WHIP, MoveId.FOCUS_ENERGY, MoveId.STRUGGLE].map(m => initMoveAnim(m)), - ).then(() => loadMoveAnimAssets(defaultMoves, true)), - this.initStarterColors(), - ]).then(() => { - this.phaseManager.toTitleScreen(true); - this.phaseManager.shiftPhase(); - }); + this.phaseManager.toTitleScreen(true); + this.phaseManager.shiftPhase(); } initSession(): void { diff --git a/test/misc.test.ts b/test/misc.test.ts index 96407b78470..a77ac1f5c91 100644 --- a/test/misc.test.ts +++ b/test/misc.test.ts @@ -1,5 +1,4 @@ import { GameManager } from "#test/test-utils/game-manager"; -import { waitUntil } from "#test/test-utils/game-manager-utils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -36,19 +35,6 @@ describe("Test misc", () => { expect(spy).toHaveBeenCalled(); }); - // it.skip("test apifetch mock async", async () => { - // const spy = vi.fn(); - // await apiFetch("https://localhost:8080/account/info").then(response => { - // expect(response.status).toBe(200); - // expect(response.ok).toBe(true); - // return response.json(); - // }).then(data => { - // spy(); // Call the spy function - // expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 }); - // }); - // expect(spy).toHaveBeenCalled(); - // }); - it("test fetch mock sync", async () => { const response = await fetch("https://localhost:8080/account/info"); const data = await response.json(); @@ -62,19 +48,4 @@ describe("Test misc", () => { const data = await game.scene.cachedFetch("./battle-anims/splishy-splash.json"); expect(data).toBeDefined(); }); - - it("testing wait phase queue", async () => { - const fakeScene = { - phaseQueue: [1, 2, 3], // Initially not empty - }; - setTimeout(() => { - fakeScene.phaseQueue = []; - }, 500); - const spy = vi.fn(); - await waitUntil(() => fakeScene.phaseQueue.length === 0).then(result => { - expect(result).toBe(true); - spy(); // Call the spy function - }); - expect(spy).toHaveBeenCalled(); - }); }); diff --git a/test/test-utils/game-manager-utils.ts b/test/test-utils/game-manager-utils.ts index db758cfe64d..7bb8ea57469 100644 --- a/test/test-utils/game-manager-utils.ts +++ b/test/test-utils/game-manager-utils.ts @@ -87,17 +87,6 @@ function getTestRunStarters(seed: string, species?: SpeciesId[]): Starter[] { return starters; } -export function waitUntil(truth): Promise { - return new Promise(resolve => { - const interval = setInterval(() => { - if (truth()) { - clearInterval(interval); - resolve(true); - } - }, 1000); - }); -} - /** * Useful for populating party, wave index, etc. without having to spin up and run through an entire EncounterPhase */ diff --git a/test/test-utils/game-manager.ts b/test/test-utils/game-manager.ts index 23a2e6240f8..f952557bb69 100644 --- a/test/test-utils/game-manager.ts +++ b/test/test-utils/game-manager.ts @@ -31,7 +31,7 @@ import { TurnEndPhase } from "#phases/turn-end-phase"; import { TurnInitPhase } from "#phases/turn-init-phase"; import { TurnStartPhase } from "#phases/turn-start-phase"; import { ErrorInterceptor } from "#test/test-utils/error-interceptor"; -import { generateStarter, waitUntil } from "#test/test-utils/game-manager-utils"; +import { generateStarter } from "#test/test-utils/game-manager-utils"; import { GameWrapper } from "#test/test-utils/game-wrapper"; import { ChallengeModeHelper } from "#test/test-utils/helpers/challenge-mode-helper"; import { ClassicModeHelper } from "#test/test-utils/helpers/classic-mode-helper"; @@ -85,30 +85,22 @@ export class GameManager { constructor(phaserGame: Phaser.Game, bypassLogin = true) { localStorage.clear(); ErrorInterceptor.getInstance().clear(); - BattleScene.prototype.randBattleSeedInt = (range, min = 0) => min + range - 1; // This simulates a max roll + // Simulate max rolls on RNG functions + // TODO: Create helpers for disabling/enabling battle RNG + BattleScene.prototype.randBattleSeedInt = (range, min = 0) => min + range - 1; this.gameWrapper = new GameWrapper(phaserGame, bypassLogin); - let firstTimeScene = false; + // TODO: Figure out a way to optimize and re-use the same game manager for each test + // Re-use an existing `globalScene` if present, or else create a new scene from scratch. if (globalScene) { this.scene = globalScene; + this.phaseInterceptor = new PhaseInterceptor(this.scene); + this.resetScene(); } else { this.scene = new BattleScene(); + this.phaseInterceptor = new PhaseInterceptor(this.scene); this.gameWrapper.setScene(this.scene); - firstTimeScene = true; - } - - this.phaseInterceptor = new PhaseInterceptor(this.scene); - - if (!firstTimeScene) { - this.scene.reset(false, true); - (this.scene.ui.handlers[UiMode.STARTER_SELECT] as StarterSelectUiHandler).clearStarterPreferences(); - - // Must be run after phase interceptor has been initialized. - this.scene.phaseManager.toTitleScreen(true); - this.scene.phaseManager.shiftPhase(); - - this.gameWrapper.scene = this.scene; } this.textInterceptor = new TextInterceptor(this.scene); @@ -122,10 +114,30 @@ export class GameManager { this.modifiers = new ModifierHelper(this); this.field = new FieldHelper(this); + this.initDefaultOverrides(); + + // TODO: remove `any` assertion + global.fetch = vi.fn(MockFetch) as any; + } + + /** Reset a prior `BattleScene` instance to the proper initial state. */ + private resetScene(): void { + this.scene.reset(false, true); + (this.scene.ui.handlers[UiMode.STARTER_SELECT] as StarterSelectUiHandler).clearStarterPreferences(); + + this.gameWrapper.scene = this.scene; + + this.scene.phaseManager.toTitleScreen(true); + this.scene.phaseManager.shiftPhase(); + } + + /** + * Initialize various default overrides for starting tests, typically to alleviate randomness. + */ + // TODO: This should not be here + private initDefaultOverrides(): void { // Disables Mystery Encounters on all tests (can be overridden at test level) this.override.mysteryEncounterChance(0); - - global.fetch = vi.fn(MockFetch) as any; } /** @@ -141,15 +153,13 @@ export class GameManager { * @param mode - The mode to wait for. * @returns A promise that resolves when the mode is set. */ - waitMode(mode: UiMode): Promise { - return new Promise(async resolve => { - await waitUntil(() => this.scene.ui?.getMode() === mode); - return resolve(); - }); + // TODO: This is unused + async waitMode(mode: UiMode): Promise { + await vi.waitUntil(() => this.scene.ui?.getMode() === mode); } /** - * Ends the current phase. + * End the currently running phase immediately. */ endPhase() { this.scene.phaseManager.getCurrentPhase()?.end(); @@ -283,11 +293,14 @@ export class GameManager { .getPokemon() .getMoveset() [movePosition].getMove(); - if (!move.isMultiTarget()) { - handler.setCursor(targetIndex !== undefined ? targetIndex : BattlerIndex.ENEMY); - } - if (move.isMultiTarget() && targetIndex !== undefined) { - expect.fail(`targetIndex was passed to selectMove() but move ("${move.name}") is not targetted`); + + // Multi target attacks do not select a target + if (move.isMultiTarget()) { + if (targetIndex !== undefined) { + expect.fail(`targetIndex was passed to selectMove() but move ("${move.name}") is not targeted`); + } + } else { + handler.setCursor(targetIndex ?? BattlerIndex.ENEMY); } handler.processInput(Button.ACTION); }, From acb1f4184b2d6c4f5b3a2ecb7a5c3dffbd57e5da Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Sat, 2 Aug 2025 17:05:07 -0500 Subject: [PATCH 065/106] [Balance] Adjust Cosmog / Cosmoem Evolutions, Lower Buneary Friendship requirements (#6198) * Lower Buneary Friendship Requirement and Change Cosmog method * Update biomes.ts - Cosmog/Cosmoem wild evo levels * fix ? * fixed now * Update Cosmog Evolution + Biome Levels --------- Co-authored-by: damocleas --- src/data/balance/biomes.ts | 4 ++-- src/data/balance/pokemon-evolutions.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index f84a518fb65..1298e80c362 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1291,11 +1291,11 @@ export const biomePokemonPools: BiomePokemonPools = { [TimeOfDay.ALL]: [ { 1: [ SpeciesId.BELDUM ], 20: [ SpeciesId.METANG ], 45: [ SpeciesId.METAGROSS ] }, SpeciesId.SIGILYPH, { 1: [ SpeciesId.SOLOSIS ], 32: [ SpeciesId.DUOSION ], 41: [ SpeciesId.REUNICLUS ] } ] }, [BiomePoolTier.SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ SpeciesId.PORYGON ], 30: [ SpeciesId.PORYGON2 ] } ] }, - [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ SpeciesId.COSMOG ], 23: [ SpeciesId.COSMOEM ] }, SpeciesId.CELESTEELA ] }, + [BiomePoolTier.ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ { 1: [ SpeciesId.COSMOG ], 60: [ SpeciesId.COSMOEM ] }, SpeciesId.CELESTEELA ] }, [BiomePoolTier.BOSS]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ SpeciesId.SOLROCK ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [ SpeciesId.LUNATONE ], [TimeOfDay.ALL]: [ SpeciesId.CLEFABLE, SpeciesId.BRONZONG, SpeciesId.MUSHARNA, SpeciesId.REUNICLUS, SpeciesId.MINIOR ] }, [BiomePoolTier.BOSS_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ SpeciesId.METAGROSS, SpeciesId.PORYGON_Z ] }, [BiomePoolTier.BOSS_SUPER_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [], [TimeOfDay.ALL]: [ SpeciesId.CELESTEELA ] }, - [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ SpeciesId.SOLGALEO ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [ SpeciesId.LUNALA ], [TimeOfDay.ALL]: [ SpeciesId.RAYQUAZA, SpeciesId.NECROZMA ] } + [BiomePoolTier.BOSS_ULTRA_RARE]: { [TimeOfDay.DAWN]: [], [TimeOfDay.DAY]: [ { 1: [ SpeciesId.COSMOG ], 60: [ SpeciesId.COSMOEM ], 80: [ SpeciesId.SOLGALEO ] } ], [TimeOfDay.DUSK]: [], [TimeOfDay.NIGHT]: [ { 1: [ SpeciesId.COSMOG ], 60: [ SpeciesId.COSMOEM ], 80: [ SpeciesId.LUNALA ] } ], [TimeOfDay.ALL]: [ SpeciesId.RAYQUAZA, SpeciesId.NECROZMA ] } }, [BiomeId.CONSTRUCTION_SITE]: { [BiomePoolTier.COMMON]: { diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index c632889326d..5183146ffc1 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -1191,11 +1191,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(SpeciesId.KOMMO_O, 45, null, null) ], [SpeciesId.COSMOG]: [ - new SpeciesEvolution(SpeciesId.COSMOEM, 23, null, null) + new SpeciesEvolution(SpeciesId.COSMOEM, 1, null, {key: EvoCondKey.FRIENDSHIP, value: 40}, SpeciesWildEvolutionDelay.VERY_LONG) ], [SpeciesId.COSMOEM]: [ - new SpeciesEvolution(SpeciesId.SOLGALEO, 1, EvolutionItem.SUN_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesEvolution(SpeciesId.LUNALA, 1, EvolutionItem.MOON_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(SpeciesId.SOLGALEO, 23, EvolutionItem.SUN_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesEvolution(SpeciesId.LUNALA, 23, EvolutionItem.MOON_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [SpeciesId.MELTAN]: [ new SpeciesEvolution(SpeciesId.MELMETAL, 48, null, null) @@ -1824,7 +1824,7 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(SpeciesId.ROSELIA, 1, null, [{key: EvoCondKey.FRIENDSHIP, value: 70}, {key: EvoCondKey.TIME, time: [TimeOfDay.DAWN, TimeOfDay.DAY]}], SpeciesWildEvolutionDelay.SHORT) ], [SpeciesId.BUNEARY]: [ - new SpeciesEvolution(SpeciesId.LOPUNNY, 1, null, {key: EvoCondKey.FRIENDSHIP, value: 70}, SpeciesWildEvolutionDelay.MEDIUM) + new SpeciesEvolution(SpeciesId.LOPUNNY, 1, null, {key: EvoCondKey.FRIENDSHIP, value: 50}, SpeciesWildEvolutionDelay.MEDIUM) ], [SpeciesId.CHINGLING]: [ new SpeciesEvolution(SpeciesId.CHIMECHO, 1, null, [{key: EvoCondKey.FRIENDSHIP, value: 90}, {key: EvoCondKey.TIME, time: [TimeOfDay.DUSK, TimeOfDay.NIGHT]}], SpeciesWildEvolutionDelay.MEDIUM) From 5ed9e152abf3dc2dbe04f98ccb72aed889648fd3 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Sat, 2 Aug 2025 18:35:06 -0400 Subject: [PATCH 066/106] [Test] Port over + augment remaining test matchers from pkty (#6159) * Partially ported over pkty matchers (WIP) * Cleaned up some more matchers * Fiexd up matchers * Fixed up remaining matchers * Removed the word "matcher" from the pkty matcher functions If we want them back we can always undo this commit and convert the other custom ones * Added wip spite test * Added `toHaveUsedPP` matcher * Fixed up docs and tests * Fixed spite test * Ran biome * Apply Biome * Reverted biome breaking i18next * Update src/typings/i18next.d.ts comment * Fixed log message to not be overly verbose * Added option to check for all PP used in pp matcher + cleaned up grudge tests * Fixed up tests * Fixed tests and such * Fix various TSDocs + missing TSDoc imports --- biome.jsonc | 3 +- global.d.ts | 10 +- src/@types/helpers/type-helpers.ts | 9 + src/data/battler-tags.ts | 1 + src/typings/i18next.d.ts | 1 + src/typings/phaser/index.d.ts | 42 ++-- src/vite.env.d.ts | 18 +- test/@types/vitest.d.ts | 135 +++++++++++-- test/matchers.setup.ts | 26 +++ test/moves/grudge.test.ts | 71 ++++--- test/moves/spite.test.ts | 126 ++++++++++++ .../matchers/to-equal-array-unsorted.ts | 46 +++-- .../matchers/to-have-ability-applied.ts | 43 ++++ .../matchers/to-have-battler-tag.ts | 43 ++++ .../matchers/to-have-effective-stat.ts | 66 +++++++ test/test-utils/matchers/to-have-fainted.ts | 35 ++++ test/test-utils/matchers/to-have-full-hp.ts | 35 ++++ test/test-utils/matchers/to-have-hp.ts | 35 ++++ .../test-utils/matchers/to-have-stat-stage.ts | 53 +++++ .../matchers/to-have-status-effect.ts | 83 ++++++++ .../matchers/to-have-taken-damage.ts | 46 +++++ test/test-utils/matchers/to-have-terrain.ts | 62 ++++++ test/test-utils/matchers/to-have-types.ts | 55 +++--- test/test-utils/matchers/to-have-used-move.ts | 70 +++++++ test/test-utils/matchers/to-have-used-pp.ts | 77 ++++++++ test/test-utils/matchers/to-have-weather.ts | 62 ++++++ test/test-utils/string-utils.ts | 183 ++++++++++++++++++ test/test-utils/test-utils.ts | 53 +++++ test/types/type-helpers.test-d.ts | 38 ++++ 29 files changed, 1395 insertions(+), 132 deletions(-) create mode 100644 test/moves/spite.test.ts create mode 100644 test/test-utils/matchers/to-have-ability-applied.ts create mode 100644 test/test-utils/matchers/to-have-battler-tag.ts create mode 100644 test/test-utils/matchers/to-have-effective-stat.ts create mode 100644 test/test-utils/matchers/to-have-fainted.ts create mode 100644 test/test-utils/matchers/to-have-full-hp.ts create mode 100644 test/test-utils/matchers/to-have-hp.ts create mode 100644 test/test-utils/matchers/to-have-stat-stage.ts create mode 100644 test/test-utils/matchers/to-have-status-effect.ts create mode 100644 test/test-utils/matchers/to-have-taken-damage.ts create mode 100644 test/test-utils/matchers/to-have-terrain.ts create mode 100644 test/test-utils/matchers/to-have-used-move.ts create mode 100644 test/test-utils/matchers/to-have-used-pp.ts create mode 100644 test/test-utils/matchers/to-have-weather.ts create mode 100644 test/test-utils/string-utils.ts create mode 100644 test/types/type-helpers.test-d.ts diff --git a/biome.jsonc b/biome.jsonc index 470885a543d..d2f7c711dc9 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -19,7 +19,6 @@ // and having to verify whether each individual file is ignored "includes": [ "**", - "!**/*.d.ts", "!**/dist/**/*", "!**/build/**/*", "!**/coverage/**/*", @@ -180,7 +179,7 @@ // Overrides to prevent unused import removal inside `overrides.ts` and enums files (for TSDoc linkcodes), // as well as in all TS files in `scripts/` (which are assumed to be boilerplate templates). { - "includes": ["**/src/overrides.ts", "**/src/enums/**/*", "**/scripts/**/*.ts"], + "includes": ["**/src/overrides.ts", "**/src/enums/**/*", "**/scripts/**/*.ts", "**/*.d.ts"], "linter": { "rules": { "correctness": { diff --git a/global.d.ts b/global.d.ts index 27e96a4d8b5..8b79d966e3c 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1,7 +1,6 @@ +import type { AnyFn } from "#types/type-helpers"; import type { SetupServerApi } from "msw/node"; -export {}; - declare global { /** * Only used in testing. @@ -11,4 +10,11 @@ declare global { * To set up your own server in a test see `game-data.test.ts` */ var server: SetupServerApi; + + // Overloads for `Function.apply` and `Function.call` to add type safety on matching argument types + interface Function { + apply(this: T, thisArg: ThisParameterType, argArray: Parameters): ReturnType; + + call(this: T, thisArg: ThisParameterType, ...argArray: Parameters): ReturnType; + } } diff --git a/src/@types/helpers/type-helpers.ts b/src/@types/helpers/type-helpers.ts index 37f97fcf08c..7ad20b88956 100644 --- a/src/@types/helpers/type-helpers.ts +++ b/src/@types/helpers/type-helpers.ts @@ -94,3 +94,12 @@ export type AbstractConstructor = abstract new (...args: any[]) => T; export type CoerceNullPropertiesToUndefined = { [K in keyof T]: null extends T[K] ? Exclude | undefined : T[K]; }; + +/** + * Type helper to mark all properties in `T` as optional, while still mandating that at least 1 + * of its properties be present. + * + * Distinct from {@linkcode Partial} as this requires at least 1 property to _not_ be undefined. + * @typeParam T - The type to render partial + */ +export type AtLeastOne = Partial & ObjectValues<{ [K in keyof T]: Pick, K> }>; diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 2e06b213e28..2f540f5e1b9 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -3560,6 +3560,7 @@ export class GrudgeTag extends SerializableBattlerTag { * @param sourcePokemon - The source of the move that fainted the tag's bearer * @returns `false` if Grudge activates its effect or lapses */ + // TODO: Confirm whether this should interact with copying moves override lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType, sourcePokemon?: Pokemon): boolean { if (lapseType === BattlerTagLapseType.CUSTOM && sourcePokemon) { if (sourcePokemon.isActive() && pokemon.isOpponent(sourcePokemon)) { diff --git a/src/typings/i18next.d.ts b/src/typings/i18next.d.ts index 0eaa1e6ff0f..1e1695f6b9a 100644 --- a/src/typings/i18next.d.ts +++ b/src/typings/i18next.d.ts @@ -3,6 +3,7 @@ import type { TOptions } from "i18next"; // Module declared to make referencing keys in the localization files type-safe. declare module "i18next" { interface TFunction { + // biome-ignore lint/style/useShorthandFunctionType: This needs to be an interface due to interface merging (key: string | string[], options?: TOptions & Record): string; } } diff --git a/src/typings/phaser/index.d.ts b/src/typings/phaser/index.d.ts index 26fbcff75bd..caddaedfc59 100644 --- a/src/typings/phaser/index.d.ts +++ b/src/typings/phaser/index.d.ts @@ -1,7 +1,7 @@ import "phaser"; declare module "phaser" { - namespace GameObjects { + namespace GameObjects { interface GameObject { width: number; @@ -16,45 +16,45 @@ declare module "phaser" { y: number; } - interface Container { + interface Container { /** * Sets this object's position relative to another object with a given offset */ - setPositionRelative(guideObject: any, x: number, y: number): this; - } - interface Sprite { + setPositionRelative(guideObject: any, x: number, y: number): this; + } + interface Sprite { /** * Sets this object's position relative to another object with a given offset */ - setPositionRelative(guideObject: any, x: number, y: number): this; - } - interface Image { + setPositionRelative(guideObject: any, x: number, y: number): this; + } + interface Image { /** * Sets this object's position relative to another object with a given offset */ - setPositionRelative(guideObject: any, x: number, y: number): this; - } - interface NineSlice { + setPositionRelative(guideObject: any, x: number, y: number): this; + } + interface NineSlice { /** * Sets this object's position relative to another object with a given offset */ - setPositionRelative(guideObject: any, x: number, y: number): this; - } - interface Text { + setPositionRelative(guideObject: any, x: number, y: number): this; + } + interface Text { /** * Sets this object's position relative to another object with a given offset */ - setPositionRelative(guideObject: any, x: number, y: number): this; - } - interface Rectangle { + setPositionRelative(guideObject: any, x: number, y: number): this; + } + interface Rectangle { /** * Sets this object's position relative to another object with a given offset */ - setPositionRelative(guideObject: any, x: number, y: number): this; - } - } + setPositionRelative(guideObject: any, x: number, y: number): this; + } + } - namespace Input { + namespace Input { namespace Gamepad { interface GamepadPlugin { /** diff --git a/src/vite.env.d.ts b/src/vite.env.d.ts index a2acc658a10..68159908730 100644 --- a/src/vite.env.d.ts +++ b/src/vite.env.d.ts @@ -1,16 +1,16 @@ /// interface ImportMetaEnv { - readonly VITE_PORT?: string; - readonly VITE_BYPASS_LOGIN?: string; - readonly VITE_BYPASS_TUTORIAL?: string; - readonly VITE_API_BASE_URL?: string; - readonly VITE_SERVER_URL?: string; - readonly VITE_DISCORD_CLIENT_ID?: string; - readonly VITE_GOOGLE_CLIENT_ID?: string; - readonly VITE_I18N_DEBUG?: string; + readonly VITE_PORT?: string; + readonly VITE_BYPASS_LOGIN?: string; + readonly VITE_BYPASS_TUTORIAL?: string; + readonly VITE_API_BASE_URL?: string; + readonly VITE_SERVER_URL?: string; + readonly VITE_DISCORD_CLIENT_ID?: string; + readonly VITE_GOOGLE_CLIENT_ID?: string; + readonly VITE_I18N_DEBUG?: string; } interface ImportMeta { - readonly env: ImportMetaEnv + readonly env: ImportMetaEnv; } diff --git a/test/@types/vitest.d.ts b/test/@types/vitest.d.ts index 58b36580727..7b756c45a57 100644 --- a/test/@types/vitest.d.ts +++ b/test/@types/vitest.d.ts @@ -1,26 +1,139 @@ -import type { Pokemon } from "#field/pokemon"; +import type { TerrainType } from "#app/data/terrain"; +import type { AbilityId } from "#enums/ability-id"; +import type { BattlerTagType } from "#enums/battler-tag-type"; +import type { MoveId } from "#enums/move-id"; import type { PokemonType } from "#enums/pokemon-type"; -import type { expect } from "vitest"; +import type { BattleStat, EffectiveStat, Stat } from "#enums/stat"; +import type { StatusEffect } from "#enums/status-effect"; +import type { WeatherType } from "#enums/weather-type"; +import type { Pokemon } from "#field/pokemon"; +import type { ToHaveEffectiveStatMatcherOptions } from "#test/test-utils/matchers/to-have-effective-stat"; +import type { expectedStatusType } from "#test/test-utils/matchers/to-have-status-effect"; import type { toHaveTypesOptions } from "#test/test-utils/matchers/to-have-types"; +import type { TurnMove } from "#types/turn-move"; +import type { AtLeastOne } from "#types/type-helpers"; +import type { expect } from "vitest"; +import type Overrides from "#app/overrides"; +import type { PokemonMove } from "#moves/pokemon-move"; declare module "vitest" { interface Assertion { /** - * Matcher to check if an array contains EXACTLY the given items (in any order). + * Check whether an array contains EXACTLY the given items (in any order). * - * Different from {@linkcode expect.arrayContaining} as the latter only requires the array contain - * _at least_ the listed items. + * Different from {@linkcode expect.arrayContaining} as the latter only checks for subset equality + * (as opposed to full equality). * - * @param expected - The expected contents of the array, in any order. + * @param expected - The expected contents of the array, in any order * @see {@linkcode expect.arrayContaining} */ toEqualArrayUnsorted(expected: E[]): void; + /** - * Matcher to check if a {@linkcode Pokemon}'s current typing includes the given types. + * Check whether a {@linkcode Pokemon}'s current typing includes the given types. * - * @param expected - The expected types (in any order). - * @param options - The options passed to the matcher. + * @param expected - The expected types (in any order) + * @param options - The options passed to the matcher */ - toHaveTypes(expected: PokemonType[], options?: toHaveTypesOptions): void; + toHaveTypes(expected: [PokemonType, ...PokemonType[]], options?: toHaveTypesOptions): void; + + /** + * Matcher to check the contents of a {@linkcode Pokemon}'s move history. + * + * @param expectedValue - The expected value; can be a {@linkcode MoveId} or a partially filled {@linkcode TurnMove} + * containing the desired properties to check + * @param index - The index of the move history entry to check, in order from most recent to least recent. + * Default `0` (last used move) + * @see {@linkcode Pokemon.getLastXMoves} + */ + toHaveUsedMove(expected: MoveId | AtLeastOne, index?: number): void; + + /** + * Check whether a {@linkcode Pokemon}'s effective stat is as expected + * (checked after all stat value modifications). + * + * @param stat - The {@linkcode EffectiveStat} to check + * @param expectedValue - The expected value of {@linkcode stat} + * @param options - (Optional) The {@linkcode ToHaveEffectiveStatMatcherOptions} + * @remarks + * If you want to check the stat **before** modifiers are applied, use {@linkcode Pokemon.getStat} instead. + */ + toHaveEffectiveStat(stat: EffectiveStat, expectedValue: number, options?: ToHaveEffectiveStatMatcherOptions): void; + + /** + * Check whether a {@linkcode Pokemon} has taken a specific amount of damage. + * @param expectedDamageTaken - The expected amount of damage taken + * @param roundDown - Whether to round down {@linkcode expectedDamageTaken} with {@linkcode toDmgValue}; default `true` + */ + toHaveTakenDamage(expectedDamageTaken: number, roundDown?: boolean): void; + + /** + * Check whether the current {@linkcode WeatherType} is as expected. + * @param expectedWeatherType - The expected {@linkcode WeatherType} + */ + toHaveWeather(expectedWeatherType: WeatherType): void; + + /** + * Check whether the current {@linkcode TerrainType} is as expected. + * @param expectedTerrainType - The expected {@linkcode TerrainType} + */ + toHaveTerrain(expectedTerrainType: TerrainType): void; + + /** + * Check whether a {@linkcode Pokemon} is at full HP. + */ + toHaveFullHp(): void; + + /** + * Check whether a {@linkcode Pokemon} has a specific {@linkcode StatusEffect | non-volatile status effect}. + * @param expectedStatusEffect - The {@linkcode StatusEffect} the Pokemon is expected to have, + * or a partially filled {@linkcode Status} containing the desired properties + */ + toHaveStatusEffect(expectedStatusEffect: expectedStatusType): void; + + /** + * Check whether a {@linkcode Pokemon} has a specific {@linkcode Stat} stage. + * @param stat - The {@linkcode BattleStat} to check + * @param expectedStage - The expected stat stage value of {@linkcode stat} + */ + toHaveStatStage(stat: BattleStat, expectedStage: number): void; + + /** + * Check whether a {@linkcode Pokemon} has a specific {@linkcode BattlerTagType}. + * @param expectedBattlerTagType - The expected {@linkcode BattlerTagType} + */ + toHaveBattlerTag(expectedBattlerTagType: BattlerTagType): void; + + /** + * Check whether a {@linkcode Pokemon} has applied a specific {@linkcode AbilityId}. + * @param expectedAbilityId - The expected {@linkcode AbilityId} + */ + toHaveAbilityApplied(expectedAbilityId: AbilityId): void; + + /** + * Check whether a {@linkcode Pokemon} has a specific amount of {@linkcode Stat.HP | HP}. + * @param expectedHp - The expected amount of {@linkcode Stat.HP | HP} to have + */ + toHaveHp(expectedHp: number): void; + + /** + * Check whether a {@linkcode Pokemon} is currently fainted (as determined by {@linkcode Pokemon.isFainted}). + * @remarks + * When checking whether an enemy wild Pokemon is fainted, one must reference it in a variable _before_ the fainting effect occurs + * as otherwise the Pokemon will be GC'ed and rendered `undefined`. + */ + toHaveFainted(): void; + + /** + * Check whether a {@linkcode Pokemon} has consumed the given amount of PP for one of its moves. + * @param expectedValue - The {@linkcode MoveId} of the {@linkcode PokemonMove} that should have consumed PP + * @param ppUsed - The numerical amount of PP that should have been consumed, + * or `all` to indicate the move should be _out_ of PP + * @remarks + * If the Pokemon's moveset has been set via {@linkcode Overrides.MOVESET_OVERRIDE}/{@linkcode Overrides.OPP_MOVESET_OVERRIDE}, + * does not contain {@linkcode expectedMove} + * or contains the desired move more than once, this will fail the test. + */ + toHaveUsedPP(expectedMove: MoveId, ppUsed: number | "all"): void; } -} \ No newline at end of file +} diff --git a/test/matchers.setup.ts b/test/matchers.setup.ts index 03d9dd342e4..03b29302916 100644 --- a/test/matchers.setup.ts +++ b/test/matchers.setup.ts @@ -1,5 +1,18 @@ import { toEqualArrayUnsorted } from "#test/test-utils/matchers/to-equal-array-unsorted"; +import { toHaveAbilityApplied } from "#test/test-utils/matchers/to-have-ability-applied"; +import { toHaveBattlerTag } from "#test/test-utils/matchers/to-have-battler-tag"; +import { toHaveEffectiveStat } from "#test/test-utils/matchers/to-have-effective-stat"; +import { toHaveFainted } from "#test/test-utils/matchers/to-have-fainted"; +import { toHaveFullHp } from "#test/test-utils/matchers/to-have-full-hp"; +import { toHaveHp } from "#test/test-utils/matchers/to-have-hp"; +import { toHaveStatStage } from "#test/test-utils/matchers/to-have-stat-stage"; +import { toHaveStatusEffect } from "#test/test-utils/matchers/to-have-status-effect"; +import { toHaveTakenDamage } from "#test/test-utils/matchers/to-have-taken-damage"; +import { toHaveTerrain } from "#test/test-utils/matchers/to-have-terrain"; import { toHaveTypes } from "#test/test-utils/matchers/to-have-types"; +import { toHaveUsedMove } from "#test/test-utils/matchers/to-have-used-move"; +import { toHaveUsedPP } from "#test/test-utils/matchers/to-have-used-pp"; +import { toHaveWeather } from "#test/test-utils/matchers/to-have-weather"; import { expect } from "vitest"; /* @@ -10,4 +23,17 @@ import { expect } from "vitest"; expect.extend({ toEqualArrayUnsorted, toHaveTypes, + toHaveUsedMove, + toHaveEffectiveStat, + toHaveTakenDamage, + toHaveWeather, + toHaveTerrain, + toHaveFullHp, + toHaveStatusEffect, + toHaveStatStage, + toHaveBattlerTag, + toHaveAbilityApplied, + toHaveHp, + toHaveFainted, + toHaveUsedPP, }); diff --git a/test/moves/grudge.test.ts b/test/moves/grudge.test.ts index 6f5df077d9f..d9e2f4f8320 100644 --- a/test/moves/grudge.test.ts +++ b/test/moves/grudge.test.ts @@ -2,6 +2,7 @@ import { AbilityId } from "#enums/ability-id"; import { BattlerIndex } from "#enums/battler-index"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; +import { WeatherType } from "#enums/weather-type"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -23,68 +24,64 @@ describe("Moves - Grudge", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([MoveId.EMBER, MoveId.SPLASH]) .ability(AbilityId.BALL_FETCH) .battleStyle("single") .criticalHits(false) - .enemySpecies(SpeciesId.SHEDINJA) - .enemyAbility(AbilityId.WONDER_GUARD) - .enemyMoveset([MoveId.GRUDGE, MoveId.SPLASH]); + .enemySpecies(SpeciesId.RATTATA) + .startingLevel(100) + .enemyAbility(AbilityId.NO_GUARD); }); - it("should reduce the PP of the Pokemon's move to 0 when the user has fainted", async () => { + it("should reduce the PP of an attack that faints the user to 0", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const playerPokemon = game.scene.getPlayerPokemon(); - game.move.select(MoveId.EMBER); - await game.move.selectEnemyMove(MoveId.GRUDGE); + const feebas = game.field.getPlayerPokemon(); + const ratatta = game.field.getEnemyPokemon(); + + game.move.use(MoveId.GUILLOTINE); + await game.move.forceEnemyMove(MoveId.GRUDGE); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); - await game.phaseInterceptor.to("BerryPhase"); + await game.phaseInterceptor.to("FaintPhase"); - const playerMove = playerPokemon?.getMoveset().find(m => m.moveId === MoveId.EMBER); - - expect(playerMove?.getPpRatio()).toBe(0); + // Ratatta should have fainted and consumed all of Guillotine's PP + expect(ratatta).toHaveFainted(); + expect(feebas).toHaveUsedPP(MoveId.GUILLOTINE, "all"); }); it("should remain in effect until the user's next move", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const playerPokemon = game.scene.getPlayerPokemon(); - game.move.select(MoveId.SPLASH); - await game.move.selectEnemyMove(MoveId.GRUDGE); + const feebas = game.field.getPlayerPokemon(); + const ratatta = game.field.getEnemyPokemon(); + + game.move.use(MoveId.SPLASH); + await game.move.forceEnemyMove(MoveId.GRUDGE); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); - game.move.select(MoveId.EMBER); - await game.move.selectEnemyMove(MoveId.SPLASH); + game.move.use(MoveId.GUILLOTINE); + await game.move.forceEnemyMove(MoveId.SPLASH); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); - await game.phaseInterceptor.to("BerryPhase"); + await game.toEndOfTurn(); - const playerMove = playerPokemon?.getMoveset().find(m => m.moveId === MoveId.EMBER); - - expect(playerMove?.getPpRatio()).toBe(0); + expect(ratatta).toHaveFainted(); + expect(feebas).toHaveUsedPP(MoveId.GUILLOTINE, "all"); }); - it("should not reduce the opponent's PP if the user dies to weather/indirect damage", async () => { + it("should not reduce PP if the user dies to weather/indirect damage", async () => { // Opponent will be reduced to 1 HP by False Swipe, then faint to Sandstorm - game.override - .moveset([MoveId.FALSE_SWIPE]) - .startingLevel(100) - .ability(AbilityId.SAND_STREAM) - .enemySpecies(SpeciesId.RATTATA); - await game.classicMode.startBattle([SpeciesId.GEODUDE]); + game.override.weather(WeatherType.SANDSTORM); + await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon = game.scene.getPlayerPokemon(); + const feebas = game.field.getPlayerPokemon(); + const ratatta = game.field.getEnemyPokemon(); - game.move.select(MoveId.FALSE_SWIPE); - await game.move.selectEnemyMove(MoveId.GRUDGE); + game.move.use(MoveId.FALSE_SWIPE); + await game.move.forceEnemyMove(MoveId.GRUDGE); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); - await game.phaseInterceptor.to("BerryPhase"); + await game.toEndOfTurn(); - expect(enemyPokemon?.isFainted()).toBe(true); - - const playerMove = playerPokemon?.getMoveset().find(m => m.moveId === MoveId.FALSE_SWIPE); - expect(playerMove?.getPpRatio()).toBeGreaterThan(0); + expect(ratatta).toHaveFainted(); + expect(feebas).toHaveUsedPP(MoveId.FALSE_SWIPE, 1); }); }); diff --git a/test/moves/spite.test.ts b/test/moves/spite.test.ts new file mode 100644 index 00000000000..56c1be76198 --- /dev/null +++ b/test/moves/spite.test.ts @@ -0,0 +1,126 @@ +import { AbilityId } from "#enums/ability-id"; +import { BattlerIndex } from "#enums/battler-index"; +import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; +import { MoveUseMode } from "#enums/move-use-mode"; +import { SpeciesId } from "#enums/species-id"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Spite", () => { + 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 + .ability(AbilityId.BALL_FETCH) + .battleStyle("single") + .criticalHits(false) + .enemySpecies(SpeciesId.MAGIKARP) + .enemyAbility(AbilityId.BALL_FETCH) + .startingLevel(100) + .enemyLevel(100); + }); + + it("should reduce the PP of the target's last used move by 4", async () => { + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const karp = game.field.getEnemyPokemon(); + game.move.changeMoveset(karp, [MoveId.SPLASH, MoveId.TACKLE]); + + game.move.use(MoveId.SPITE); + await game.move.selectEnemyMove(MoveId.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toNextTurn(); + + expect(karp).toHaveUsedPP(MoveId.TACKLE, 1); + + game.move.use(MoveId.SPITE); + await game.move.selectEnemyMove(MoveId.SPLASH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toEndOfTurn(); + + expect(karp).toHaveUsedPP(MoveId.TACKLE, 4 + 1); + }); + + it("should fail if the target has not used a move", async () => { + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const karp = game.field.getEnemyPokemon(); + game.move.changeMoveset(karp, [MoveId.SPLASH, MoveId.TACKLE]); + + game.move.use(MoveId.SPITE); + await game.move.selectEnemyMove(MoveId.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toEndOfTurn(); + + const feebas = game.field.getPlayerPokemon(); + expect(feebas).toHaveUsedMove({ move: MoveId.SPITE, result: MoveResult.FAIL }); + }); + + it("should fail if the target's last used move is out of PP", async () => { + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const karp = game.field.getEnemyPokemon(); + game.move.changeMoveset(karp, [MoveId.TACKLE]); + karp.moveset[0].ppUsed = 0; + + game.move.use(MoveId.SPITE); + await game.move.selectEnemyMove(MoveId.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toEndOfTurn(); + + const feebas = game.field.getPlayerPokemon(); + expect(feebas).toHaveUsedMove({ move: MoveId.SPITE, result: MoveResult.FAIL }); + }); + + it("should fail if the target's last used move is not in their moveset", async () => { + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const karp = game.field.getEnemyPokemon(); + game.move.changeMoveset(karp, [MoveId.TACKLE]); + // Fake magikarp having used Splash the turn prior + karp.pushMoveHistory({ move: MoveId.SPLASH, targets: [BattlerIndex.ENEMY], useMode: MoveUseMode.NORMAL }); + + game.move.use(MoveId.SPITE); + await game.move.selectEnemyMove(MoveId.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + await game.toEndOfTurn(); + + const feebas = game.field.getPlayerPokemon(); + expect(feebas).toHaveUsedMove({ move: MoveId.SPITE, result: MoveResult.FAIL }); + }); + + it("should ignore virtual and Dancer-induced moves", async () => { + game.override.battleStyle("double").enemyAbility(AbilityId.DANCER); + game.move.forceMetronomeMove(MoveId.SPLASH); + await game.classicMode.startBattle([SpeciesId.FEEBAS]); + + const [karp1, karp2] = game.scene.getEnemyField(); + game.move.changeMoveset(karp1, [MoveId.SPLASH, MoveId.METRONOME, MoveId.SWORDS_DANCE]); + game.move.changeMoveset(karp2, [MoveId.SWORDS_DANCE, MoveId.TACKLE]); + + game.move.use(MoveId.SPITE); + await game.move.selectEnemyMove(MoveId.METRONOME); + await game.move.selectEnemyMove(MoveId.SWORDS_DANCE); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.ENEMY_2, BattlerIndex.PLAYER]); + await game.toEndOfTurn(); + + // Spite ignored virtual splash and swords dance, instead only docking from metronome + expect(karp1).toHaveUsedPP(MoveId.SPLASH, 0); + expect(karp1).toHaveUsedPP(MoveId.SWORDS_DANCE, 0); + expect(karp1).toHaveUsedPP(MoveId.METRONOME, 5); + }); +}); diff --git a/test/test-utils/matchers/to-equal-array-unsorted.ts b/test/test-utils/matchers/to-equal-array-unsorted.ts index 0627623bbd9..846ea9e7779 100644 --- a/test/test-utils/matchers/to-equal-array-unsorted.ts +++ b/test/test-utils/matchers/to-equal-array-unsorted.ts @@ -1,43 +1,47 @@ +import { getOnelineDiffStr } from "#test/test-utils/string-utils"; import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; /** - * Matcher to check if an array contains exactly the given items, disregarding order. - * @param received - The object to check. Should be an array of elements. - * @returns The result of the matching + * Matcher that checks if an array contains exactly the given items, disregarding order. + * @param received - The received value. Should be an array of elements + * @param expected - The array to check equality with + * @returns Whether the matcher passed */ -export function toEqualArrayUnsorted(this: MatcherState, received: unknown, expected: unknown): SyncExpectationResult { +export function toEqualArrayUnsorted( + this: MatcherState, + received: unknown, + expected: unknown[], +): SyncExpectationResult { if (!Array.isArray(received)) { return { - pass: this.isNot, + pass: false, message: () => `Expected an array, but got ${this.utils.stringify(received)}!`, }; } - if (!Array.isArray(expected)) { - return { - pass: this.isNot, - message: () => `Expected to recieve an array, but got ${this.utils.stringify(expected)}!`, - }; - } - if (received.length !== expected.length) { return { - pass: this.isNot, - message: () => `Expected to recieve array of length ${received.length}, but got ${expected.length}!`, + pass: false, + message: () => `Expected to receive array of length ${received.length}, but got ${expected.length} instead!`, actual: received, expected, }; } - const gotSorted = received.slice().sort(); - const wantSorted = expected.slice().sort(); - const pass = this.equals(gotSorted, wantSorted, [...this.customTesters, this.utils.iterableEquality]); + const actualSorted = received.slice().sort(); + const expectedSorted = expected.slice().sort(); + const pass = this.equals(actualSorted, expectedSorted, [...this.customTesters, this.utils.iterableEquality]); + + const actualStr = getOnelineDiffStr.call(this, actualSorted); + const expectedStr = getOnelineDiffStr.call(this, expectedSorted); return { - pass: this.isNot !== pass, + pass, message: () => - `Expected ${this.utils.stringify(received)} to exactly equal ${this.utils.stringify(expected)} without order!`, - actual: gotSorted, - expected: wantSorted, + pass + ? `Expected ${actualStr} to NOT exactly equal ${expectedStr} without order, but it did!` + : `Expected ${actualStr} to exactly equal ${expectedStr} without order, but it didn't!`, + expected: expectedSorted, + actual: actualSorted, }; } diff --git a/test/test-utils/matchers/to-have-ability-applied.ts b/test/test-utils/matchers/to-have-ability-applied.ts new file mode 100644 index 00000000000..a3921e6371c --- /dev/null +++ b/test/test-utils/matchers/to-have-ability-applied.ts @@ -0,0 +1,43 @@ +/* biome-ignore-start lint/correctness/noUnusedImports: tsdoc imports */ +import type { Pokemon } from "#field/pokemon"; +/* biome-ignore-end lint/correctness/noUnusedImports: tsdoc imports */ + +import { getPokemonNameWithAffix } from "#app/messages"; +import { AbilityId } from "#enums/ability-id"; +import { getEnumStr } from "#test/test-utils/string-utils"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if a {@linkcode Pokemon} has applied a specific {@linkcode AbilityId}. + * @param received - The object to check. Should be a {@linkcode Pokemon} + * @param expectedAbility - The {@linkcode AbilityId} to check for + * @returns Whether the matcher passed + */ +export function toHaveAbilityApplied( + this: MatcherState, + received: unknown, + expectedAbilityId: AbilityId, +): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to recieve a Pokemon, but got ${receivedStr(received)}!`, + }; + } + + const pass = received.waveData.abilitiesApplied.has(expectedAbilityId); + + const pkmName = getPokemonNameWithAffix(received); + const expectedAbilityStr = getEnumStr(AbilityId, expectedAbilityId); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have applied ${expectedAbilityStr}, but it did!` + : `Expected ${pkmName} to have applied ${expectedAbilityStr}, but it didn't!`, + expected: expectedAbilityId, + actual: received.waveData.abilitiesApplied, + }; +} diff --git a/test/test-utils/matchers/to-have-battler-tag.ts b/test/test-utils/matchers/to-have-battler-tag.ts new file mode 100644 index 00000000000..af405d7da39 --- /dev/null +++ b/test/test-utils/matchers/to-have-battler-tag.ts @@ -0,0 +1,43 @@ +/* biome-ignore-start lint/correctness/noUnusedImports: tsdoc imports */ +import type { Pokemon } from "#field/pokemon"; +/* biome-ignore-end lint/correctness/noUnusedImports: tsdoc imports */ + +import { getPokemonNameWithAffix } from "#app/messages"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { getEnumStr } from "#test/test-utils/string-utils"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if a {@linkcode Pokemon} has a specific {@linkcode BattlerTagType}. + * @param received - The object to check. Should be a {@linkcode Pokemon} + * @param expectedBattlerTagType - The {@linkcode BattlerTagType} to check for + * @returns Whether the matcher passed + */ +export function toHaveBattlerTag( + this: MatcherState, + received: unknown, + expectedBattlerTagType: BattlerTagType, +): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: this.isNot, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + const pass = !!received.getTag(expectedBattlerTagType); + const pkmName = getPokemonNameWithAffix(received); + // "BattlerTagType.SEEDED (=1)" + const expectedTagStr = getEnumStr(BattlerTagType, expectedBattlerTagType, { prefix: "BattlerTagType." }); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have ${expectedTagStr}, but it did!` + : `Expected ${pkmName} to have ${expectedTagStr}, but it didn't!`, + expected: expectedBattlerTagType, + actual: received.summonData.tags.map(t => t.tagType), + }; +} diff --git a/test/test-utils/matchers/to-have-effective-stat.ts b/test/test-utils/matchers/to-have-effective-stat.ts new file mode 100644 index 00000000000..bc10a646c02 --- /dev/null +++ b/test/test-utils/matchers/to-have-effective-stat.ts @@ -0,0 +1,66 @@ +import { getPokemonNameWithAffix } from "#app/messages"; +import type { EffectiveStat } from "#enums/stat"; +import type { Pokemon } from "#field/pokemon"; +import type { Move } from "#moves/move"; +import { getStatName } from "#test/test-utils/string-utils"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +export interface ToHaveEffectiveStatMatcherOptions { + /** + * The target {@linkcode Pokemon} + * @see {@linkcode Pokemon.getEffectiveStat} + */ + enemy?: Pokemon; + /** + * The {@linkcode Move} being used + * @see {@linkcode Pokemon.getEffectiveStat} + */ + move?: Move; + /** + * Whether a critical hit occurred or not + * @see {@linkcode Pokemon.getEffectiveStat} + * @defaultValue `false` + */ + isCritical?: boolean; +} + +/** + * Matcher that checks if a {@linkcode Pokemon}'s effective stat equals a certain value. + * @param received - The object to check. Should be a {@linkcode Pokemon} + * @param stat - The {@linkcode EffectiveStat} to check + * @param expectedValue - The expected value of the {@linkcode stat} + * @param options - The {@linkcode ToHaveEffectiveStatMatcherOptions} + * @returns Whether the matcher passed + */ +export function toHaveEffectiveStat( + this: MatcherState, + received: unknown, + stat: EffectiveStat, + expectedValue: number, + { enemy, move, isCritical = false }: ToHaveEffectiveStatMatcherOptions = {}, +): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + // TODO: Change once getEffectiveStat is refactored to take an object literal + const actualValue = received.getEffectiveStat(stat, enemy, move, undefined, undefined, undefined, isCritical); + const pass = actualValue === expectedValue; + + const pkmName = getPokemonNameWithAffix(received); + const statName = getStatName(stat); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have ${expectedValue} ${statName}, but it did!` + : `Expected ${pkmName} to have ${expectedValue} ${statName}, but got ${actualValue} instead!`, + expected: expectedValue, + actual: actualValue, + }; +} diff --git a/test/test-utils/matchers/to-have-fainted.ts b/test/test-utils/matchers/to-have-fainted.ts new file mode 100644 index 00000000000..73ca96a31b5 --- /dev/null +++ b/test/test-utils/matchers/to-have-fainted.ts @@ -0,0 +1,35 @@ +import { getPokemonNameWithAffix } from "#app/messages"; +// biome-ignore lint/correctness/noUnusedImports: TSDoc +import type { Pokemon } from "#field/pokemon"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if a {@linkcode Pokemon} has fainted. + * @param received - The object to check. Should be a {@linkcode Pokemon} + * @returns Whether the matcher passed + */ +export function toHaveFainted(this: MatcherState, received: unknown): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + const pass = received.isFainted(); + + const hp = received.hp; + const maxHp = received.getMaxHp(); + const pkmName = getPokemonNameWithAffix(received); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have fainted, but it did!` + : `Expected ${pkmName} to have fainted, but it didn't! (${hp}/${maxHp} HP)`, + expected: 0, + actual: hp, + }; +} diff --git a/test/test-utils/matchers/to-have-full-hp.ts b/test/test-utils/matchers/to-have-full-hp.ts new file mode 100644 index 00000000000..3d7c8f9458d --- /dev/null +++ b/test/test-utils/matchers/to-have-full-hp.ts @@ -0,0 +1,35 @@ +import { getPokemonNameWithAffix } from "#app/messages"; +// biome-ignore lint/correctness/noUnusedImports: TSDoc +import type { Pokemon } from "#field/pokemon"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if a {@linkcode Pokemon} is at full hp. + * @param received - The object to check. Should be a {@linkcode Pokemon}. + * @returns Whether the matcher passed + */ +export function toHaveFullHp(this: MatcherState, received: unknown): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + const pass = received.isFullHp(); + + const hp = received.hp; + const maxHp = received.getMaxHp(); + const pkmName = getPokemonNameWithAffix(received); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have full hp, but it did!` + : `Expected ${pkmName} to have full hp, but it didn't! (${hp}/${maxHp} HP)`, + expected: maxHp, + actual: hp, + }; +} diff --git a/test/test-utils/matchers/to-have-hp.ts b/test/test-utils/matchers/to-have-hp.ts new file mode 100644 index 00000000000..20d171b23ce --- /dev/null +++ b/test/test-utils/matchers/to-have-hp.ts @@ -0,0 +1,35 @@ +import { getPokemonNameWithAffix } from "#app/messages"; +// biome-ignore lint/correctness/noUnusedImports: TSDoc +import type { Pokemon } from "#field/pokemon"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if a Pokemon has a specific amount of HP. + * @param received - The object to check. Should be a {@linkcode Pokemon}. + * @param expectedHp - The expected amount of HP the {@linkcode Pokemon} has + * @returns Whether the matcher passed + */ +export function toHaveHp(this: MatcherState, received: unknown, expectedHp: number): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + const actualHp = received.hp; + const pass = actualHp === expectedHp; + + const pkmName = getPokemonNameWithAffix(received); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have ${expectedHp} HP, but it did!` + : `Expected ${pkmName} to have ${expectedHp} HP, but got ${actualHp} HP instead!`, + expected: expectedHp, + actual: actualHp, + }; +} diff --git a/test/test-utils/matchers/to-have-stat-stage.ts b/test/test-utils/matchers/to-have-stat-stage.ts new file mode 100644 index 00000000000..feecd650bef --- /dev/null +++ b/test/test-utils/matchers/to-have-stat-stage.ts @@ -0,0 +1,53 @@ +/** biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports */ +import type { Pokemon } from "#field/pokemon"; +/** biome-ignore-end lint/correctness/noUnusedImports: TSDoc imports */ + +import { getPokemonNameWithAffix } from "#app/messages"; +import type { BattleStat } from "#enums/stat"; +import { getStatName } from "#test/test-utils/string-utils"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if a Pokemon has a specific {@linkcode BattleStat | Stat} stage. + * @param received - The object to check. Should be a {@linkcode Pokemon}. + * @param stat - The {@linkcode BattleStat | Stat} to check + * @param expectedStage - The expected numerical value of {@linkcode stat}; should be within the range `[-6, 6]` + * @returns Whether the matcher passed + */ +export function toHaveStatStage( + this: MatcherState, + received: unknown, + stat: BattleStat, + expectedStage: number, +): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + if (expectedStage < -6 || expectedStage > 6) { + return { + pass: false, + message: () => `Expected ${expectedStage} to be within the range [-6, 6]!`, + }; + } + + const actualStage = received.getStatStage(stat); + const pass = actualStage === expectedStage; + + const pkmName = getPokemonNameWithAffix(received); + const statName = getStatName(stat); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName}'s ${statName} stat stage to NOT be ${expectedStage}, but it was!` + : `Expected ${pkmName}'s ${statName} stat stage to be ${expectedStage}, but got ${actualStage} instead!`, + expected: expectedStage, + actual: actualStage, + }; +} diff --git a/test/test-utils/matchers/to-have-status-effect.ts b/test/test-utils/matchers/to-have-status-effect.ts new file mode 100644 index 00000000000..a46800632f3 --- /dev/null +++ b/test/test-utils/matchers/to-have-status-effect.ts @@ -0,0 +1,83 @@ +/* biome-ignore-start lint/correctness/noUnusedImports: tsdoc imports */ +import type { Status } from "#data/status-effect"; +import type { Pokemon } from "#field/pokemon"; +/* biome-ignore-end lint/correctness/noUnusedImports: tsdoc imports */ + +import { getPokemonNameWithAffix } from "#app/messages"; +import { StatusEffect } from "#enums/status-effect"; +import { getEnumStr, getOnelineDiffStr } from "#test/test-utils/string-utils"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +export type expectedStatusType = + | StatusEffect + | { effect: StatusEffect.TOXIC; toxicTurnCount: number } + | { effect: StatusEffect.SLEEP; sleepTurnsRemaining: number }; + +/** + * Matcher that checks if a Pokemon's {@linkcode StatusEffect} is as expected + * @param received - The actual value received. Should be a {@linkcode Pokemon} + * @param expectedStatus - The {@linkcode StatusEffect} the Pokemon is expected to have, + * or a partially filled {@linkcode Status} containing the desired properties + * @returns Whether the matcher passed + */ +export function toHaveStatusEffect( + this: MatcherState, + received: unknown, + expectedStatus: expectedStatusType, +): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + const pkmName = getPokemonNameWithAffix(received); + const actualEffect = received.status?.effect ?? StatusEffect.NONE; + + // Check exclusively effect equality first, coercing non-matching status effects to numbers. + if (actualEffect !== (expectedStatus as Exclude)?.effect) { + // This is actually 100% safe as `expectedStatus?.effect` will evaluate to `undefined` if a StatusEffect was passed, + // which will never match actualEffect by definition + expectedStatus = (expectedStatus as Exclude).effect; + } + + if (typeof expectedStatus === "number") { + const pass = this.equals(actualEffect, expectedStatus, [...this.customTesters, this.utils.iterableEquality]); + + const actualStr = getEnumStr(StatusEffect, actualEffect, { prefix: "StatusEffect." }); + const expectedStr = getEnumStr(StatusEffect, expectedStatus, { prefix: "StatusEffect." }); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have ${expectedStr}, but it did!` + : `Expected ${pkmName} to have status effect ${expectedStr}, but got ${actualStr} instead!`, + expected: expectedStatus, + actual: actualEffect, + }; + } + + // Check for equality of all fields (for toxic turn count/etc) + const actualStatus = received.status; + const pass = this.equals(received, expectedStatus, [ + ...this.customTesters, + this.utils.subsetEquality, + this.utils.iterableEquality, + ]); + + const expectedStr = getOnelineDiffStr.call(this, expectedStatus); + const actualStr = getOnelineDiffStr.call(this, actualStatus); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName}'s status to NOT match ${expectedStr}, but it did!` + : `Expected ${pkmName}'s status to match ${expectedStr}, but got ${actualStr} instead!`, + expected: expectedStatus, + actual: actualStatus, + }; +} diff --git a/test/test-utils/matchers/to-have-taken-damage.ts b/test/test-utils/matchers/to-have-taken-damage.ts new file mode 100644 index 00000000000..77c60ae836a --- /dev/null +++ b/test/test-utils/matchers/to-have-taken-damage.ts @@ -0,0 +1,46 @@ +/** biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports */ +import type { Pokemon } from "#field/pokemon"; +/** biome-ignore-end lint/correctness/noUnusedImports: TSDoc imports */ + +import { getPokemonNameWithAffix } from "#app/messages"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import { toDmgValue } from "#utils/common"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if a Pokemon has taken a specific amount of damage. + * Unless specified, will run the expected damage value through {@linkcode toDmgValue} + * to round it down and make it a minimum of 1. + * @param received - The object to check. Should be a {@linkcode Pokemon}. + * @param expectedDamageTaken - The expected amount of damage the {@linkcode Pokemon} has taken + * @param roundDown - Whether to round down {@linkcode expectedDamageTaken} with {@linkcode toDmgValue}; default `true` + * @returns Whether the matcher passed + */ +export function toHaveTakenDamage( + this: MatcherState, + received: unknown, + expectedDamageTaken: number, + roundDown = true, +): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + const expectedDmgValue = roundDown ? toDmgValue(expectedDamageTaken) : expectedDamageTaken; + const actualDmgValue = received.getInverseHp(); + const pass = actualDmgValue === expectedDmgValue; + const pkmName = getPokemonNameWithAffix(received); + + return { + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have taken ${expectedDmgValue} damage, but it did!` + : `Expected ${pkmName} to have taken ${expectedDmgValue} damage, but got ${actualDmgValue} instead!`, + expected: expectedDmgValue, + actual: actualDmgValue, + }; +} diff --git a/test/test-utils/matchers/to-have-terrain.ts b/test/test-utils/matchers/to-have-terrain.ts new file mode 100644 index 00000000000..292c32abafc --- /dev/null +++ b/test/test-utils/matchers/to-have-terrain.ts @@ -0,0 +1,62 @@ +/** biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports */ +import type { GameManager } from "#test/test-utils/game-manager"; +/** biome-ignore-end lint/correctness/noUnusedImports: TSDoc imports */ + +import { TerrainType } from "#app/data/terrain"; +import { getEnumStr } from "#test/test-utils/string-utils"; +import { isGameManagerInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if the {@linkcode TerrainType} is as expected + * @param received - The object to check. Should be an instance of {@linkcode GameManager}. + * @param expectedTerrainType - The expected {@linkcode TerrainType}, or {@linkcode TerrainType.NONE} if no terrain should be active + * @returns Whether the matcher passed + */ +export function toHaveTerrain( + this: MatcherState, + received: unknown, + expectedTerrainType: TerrainType, +): SyncExpectationResult { + if (!isGameManagerInstance(received)) { + return { + pass: false, + message: () => `Expected GameManager, but got ${receivedStr(received)}!`, + }; + } + + if (!received.scene?.arena) { + return { + pass: false, + message: () => `Expected GameManager.${received.scene ? "scene" : "scene.arena"} to be defined!`, + }; + } + + const actual = received.scene.arena.getTerrainType(); + const pass = actual === expectedTerrainType; + const actualStr = toTerrainStr(actual); + const expectedStr = toTerrainStr(expectedTerrainType); + + return { + pass, + message: () => + pass + ? `Expected Arena to NOT have ${expectedStr} active, but it did!` + : `Expected Arena to have ${expectedStr} active, but got ${actualStr} instead!`, + expected: expectedTerrainType, + actual, + }; +} + +/** + * Get a human readable string of the current {@linkcode TerrainType}. + * @param terrainType - The {@linkcode TerrainType} to transform + * @returns A human readable string + */ +function toTerrainStr(terrainType: TerrainType) { + if (terrainType === TerrainType.NONE) { + return "no terrain"; + } + // "Electric Terrain (=2)" + return getEnumStr(TerrainType, terrainType, { casing: "Title", suffix: " Terrain" }); +} diff --git a/test/test-utils/matchers/to-have-types.ts b/test/test-utils/matchers/to-have-types.ts index d09f4fc5f76..3f16f740583 100644 --- a/test/test-utils/matchers/to-have-types.ts +++ b/test/test-utils/matchers/to-have-types.ts @@ -1,6 +1,9 @@ +import { getPokemonNameWithAffix } from "#app/messages"; import { PokemonType } from "#enums/pokemon-type"; -import { Pokemon } from "#field/pokemon"; +import type { Pokemon } from "#field/pokemon"; +import { stringifyEnumArray } from "#test/test-utils/string-utils"; import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; +import { isPokemonInstance, receivedStr } from "../test-utils"; export interface toHaveTypesOptions { /** @@ -15,7 +18,7 @@ export interface toHaveTypesOptions { } /** - * Matcher to check if an array contains exactly the given items, disregarding order. + * Matcher that checks if an array contains exactly the given items, disregarding order. * @param received - The object to check. Should be an array of one or more {@linkcode PokemonType}s. * @param options - The {@linkcode toHaveTypesOptions | options} for this matcher * @returns The result of the matching @@ -23,42 +26,36 @@ export interface toHaveTypesOptions { export function toHaveTypes( this: MatcherState, received: unknown, - expected: unknown, + expected: [PokemonType, ...PokemonType[]], options: toHaveTypesOptions = {}, ): SyncExpectationResult { - if (!(received instanceof Pokemon)) { + if (!isPokemonInstance(received)) { return { - pass: this.isNot, - message: () => `Expected a Pokemon, but got ${this.utils.stringify(received)}!`, + pass: false, + message: () => `Expected to recieve a Pokémon, but got ${receivedStr(received)}!`, }; } - if (!Array.isArray(expected) || expected.length === 0) { - return { - pass: this.isNot, - message: () => `Expected to recieve an array with length >=1, but got ${this.utils.stringify(expected)}!`, - }; - } + const actualTypes = received.getTypes(...(options.args ?? [])).sort(); + const expectedTypes = expected.slice().sort(); - if (!expected.every((t): t is PokemonType => t in PokemonType)) { - return { - pass: this.isNot, - message: () => `Expected to recieve array of PokemonTypes but got ${this.utils.stringify(expected)}!`, - }; - } + // Exact matches do not care about subset equality + const matchers = options.exact + ? [...this.customTesters, this.utils.iterableEquality] + : [...this.customTesters, this.utils.subsetEquality, this.utils.iterableEquality]; + const pass = this.equals(actualTypes, expectedTypes, matchers); - const gotSorted = pkmnTypeToStr(received.getTypes(...(options.args ?? []))); - const wantSorted = pkmnTypeToStr(expected.slice()); - const pass = this.equals(gotSorted, wantSorted, [...this.customTesters, this.utils.iterableEquality]); + const actualStr = stringifyEnumArray(PokemonType, actualTypes); + const expectedStr = stringifyEnumArray(PokemonType, expectedTypes); + const pkmName = getPokemonNameWithAffix(received); return { - pass: this.isNot !== pass, - message: () => `Expected ${received.name} to have types ${this.utils.stringify(wantSorted)}, but got ${gotSorted}!`, - actual: gotSorted, - expected: wantSorted, + pass, + message: () => + pass + ? `Expected ${pkmName} to NOT have types ${expectedStr}, but it did!` + : `Expected ${pkmName} to have types ${expectedStr}, but got ${actualStr} instead!`, + expected: expectedTypes, + actual: actualTypes, }; } - -function pkmnTypeToStr(p: PokemonType[]): string[] { - return p.sort().map(type => PokemonType[type]); -} diff --git a/test/test-utils/matchers/to-have-used-move.ts b/test/test-utils/matchers/to-have-used-move.ts new file mode 100644 index 00000000000..ef90e4dbad9 --- /dev/null +++ b/test/test-utils/matchers/to-have-used-move.ts @@ -0,0 +1,70 @@ +/** biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports */ +import type { Pokemon } from "#field/pokemon"; +/** biome-ignore-end lint/correctness/noUnusedImports: TSDoc imports */ + +import { getPokemonNameWithAffix } from "#app/messages"; +import type { MoveId } from "#enums/move-id"; +import { getOnelineDiffStr, getOrdinal } from "#test/test-utils/string-utils"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import type { TurnMove } from "#types/turn-move"; +import type { AtLeastOne } from "#types/type-helpers"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher to check the contents of a {@linkcode Pokemon}'s move history. + * @param received - The actual value received. Should be a {@linkcode Pokemon} + * @param expectedValue - The {@linkcode MoveId} the Pokemon is expected to have used, + * or a partially filled {@linkcode TurnMove} containing the desired properties to check + * @param index - The index of the move history entry to check, in order from most recent to least recent. + * Default `0` (last used move) + * @returns Whether the matcher passed + */ +export function toHaveUsedMove( + this: MatcherState, + received: unknown, + expectedResult: MoveId | AtLeastOne, + index = 0, +): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + const move: TurnMove | undefined = received.getLastXMoves(-1)[index]; + const pkmName = getPokemonNameWithAffix(received); + + if (move === undefined) { + return { + pass: false, + message: () => `Expected ${pkmName} to have used ${index + 1} moves, but it didn't!`, + actual: received.getLastXMoves(-1), + }; + } + + // Coerce to a `TurnMove` + if (typeof expectedResult === "number") { + expectedResult = { move: expectedResult }; + } + + const moveIndexStr = index === 0 ? "last move" : `${getOrdinal(index)} most recent move`; + + const pass = this.equals(move, expectedResult, [ + ...this.customTesters, + this.utils.subsetEquality, + this.utils.iterableEquality, + ]); + + const expectedStr = getOnelineDiffStr.call(this, expectedResult); + return { + pass, + message: () => + pass + ? `Expected ${pkmName}'s ${moveIndexStr} to NOT match ${expectedStr}, but it did!` + : // Replace newlines with spaces to preserve one-line ness + `Expected ${pkmName}'s ${moveIndexStr} to match ${expectedStr}, but it didn't!`, + expected: expectedResult, + actual: move, + }; +} diff --git a/test/test-utils/matchers/to-have-used-pp.ts b/test/test-utils/matchers/to-have-used-pp.ts new file mode 100644 index 00000000000..3b606a535bc --- /dev/null +++ b/test/test-utils/matchers/to-have-used-pp.ts @@ -0,0 +1,77 @@ +// biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports +import type { Pokemon } from "#field/pokemon"; +// biome-ignore-end lint/correctness/noUnusedImports: TSDoc imports + +import { getPokemonNameWithAffix } from "#app/messages"; +import Overrides from "#app/overrides"; +import { MoveId } from "#enums/move-id"; +import { getEnumStr } from "#test/test-utils/string-utils"; +import { isPokemonInstance, receivedStr } from "#test/test-utils/test-utils"; +import { coerceArray } from "#utils/common"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher to check the amount of PP consumed by a {@linkcode Pokemon}. + * @param received - The actual value received. Should be a {@linkcode Pokemon} + * @param expectedValue - The {@linkcode MoveId} that should have consumed PP + * @param ppUsed - The numerical amount of PP that should have been consumed, + * or `all` to indicate the move should be _out_ of PP + * @returns Whether the matcher passed + * @remarks + * If the same move appears in the Pokemon's moveset multiple times, this will fail the test! + */ +export function toHaveUsedPP( + this: MatcherState, + received: unknown, + expectedMove: MoveId, + ppUsed: number | "all", +): SyncExpectationResult { + if (!isPokemonInstance(received)) { + return { + pass: false, + message: () => `Expected to receive a Pokémon, but got ${receivedStr(received)}!`, + }; + } + + const override = received.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE; + if (coerceArray(override).length > 0) { + return { + pass: false, + message: () => + `Cannot test for PP consumption with ${received.isPlayer() ? "player" : "enemy"} moveset overrides active!`, + }; + } + + const pkmName = getPokemonNameWithAffix(received); + const moveStr = getEnumStr(MoveId, expectedMove); + + const movesetMoves = received.getMoveset().filter(pm => pm.moveId === expectedMove); + if (movesetMoves.length !== 1) { + return { + pass: false, + message: () => + `Expected MoveId.${moveStr} to appear in ${pkmName}'s moveset exactly once, but got ${movesetMoves.length} times!`, + expected: expectedMove, + actual: received.getMoveset(), + }; + } + + const move = movesetMoves[0]; // will be the only move in the array + + let ppStr: string = ppUsed.toString(); + if (typeof ppUsed === "string") { + ppStr = "all its"; + ppUsed = move.getMovePp(); + } + const pass = move.ppUsed === ppUsed; + + return { + pass, + message: () => + pass + ? `Expected ${pkmName}'s ${moveStr} to NOT have used ${ppStr} PP, but it did!` + : `Expected ${pkmName}'s ${moveStr} to have used ${ppStr} PP, but got ${move.ppUsed} instead!`, + expected: ppUsed, + actual: move.ppUsed, + }; +} diff --git a/test/test-utils/matchers/to-have-weather.ts b/test/test-utils/matchers/to-have-weather.ts new file mode 100644 index 00000000000..49433b2137b --- /dev/null +++ b/test/test-utils/matchers/to-have-weather.ts @@ -0,0 +1,62 @@ +/** biome-ignore-start lint/correctness/noUnusedImports: TSDoc imports */ +import type { GameManager } from "#test/test-utils/game-manager"; +/** biome-ignore-end lint/correctness/noUnusedImports: TSDoc imports */ + +import { WeatherType } from "#enums/weather-type"; +import { isGameManagerInstance, receivedStr } from "#test/test-utils/test-utils"; +import { toTitleCase } from "#utils/strings"; +import type { MatcherState, SyncExpectationResult } from "@vitest/expect"; + +/** + * Matcher that checks if the {@linkcode WeatherType} is as expected + * @param received - The object to check. Expects an instance of {@linkcode GameManager}. + * @param expectedWeatherType - The expected {@linkcode WeatherType} + * @returns Whether the matcher passed + */ +export function toHaveWeather( + this: MatcherState, + received: unknown, + expectedWeatherType: WeatherType, +): SyncExpectationResult { + if (!isGameManagerInstance(received)) { + return { + pass: false, + message: () => `Expected GameManager, but got ${receivedStr(received)}!`, + }; + } + + if (!received.scene?.arena) { + return { + pass: false, + message: () => `Expected GameManager.${received.scene ? "scene" : "scene.arena"} to be defined!`, + }; + } + + const actual = received.scene.arena.getWeatherType(); + const pass = actual === expectedWeatherType; + const actualStr = toWeatherStr(actual); + const expectedStr = toWeatherStr(expectedWeatherType); + + return { + pass, + message: () => + pass + ? `Expected Arena to NOT have ${expectedStr} weather active, but it did!` + : `Expected Arena to have ${expectedStr} weather active, but got ${actualStr} instead!`, + expected: expectedWeatherType, + actual, + }; +} + +/** + * Get a human readable representation of the current {@linkcode WeatherType}. + * @param weatherType - The {@linkcode WeatherType} to transform + * @returns A human readable string + */ +function toWeatherStr(weatherType: WeatherType) { + if (weatherType === WeatherType.NONE) { + return "no weather"; + } + + return toTitleCase(WeatherType[weatherType]); +} diff --git a/test/test-utils/string-utils.ts b/test/test-utils/string-utils.ts new file mode 100644 index 00000000000..bd3dd7c2fa9 --- /dev/null +++ b/test/test-utils/string-utils.ts @@ -0,0 +1,183 @@ +import { getStatKey, type Stat } from "#enums/stat"; +import type { EnumOrObject, NormalEnum, TSNumericEnum } from "#types/enum-types"; +import type { ObjectValues } from "#types/type-helpers"; +import { enumValueToKey } from "#utils/enums"; +import { toTitleCase } from "#utils/strings"; +import type { MatcherState } from "@vitest/expect"; +import i18next from "i18next"; + +type Casing = "Preserve" | "Title"; + +interface getEnumStrOptions { + /** + * A string denoting the casing method to use. + * @defaultValue "Preserve" + */ + casing?: Casing; + /** + * If present, will be prepended to the beginning of the enum string. + */ + prefix?: string; + /** + * If present, will be added to the end of the enum string. + */ + suffix?: string; +} + +/** + * Return the name of an enum member or const object value, alongside its corresponding value. + * @param obj - The {@linkcode EnumOrObject} to source reverse mappings from + * @param enums - One of {@linkcode obj}'s values + * @param casing - A string denoting the casing method to use; default `Preserve` + * @param prefix - An optional string to be prepended to the enum's string representation + * @param suffix - An optional string to be appended to the enum's string representation + * @returns The stringified representation of `val` as dictated by the options. + * @example + * ```ts + * enum fakeEnum { + * ONE: 1, + * TWO: 2, + * THREE: 3, + * } + * getEnumStr(fakeEnum, fakeEnum.ONE); // Output: "ONE (=1)" + * getEnumStr(fakeEnum, fakeEnum.TWO, {casing: "Title", prefix: "fakeEnum.", suffix: "!!!"}); // Output: "fakeEnum.TWO!!! (=2)" + * ``` + */ +export function getEnumStr( + obj: E, + val: ObjectValues, + { casing = "Preserve", prefix = "", suffix = "" }: getEnumStrOptions = {}, +): string { + let casingFunc: ((s: string) => string) | undefined; + switch (casing) { + case "Preserve": + break; + case "Title": + casingFunc = toTitleCase; + break; + } + + let stringPart = + obj[val] !== undefined + ? // TS reverse mapped enum + (obj[val] as string) + : // Normal enum/`const object` + (enumValueToKey(obj as NormalEnum, val) as string); + + if (casingFunc) { + stringPart = casingFunc(stringPart); + } + + return `${prefix}${stringPart}${suffix} (=${val})`; +} + +/** + * Convert an array of enums or `const object`s into a readable string version. + * @param obj - The {@linkcode EnumOrObject} to source reverse mappings from + * @param enums - An array of {@linkcode obj}'s values + * @returns The stringified representation of `enums`. + * @example + * ```ts + * enum fakeEnum { + * ONE: 1, + * TWO: 2, + * THREE: 3, + * } + * console.log(stringifyEnumArray(fakeEnum, [fakeEnum.ONE, fakeEnum.TWO, fakeEnum.THREE])); // Output: "[ONE, TWO, THREE] (=[1, 2, 3])" + * ``` + */ +export function stringifyEnumArray(obj: E, enums: E[keyof E][]): string { + if (obj.length === 0) { + return "[]"; + } + + const vals = enums.slice(); + /** An array of string names */ + let names: string[]; + + if (obj[enums[0]] !== undefined) { + // Reverse mapping exists - `obj` is a `TSNumericEnum` and its reverse mapped counterparts are strings + names = enums.map(e => (obj as TSNumericEnum)[e] as string); + } else { + // No reverse mapping exists means `obj` is a `NormalEnum`. + // NB: This (while ugly) should be more ergonomic than doing a repeated lookup for large `const object`s + // as the `enums` array should be significantly shorter than the corresponding enum type. + names = []; + for (const [k, v] of Object.entries(obj as NormalEnum)) { + if (names.length === enums.length) { + // No more names to get + break; + } + // Find all matches for the given enum, assigning their keys to the names array + findIndices(enums, v).forEach(matchIndex => { + names[matchIndex] = k; + }); + } + } + return `[${names.join(", ")}] (=[${vals.join(", ")}])`; +} + +/** + * Return the indices of all occurrences of a value in an array. + * @param arr - The array to search + * @param searchElement - The value to locate in the array + * @param fromIndex - The array index at which to begin the search. If fromIndex is omitted, the + * search starts at index 0 + */ +function findIndices(arr: T[], searchElement: T, fromIndex = 0): number[] { + const indices: number[] = []; + const arrSliced = arr.slice(fromIndex); + for (const [index, value] of arrSliced.entries()) { + if (value === searchElement) { + indices.push(index); + } + } + return indices; +} + +/** + * Convert a number into an English ordinal + * @param num - The number to convert into an ordinal + * @returns The ordinal representation of {@linkcode num}. + * @example + * ```ts + * console.log(getOrdinal(1)); // Output: "1st" + * console.log(getOrdinal(12)); // Output: "12th" + * console.log(getOrdinal(24)); // Output: "24th" + * ``` + */ +export function getOrdinal(num: number): string { + const tens = num % 10; + const hundreds = num % 100; + if (tens === 1 && hundreds !== 11) { + return num + "st"; + } + if (tens === 2 && hundreds !== 12) { + return num + "nd"; + } + if (tens === 3 && hundreds !== 13) { + return num + "rd"; + } + return num + "th"; +} + +/** + * Get the localized name of a {@linkcode Stat}. + * @param s - The {@linkcode Stat} to check + * @returns - The proper name for s, retrieved from the translations. + */ +export function getStatName(s: Stat): string { + return i18next.t(getStatKey(s)); +} + +/** + * Convert an object into a oneline diff to be shown in an error message. + * @param obj - The object to return the oneline diff of + * @returns The updated diff + */ +export function getOnelineDiffStr(this: MatcherState, obj: unknown): string { + return this.utils + .stringify(obj, undefined, { maxLength: 35, indent: 0, printBasicPrototype: false }) + .replace(/\n/g, " ") // Replace newlines with spaces + .replace(/,(\s*)}$/g, "$1}"); +} diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index 40e4bbe8775..b9e73c3e9da 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -1,3 +1,5 @@ +import { Pokemon } from "#field/pokemon"; +import type { GameManager } from "#test/test-utils/game-manager"; import i18next, { type ParseKeys } from "i18next"; import { vi } from "vitest"; @@ -29,3 +31,54 @@ export function arrayOfRange(start: number, end: number) { export function getApiBaseUrl() { return import.meta.env.VITE_SERVER_URL ?? "http://localhost:8001"; } + +type TypeOfResult = "undefined" | "object" | "boolean" | "number" | "bigint" | "string" | "symbol" | "function"; + +/** + * Helper to determine the actual type of the received object as human readable string + * @param received - The received object + * @returns A human readable string of the received object (type) + */ +export function receivedStr(received: unknown, expectedType: TypeOfResult = "object"): string { + if (received === null) { + return "null"; + } + if (received === undefined) { + return "undefined"; + } + if (typeof received !== expectedType) { + return typeof received; + } + if (expectedType === "object") { + return received.constructor.name; + } + + return "unknown"; +} + +/** + * Helper to check if the received object is an {@linkcode object} + * @param received - The object to check + * @returns Whether the object is an {@linkcode object}. + */ +function isObject(received: unknown): received is object { + return received !== null && typeof received === "object"; +} + +/** + * Helper function to check if a given object is a {@linkcode Pokemon}. + * @param received - The object to check + * @return Whether `received` is a {@linkcode Pokemon} instance. + */ +export function isPokemonInstance(received: unknown): received is Pokemon { + return isObject(received) && received instanceof Pokemon; +} + +/** + * Checks if an object is a {@linkcode GameManager} instance + * @param received - The object to check + * @returns Whether the object is a {@linkcode GameManager} instance. + */ +export function isGameManagerInstance(received: unknown): received is GameManager { + return isObject(received) && (received as GameManager).constructor.name === "GameManager"; +} diff --git a/test/types/type-helpers.test-d.ts b/test/types/type-helpers.test-d.ts new file mode 100644 index 00000000000..29f957890fc --- /dev/null +++ b/test/types/type-helpers.test-d.ts @@ -0,0 +1,38 @@ +import type { AtLeastOne } from "#types/type-helpers"; +import { describe, it } from "node:test"; +import { expectTypeOf } from "vitest"; + +type fakeObj = { + foo: number; + bar: string; + baz: number | string; +}; + +type optionalObj = { + foo: number; + bar: string; + baz?: number | string; +}; + +describe("AtLeastOne", () => { + it("should accept an object with at least 1 of its defined parameters", () => { + expectTypeOf<{ foo: number }>().toExtend>(); + expectTypeOf<{ bar: string }>().toExtend>(); + expectTypeOf<{ baz: number | string }>().toExtend>(); + }); + + it("should convert to a partial intersection with the union of all individual single properties", () => { + expectTypeOf>().branded.toEqualTypeOf< + Partial & ({ foo: number } | { bar: string } | { baz: number | string }) + >(); + }); + + it("should treat optional properties as required", () => { + expectTypeOf>().branded.toEqualTypeOf>(); + }); + + it("should not accept empty objects, even if optional properties are present", () => { + expectTypeOf>().not.toExtend>(); + expectTypeOf>().not.toExtend>(); + }); +}); From 491df80b66fe3aa2eceb94d4ed417b0a451a3578 Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Sat, 2 Aug 2025 20:08:50 -0500 Subject: [PATCH 067/106] [Beta] Further Cosmog Evolution Readjustments (#6203) Update pokemon-evolutions.ts --- src/data/balance/pokemon-evolutions.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index 5183146ffc1..ab535682e86 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -1191,11 +1191,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(SpeciesId.KOMMO_O, 45, null, null) ], [SpeciesId.COSMOG]: [ - new SpeciesEvolution(SpeciesId.COSMOEM, 1, null, {key: EvoCondKey.FRIENDSHIP, value: 40}, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(SpeciesId.COSMOEM, 1, null, {key: EvoCondKey.FRIENDSHIP, value: 43}, SpeciesWildEvolutionDelay.VERY_LONG) ], [SpeciesId.COSMOEM]: [ - new SpeciesEvolution(SpeciesId.SOLGALEO, 23, EvolutionItem.SUN_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG), - new SpeciesEvolution(SpeciesId.LUNALA, 23, EvolutionItem.MOON_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG) + new SpeciesEvolution(SpeciesId.SOLGALEO, 13, EvolutionItem.SUN_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG), + new SpeciesEvolution(SpeciesId.LUNALA, 13, EvolutionItem.MOON_FLUTE, null, SpeciesWildEvolutionDelay.VERY_LONG) ], [SpeciesId.MELTAN]: [ new SpeciesEvolution(SpeciesId.MELMETAL, 48, null, null) From e8ab79ebed6ee32e33c25cfbdb5b0e5deb444939 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sat, 2 Aug 2025 22:35:06 -0400 Subject: [PATCH 068/106] [Dev] Move various functions out of `pokemon-species.ts` (#6155) `initSpecies` moved to its own file, other functions moved to `pokemon-utils.ts` --- src/data/balance/pokemon-species.ts | 1784 ++++++++++++++++ src/data/challenge.ts | 3 +- src/data/daily-run.ts | 4 +- src/data/pokemon-species.ts | 1888 +---------------- src/data/pokemon/pokemon-data.ts | 3 +- src/field/pokemon.ts | 4 +- src/init/init.ts | 2 +- src/system/pokemon-data.ts | 3 +- .../version-migration/versions/v1_7_0.ts | 3 +- src/ui/pokedex-page-ui-handler.ts | 4 +- src/ui/pokedex-ui-handler.ts | 3 +- src/ui/pokemon-hatch-info-container.ts | 2 +- src/ui/starter-select-ui-handler.ts | 2 +- src/utils/pokemon-utils.ts | 106 +- test/test-utils/game-manager-utils.ts | 3 +- 15 files changed, 1910 insertions(+), 1904 deletions(-) create mode 100644 src/data/balance/pokemon-species.ts diff --git a/src/data/balance/pokemon-species.ts b/src/data/balance/pokemon-species.ts new file mode 100644 index 00000000000..5e9d352f437 --- /dev/null +++ b/src/data/balance/pokemon-species.ts @@ -0,0 +1,1784 @@ +import { allSpecies } from "#data/data-lists"; +import { GrowthRate } from "#data/exp"; +import { PokemonForm, PokemonSpecies } from "#data/pokemon-species"; +import { AbilityId } from "#enums/ability-id"; +import { PokemonType } from "#enums/pokemon-type"; +import { SpeciesFormKey } from "#enums/species-form-key"; +import { SpeciesId } from "#enums/species-id"; + +// biome-ignore format: manually formatted +export function initSpecies() { + allSpecies.push( + new PokemonSpecies(SpeciesId.BULBASAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 6.9, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.IVYSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 13, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.VENUSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 2, 100, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.POISON, 2, 100, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.POISON, 2.4, 155.5, AbilityId.THICK_FAT, AbilityId.THICK_FAT, AbilityId.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.POISON, 24, 999.9, AbilityId.EFFECT_SPORE, AbilityId.NONE, AbilityId.EFFECT_SPORE, 625, 120, 122, 90, 108, 105, 80, 45, 50, 263, true) + ), + new PokemonSpecies(SpeciesId.CHARMANDER, 1, false, false, false, "Lizard Pokémon", PokemonType.FIRE, null, 0.6, 8.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.CHARMELEON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 1.1, 19, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.CHARIZARD, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FLYING, 1.7, 90.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.FLYING, 1.7, 90.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), + new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, PokemonType.FIRE, PokemonType.DRAGON, 1.7, 110.5, AbilityId.TOUGH_CLAWS, AbilityId.NONE, AbilityId.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), + new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.FIRE, PokemonType.FLYING, 1.7, 100.5, AbilityId.DROUGHT, AbilityId.NONE, AbilityId.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.FLYING, 28, 999.9, AbilityId.BERSERK, AbilityId.NONE, AbilityId.BERSERK, 634, 118, 99, 88, 134, 95, 100, 45, 50, 267) + ), + new PokemonSpecies(SpeciesId.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", PokemonType.WATER, null, 0.5, 9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.WARTORTLE, 1, false, false, false, "Turtle Pokémon", PokemonType.WATER, null, 1, 22.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", PokemonType.WATER, null, 1.6, 85.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.6, 85.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, null, 1.6, 101.1, AbilityId.MEGA_LAUNCHER, AbilityId.NONE, AbilityId.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.STEEL, 25, 999.9, AbilityId.SHELL_ARMOR, AbilityId.NONE, AbilityId.SHELL_ARMOR, 630, 119, 108, 125, 105, 110, 63, 45, 50, 265) + ), + new PokemonSpecies(SpeciesId.CATERPIE, 1, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 2.9, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.METAPOD, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 9.9, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.FLYING, 17, 999.9, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.COMPOUND_EYES, 495, 80, 40, 75, 120, 95, 85, 45, 50, 198, true) + ), + new PokemonSpecies(SpeciesId.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", PokemonType.BUG, PokemonType.POISON, 0.3, 3.2, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.KAKUNA, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, PokemonType.POISON, 0.6, 10, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BEEDRILL, 1, false, false, false, "Poison Bee Pokémon", PokemonType.BUG, PokemonType.POISON, 1, 29.5, AbilityId.SWARM, AbilityId.NONE, AbilityId.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.POISON, 1, 29.5, AbilityId.SWARM, AbilityId.NONE, AbilityId.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.POISON, 1.4, 40.5, AbilityId.ADAPTABILITY, AbilityId.NONE, AbilityId.ADAPTABILITY, 495, 65, 150, 40, 15, 80, 145, 45, 70, 198) + ), + new PokemonSpecies(SpeciesId.PIDGEY, 1, false, false, false, "Tiny Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.8, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 251, 40, 45, 40, 35, 35, 56, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.PIDGEOTTO, 1, false, false, false, "Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.1, 30, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 349, 63, 60, 55, 50, 50, 71, 120, 70, 122, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.PIDGEOT, 1, false, false, false, "Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 39.5, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 39.5, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FLYING, 2.2, 50.5, AbilityId.NO_GUARD, AbilityId.NO_GUARD, AbilityId.NO_GUARD, 579, 83, 80, 80, 135, 80, 121, 45, 70, 240) + ), + new PokemonSpecies(SpeciesId.RATTATA, 1, false, false, false, "Mouse Pokémon", PokemonType.NORMAL, null, 0.3, 3.5, AbilityId.RUN_AWAY, AbilityId.GUTS, AbilityId.HUSTLE, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.RATICATE, 1, false, false, false, "Mouse Pokémon", PokemonType.NORMAL, null, 0.7, 18.5, AbilityId.RUN_AWAY, AbilityId.GUTS, AbilityId.HUSTLE, 413, 55, 81, 60, 50, 70, 97, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.SPEAROW, 1, false, false, false, "Tiny Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2, AbilityId.KEEN_EYE, AbilityId.NONE, AbilityId.SNIPER, 262, 40, 60, 30, 31, 31, 70, 255, 70, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FEAROW, 1, false, false, false, "Beak Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 38, AbilityId.KEEN_EYE, AbilityId.NONE, AbilityId.SNIPER, 442, 65, 90, 65, 61, 61, 100, 90, 70, 155, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.EKANS, 1, false, false, false, "Snake Pokémon", PokemonType.POISON, null, 2, 6.9, AbilityId.INTIMIDATE, AbilityId.SHED_SKIN, AbilityId.UNNERVE, 288, 35, 60, 44, 40, 54, 55, 255, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ARBOK, 1, false, false, false, "Cobra Pokémon", PokemonType.POISON, null, 3.5, 65, AbilityId.INTIMIDATE, AbilityId.SHED_SKIN, AbilityId.UNNERVE, 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PIKACHU, 1, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true), + new PokemonForm("Partner", "partner", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), + new PokemonForm("Cosplay", "cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Cool Cosplay", "cool-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Beauty Cosplay", "beauty-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Cute Cosplay", "cute-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Smart Cosplay", "smart-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("Tough Cosplay", "tough-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ELECTRIC, null, 21, 999.9, AbilityId.LIGHTNING_ROD, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112) + ), + new PokemonSpecies(SpeciesId.RAICHU, 1, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.8, 30, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.SANDSHREW, 1, false, false, false, "Mouse Pokémon", PokemonType.GROUND, null, 0.6, 12, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.SAND_RUSH, 300, 50, 75, 85, 20, 30, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SANDSLASH, 1, false, false, false, "Mouse Pokémon", PokemonType.GROUND, null, 1, 29.5, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.SAND_RUSH, 450, 75, 100, 110, 45, 55, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.NIDORAN_F, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.4, 7, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.HUSTLE, 275, 55, 47, 52, 40, 40, 41, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.NIDORINA, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.8, 20, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.HUSTLE, 365, 70, 62, 67, 55, 55, 56, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.NIDOQUEEN, 1, false, false, false, "Drill Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.3, 60, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.SHEER_FORCE, 505, 90, 92, 87, 75, 85, 76, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.NIDORAN_M, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.5, 9, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.HUSTLE, 273, 46, 57, 40, 40, 40, 50, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(SpeciesId.NIDORINO, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.9, 19.5, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.HUSTLE, 365, 61, 72, 57, 55, 55, 65, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(SpeciesId.NIDOKING, 1, false, false, false, "Drill Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.4, 62, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.SHEER_FORCE, 505, 81, 102, 77, 85, 75, 85, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 100, false), + new PokemonSpecies(SpeciesId.CLEFAIRY, 1, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 0.6, 7.5, AbilityId.CUTE_CHARM, AbilityId.MAGIC_GUARD, AbilityId.FRIEND_GUARD, 323, 70, 45, 48, 60, 65, 35, 150, 140, 113, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.CLEFABLE, 1, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 1.3, 40, AbilityId.CUTE_CHARM, AbilityId.MAGIC_GUARD, AbilityId.UNAWARE, 483, 95, 70, 73, 95, 90, 60, 25, 140, 242, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.VULPIX, 1, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 0.6, 9.9, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.DROUGHT, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(SpeciesId.NINETALES, 1, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 1.1, 19.9, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.DROUGHT, 505, 73, 76, 75, 81, 100, 100, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(SpeciesId.JIGGLYPUFF, 1, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.5, 5.5, AbilityId.CUTE_CHARM, AbilityId.COMPETITIVE, AbilityId.FRIEND_GUARD, 270, 115, 45, 20, 45, 25, 20, 170, 50, 95, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.WIGGLYTUFF, 1, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 1, 12, AbilityId.CUTE_CHARM, AbilityId.COMPETITIVE, AbilityId.FRISK, 435, 140, 70, 45, 85, 50, 45, 50, 50, 218, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.ZUBAT, 1, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 0.8, 7.5, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.INFILTRATOR, 245, 40, 45, 35, 30, 40, 55, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.GOLBAT, 1, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 1.6, 55, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.INFILTRATOR, 455, 75, 80, 70, 65, 75, 90, 90, 50, 159, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.ODDISH, 1, false, false, false, "Weed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.5, 5.4, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.RUN_AWAY, 320, 45, 50, 55, 75, 65, 30, 255, 50, 64, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GLOOM, 1, false, false, false, "Weed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.8, 8.6, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.STENCH, 395, 60, 65, 70, 85, 75, 40, 120, 50, 138, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.VILEPLUME, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 1.2, 18.6, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.EFFECT_SPORE, 490, 75, 80, 85, 110, 90, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.PARAS, 1, false, false, false, "Mushroom Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.3, 5.4, AbilityId.EFFECT_SPORE, AbilityId.DRY_SKIN, AbilityId.DAMP, 285, 35, 70, 55, 45, 55, 25, 190, 70, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PARASECT, 1, false, false, false, "Mushroom Pokémon", PokemonType.BUG, PokemonType.GRASS, 1, 29.5, AbilityId.EFFECT_SPORE, AbilityId.DRY_SKIN, AbilityId.DAMP, 405, 60, 95, 80, 60, 80, 30, 75, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.VENONAT, 1, false, false, false, "Insect Pokémon", PokemonType.BUG, PokemonType.POISON, 1, 30, AbilityId.COMPOUND_EYES, AbilityId.TINTED_LENS, AbilityId.RUN_AWAY, 305, 60, 55, 50, 40, 55, 45, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.VENOMOTH, 1, false, false, false, "Poison Moth Pokémon", PokemonType.BUG, PokemonType.POISON, 1.5, 12.5, AbilityId.SHIELD_DUST, AbilityId.TINTED_LENS, AbilityId.WONDER_SKIN, 450, 70, 65, 60, 90, 75, 90, 75, 70, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DIGLETT, 1, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.2, 0.8, AbilityId.SAND_VEIL, AbilityId.ARENA_TRAP, AbilityId.SAND_FORCE, 265, 10, 55, 25, 35, 45, 95, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DUGTRIO, 1, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.7, 33.3, AbilityId.SAND_VEIL, AbilityId.ARENA_TRAP, AbilityId.SAND_FORCE, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MEOWTH, 1, false, false, false, "Scratch Cat Pokémon", PokemonType.NORMAL, null, 0.4, 4.2, AbilityId.PICKUP, AbilityId.TECHNICIAN, AbilityId.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.4, 4.2, AbilityId.PICKUP, AbilityId.TECHNICIAN, AbilityId.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 33, 999.9, AbilityId.TECHNICIAN, AbilityId.TECHNICIAN, AbilityId.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58) + ), + new PokemonSpecies(SpeciesId.PERSIAN, 1, false, false, false, "Classy Cat Pokémon", PokemonType.NORMAL, null, 1, 32, AbilityId.LIMBER, AbilityId.TECHNICIAN, AbilityId.UNNERVE, 440, 65, 70, 60, 65, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PSYDUCK, 1, false, false, false, "Duck Pokémon", PokemonType.WATER, null, 0.8, 19.6, AbilityId.DAMP, AbilityId.CLOUD_NINE, AbilityId.SWIFT_SWIM, 320, 50, 52, 48, 65, 50, 55, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GOLDUCK, 1, false, false, false, "Duck Pokémon", PokemonType.WATER, null, 1.7, 76.6, AbilityId.DAMP, AbilityId.CLOUD_NINE, AbilityId.SWIFT_SWIM, 500, 80, 82, 78, 95, 80, 85, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MANKEY, 1, false, false, false, "Pig Monkey Pokémon", PokemonType.FIGHTING, null, 0.5, 28, AbilityId.VITAL_SPIRIT, AbilityId.ANGER_POINT, AbilityId.DEFIANT, 305, 40, 80, 35, 35, 45, 70, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PRIMEAPE, 1, false, false, false, "Pig Monkey Pokémon", PokemonType.FIGHTING, null, 1, 32, AbilityId.VITAL_SPIRIT, AbilityId.ANGER_POINT, AbilityId.DEFIANT, 455, 65, 105, 60, 60, 70, 95, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GROWLITHE, 1, false, false, false, "Puppy Pokémon", PokemonType.FIRE, null, 0.7, 19, AbilityId.INTIMIDATE, AbilityId.FLASH_FIRE, AbilityId.JUSTIFIED, 350, 55, 70, 45, 70, 50, 60, 190, 50, 70, GrowthRate.SLOW, 75, false), + new PokemonSpecies(SpeciesId.ARCANINE, 1, false, false, false, "Legendary Pokémon", PokemonType.FIRE, null, 1.9, 155, AbilityId.INTIMIDATE, AbilityId.FLASH_FIRE, AbilityId.JUSTIFIED, 555, 90, 110, 80, 100, 80, 95, 75, 50, 194, GrowthRate.SLOW, 75, false), + new PokemonSpecies(SpeciesId.POLIWAG, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 0.6, 12.4, AbilityId.WATER_ABSORB, AbilityId.DAMP, AbilityId.SWIFT_SWIM, 300, 40, 50, 40, 40, 40, 90, 255, 50, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.POLIWHIRL, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 1, 20, AbilityId.WATER_ABSORB, AbilityId.DAMP, AbilityId.SWIFT_SWIM, 385, 65, 65, 65, 50, 50, 90, 120, 50, 135, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.POLIWRATH, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.3, 54, AbilityId.WATER_ABSORB, AbilityId.DAMP, AbilityId.SWIFT_SWIM, 510, 90, 95, 95, 70, 90, 70, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.ABRA, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 0.9, 19.5, AbilityId.SYNCHRONIZE, AbilityId.INNER_FOCUS, AbilityId.MAGIC_GUARD, 310, 25, 20, 15, 105, 55, 90, 200, 50, 62, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(SpeciesId.KADABRA, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 1.3, 56.5, AbilityId.SYNCHRONIZE, AbilityId.INNER_FOCUS, AbilityId.MAGIC_GUARD, 400, 40, 35, 30, 120, 70, 105, 100, 50, 140, GrowthRate.MEDIUM_SLOW, 75, true), + new PokemonSpecies(SpeciesId.ALAKAZAM, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 1.5, 48, AbilityId.SYNCHRONIZE, AbilityId.INNER_FOCUS, AbilityId.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, GrowthRate.MEDIUM_SLOW, 75, true, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 1.5, 48, AbilityId.SYNCHRONIZE, AbilityId.INNER_FOCUS, AbilityId.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, null, 1.2, 48, AbilityId.TRACE, AbilityId.TRACE, AbilityId.TRACE, 600, 55, 50, 65, 175, 105, 150, 50, 50, 250, true) + ), + new PokemonSpecies(SpeciesId.MACHOP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 0.8, 19.5, AbilityId.GUTS, AbilityId.NO_GUARD, AbilityId.STEADFAST, 305, 70, 80, 50, 35, 35, 35, 180, 50, 61, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(SpeciesId.MACHOKE, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.5, 70.5, AbilityId.GUTS, AbilityId.NO_GUARD, AbilityId.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(SpeciesId.MACHAMP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.6, 130, AbilityId.GUTS, AbilityId.NO_GUARD, AbilityId.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, null, 1.6, 130, AbilityId.GUTS, AbilityId.NO_GUARD, AbilityId.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIGHTING, null, 25, 999.9, AbilityId.GUTS, AbilityId.GUTS, AbilityId.GUTS, 605, 120, 170, 85, 75, 90, 65, 45, 50, 253) + ), + new PokemonSpecies(SpeciesId.BELLSPROUT, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 4, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 6.4, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.VICTREEBEL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1.7, 15.5, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.GLUTTONY, 490, 80, 105, 65, 100, 70, 70, 45, 70, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.TENTACOOL, 1, false, false, false, "Jellyfish Pokémon", PokemonType.WATER, PokemonType.POISON, 0.9, 45.5, AbilityId.CLEAR_BODY, AbilityId.LIQUID_OOZE, AbilityId.RAIN_DISH, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.TENTACRUEL, 1, false, false, false, "Jellyfish Pokémon", PokemonType.WATER, PokemonType.POISON, 1.6, 55, AbilityId.CLEAR_BODY, AbilityId.LIQUID_OOZE, AbilityId.RAIN_DISH, 515, 80, 70, 65, 80, 120, 100, 60, 50, 180, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.GEODUDE, 1, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.GROUND, 0.4, 20, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SAND_VEIL, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GRAVELER, 1, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1, 105, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SAND_VEIL, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GOLEM, 1, false, false, false, "Megaton Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1.4, 300, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SAND_VEIL, 495, 80, 120, 130, 55, 65, 45, 45, 70, 248, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.PONYTA, 1, false, false, false, "Fire Horse Pokémon", PokemonType.FIRE, null, 1, 30, AbilityId.RUN_AWAY, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.RAPIDASH, 1, false, false, false, "Fire Horse Pokémon", PokemonType.FIRE, null, 1.7, 95, AbilityId.RUN_AWAY, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SLOWPOKE, 1, false, false, false, "Dopey Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.2, 36, AbilityId.OBLIVIOUS, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SLOWBRO, 1, false, false, false, "Hermit Crab Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.6, 78.5, AbilityId.OBLIVIOUS, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.PSYCHIC, 1.6, 78.5, AbilityId.OBLIVIOUS, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.PSYCHIC, 2, 120, AbilityId.SHELL_ARMOR, AbilityId.SHELL_ARMOR, AbilityId.SHELL_ARMOR, 590, 95, 75, 180, 130, 80, 30, 75, 50, 172) + ), + new PokemonSpecies(SpeciesId.MAGNEMITE, 1, false, false, false, "Magnet Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 0.3, 6, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.ANALYTIC, 325, 25, 35, 70, 95, 55, 45, 190, 50, 65, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.MAGNETON, 1, false, false, false, "Magnet Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 1, 60, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.ANALYTIC, 465, 50, 60, 95, 120, 70, 70, 60, 50, 163, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.FARFETCHD, 1, false, false, false, "Wild Duck Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.8, 15, AbilityId.KEEN_EYE, AbilityId.INNER_FOCUS, AbilityId.DEFIANT, 377, 52, 90, 55, 58, 62, 60, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DODUO, 1, false, false, false, "Twin Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.4, 39.2, AbilityId.RUN_AWAY, AbilityId.EARLY_BIRD, AbilityId.TANGLED_FEET, 310, 35, 85, 45, 35, 35, 75, 190, 70, 62, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.DODRIO, 1, false, false, false, "Triple Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.8, 85.2, AbilityId.RUN_AWAY, AbilityId.EARLY_BIRD, AbilityId.TANGLED_FEET, 470, 60, 110, 70, 60, 60, 110, 45, 70, 165, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.SEEL, 1, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, null, 1.1, 90, AbilityId.THICK_FAT, AbilityId.HYDRATION, AbilityId.ICE_BODY, 325, 65, 45, 55, 45, 70, 45, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DEWGONG, 1, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, PokemonType.ICE, 1.7, 120, AbilityId.THICK_FAT, AbilityId.HYDRATION, AbilityId.ICE_BODY, 475, 90, 70, 80, 70, 95, 70, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GRIMER, 1, false, false, false, "Sludge Pokémon", PokemonType.POISON, null, 0.9, 30, AbilityId.STENCH, AbilityId.STICKY_HOLD, AbilityId.POISON_TOUCH, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MUK, 1, false, false, false, "Sludge Pokémon", PokemonType.POISON, null, 1.2, 30, AbilityId.STENCH, AbilityId.STICKY_HOLD, AbilityId.POISON_TOUCH, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SHELLDER, 1, false, false, false, "Bivalve Pokémon", PokemonType.WATER, null, 0.3, 4, AbilityId.SHELL_ARMOR, AbilityId.SKILL_LINK, AbilityId.OVERCOAT, 305, 30, 65, 100, 45, 25, 40, 190, 50, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.CLOYSTER, 1, false, false, false, "Bivalve Pokémon", PokemonType.WATER, PokemonType.ICE, 1.5, 132.5, AbilityId.SHELL_ARMOR, AbilityId.SKILL_LINK, AbilityId.OVERCOAT, 525, 50, 95, 180, 85, 45, 70, 60, 50, 184, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.GASTLY, 1, false, false, false, "Gas Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.3, 0.1, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 310, 30, 35, 30, 100, 35, 80, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.HAUNTER, 1, false, false, false, "Gas Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.6, 0.1, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 405, 45, 50, 45, 115, 55, 95, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GENGAR, 1, false, false, false, "Shadow Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.5, 40.5, AbilityId.CURSED_BODY, AbilityId.NONE, AbilityId.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GHOST, PokemonType.POISON, 1.5, 40.5, AbilityId.CURSED_BODY, AbilityId.NONE, AbilityId.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GHOST, PokemonType.POISON, 1.4, 40.5, AbilityId.SHADOW_TAG, AbilityId.NONE, AbilityId.NONE, 600, 60, 65, 80, 170, 95, 130, 45, 50, 250), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GHOST, PokemonType.POISON, 20, 999.9, AbilityId.CURSED_BODY, AbilityId.NONE, AbilityId.NONE, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250) + ), + new PokemonSpecies(SpeciesId.ONIX, 1, false, false, false, "Rock Snake Pokémon", PokemonType.ROCK, PokemonType.GROUND, 8.8, 210, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.WEAK_ARMOR, 385, 35, 45, 160, 30, 45, 70, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DROWZEE, 1, false, false, false, "Hypnosis Pokémon", PokemonType.PSYCHIC, null, 1, 32.4, AbilityId.INSOMNIA, AbilityId.FOREWARN, AbilityId.INNER_FOCUS, 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HYPNO, 1, false, false, false, "Hypnosis Pokémon", PokemonType.PSYCHIC, null, 1.6, 75.6, AbilityId.INSOMNIA, AbilityId.FOREWARN, AbilityId.INNER_FOCUS, 483, 85, 73, 70, 73, 115, 67, 75, 70, 169, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.KRABBY, 1, false, false, false, "River Crab Pokémon", PokemonType.WATER, null, 0.4, 6.5, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.KINGLER, 1, false, false, false, "Pincer Pokémon", PokemonType.WATER, null, 1.3, 60, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.3, 60, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 19, 999.9, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, 575, 92, 145, 140, 60, 65, 73, 60, 50, 166) + ), + new PokemonSpecies(SpeciesId.VOLTORB, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 0.5, 10.4, AbilityId.SOUNDPROOF, AbilityId.STATIC, AbilityId.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.ELECTRODE, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 1.2, 66.6, AbilityId.SOUNDPROOF, AbilityId.STATIC, AbilityId.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.EXEGGCUTE, 1, false, false, false, "Egg Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 0.4, 2.5, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.HARVEST, 325, 60, 40, 80, 60, 45, 40, 90, 50, 65, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.EXEGGUTOR, 1, false, false, false, "Coconut Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 2, 120, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.HARVEST, 530, 95, 95, 85, 125, 75, 55, 45, 50, 186, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.CUBONE, 1, false, false, false, "Lonely Pokémon", PokemonType.GROUND, null, 0.4, 6.5, AbilityId.ROCK_HEAD, AbilityId.LIGHTNING_ROD, AbilityId.BATTLE_ARMOR, 320, 50, 50, 95, 40, 50, 35, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MAROWAK, 1, false, false, false, "Bone Keeper Pokémon", PokemonType.GROUND, null, 1, 45, AbilityId.ROCK_HEAD, AbilityId.LIGHTNING_ROD, AbilityId.BATTLE_ARMOR, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HITMONLEE, 1, false, false, false, "Kicking Pokémon", PokemonType.FIGHTING, null, 1.5, 49.8, AbilityId.LIMBER, AbilityId.RECKLESS, AbilityId.UNBURDEN, 455, 50, 120, 53, 35, 110, 87, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.HITMONCHAN, 1, false, false, false, "Punching Pokémon", PokemonType.FIGHTING, null, 1.4, 50.2, AbilityId.KEEN_EYE, AbilityId.IRON_FIST, AbilityId.INNER_FOCUS, 455, 50, 105, 79, 35, 110, 76, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.LICKITUNG, 1, false, false, false, "Licking Pokémon", PokemonType.NORMAL, null, 1.2, 65.5, AbilityId.OWN_TEMPO, AbilityId.OBLIVIOUS, AbilityId.CLOUD_NINE, 385, 90, 55, 75, 60, 75, 30, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.KOFFING, 1, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, null, 0.6, 1, AbilityId.LEVITATE, AbilityId.NEUTRALIZING_GAS, AbilityId.STENCH, 340, 40, 65, 95, 60, 45, 35, 190, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WEEZING, 1, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, null, 1.2, 9.5, AbilityId.LEVITATE, AbilityId.NEUTRALIZING_GAS, AbilityId.STENCH, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.RHYHORN, 1, false, false, false, "Spikes Pokémon", PokemonType.GROUND, PokemonType.ROCK, 1, 115, AbilityId.LIGHTNING_ROD, AbilityId.ROCK_HEAD, AbilityId.RECKLESS, 345, 80, 85, 95, 30, 30, 25, 120, 50, 69, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.RHYDON, 1, false, false, false, "Drill Pokémon", PokemonType.GROUND, PokemonType.ROCK, 1.9, 120, AbilityId.LIGHTNING_ROD, AbilityId.ROCK_HEAD, AbilityId.RECKLESS, 485, 105, 130, 120, 45, 45, 40, 60, 50, 170, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.CHANSEY, 1, false, false, false, "Egg Pokémon", PokemonType.NORMAL, null, 1.1, 34.6, AbilityId.NATURAL_CURE, AbilityId.SERENE_GRACE, AbilityId.HEALER, 450, 250, 5, 5, 35, 105, 50, 30, 140, 395, GrowthRate.FAST, 0, false), + new PokemonSpecies(SpeciesId.TANGELA, 1, false, false, false, "Vine Pokémon", PokemonType.GRASS, null, 1, 35, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.REGENERATOR, 435, 65, 55, 115, 100, 40, 60, 45, 50, 87, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.KANGASKHAN, 1, false, false, false, "Parent Pokémon", PokemonType.NORMAL, null, 2.2, 80, AbilityId.EARLY_BIRD, AbilityId.SCRAPPY, AbilityId.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, GrowthRate.MEDIUM_FAST, 0, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 2.2, 80, AbilityId.EARLY_BIRD, AbilityId.SCRAPPY, AbilityId.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, null, 2.2, 100, AbilityId.PARENTAL_BOND, AbilityId.PARENTAL_BOND, AbilityId.PARENTAL_BOND, 590, 105, 125, 100, 60, 100, 100, 45, 50, 172) + ), + new PokemonSpecies(SpeciesId.HORSEA, 1, false, false, false, "Dragon Pokémon", PokemonType.WATER, null, 0.4, 8, AbilityId.SWIFT_SWIM, AbilityId.SNIPER, AbilityId.DAMP, 295, 30, 40, 70, 70, 25, 60, 225, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SEADRA, 1, false, false, false, "Dragon Pokémon", PokemonType.WATER, null, 1.2, 25, AbilityId.POISON_POINT, AbilityId.SNIPER, AbilityId.DAMP, 440, 55, 65, 95, 95, 45, 85, 75, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GOLDEEN, 1, false, false, false, "Goldfish Pokémon", PokemonType.WATER, null, 0.6, 15, AbilityId.SWIFT_SWIM, AbilityId.WATER_VEIL, AbilityId.LIGHTNING_ROD, 320, 45, 67, 60, 35, 50, 63, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.SEAKING, 1, false, false, false, "Goldfish Pokémon", PokemonType.WATER, null, 1.3, 39, AbilityId.SWIFT_SWIM, AbilityId.WATER_VEIL, AbilityId.LIGHTNING_ROD, 450, 80, 92, 65, 65, 80, 68, 60, 50, 158, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.STARYU, 1, false, false, false, "Star Shape Pokémon", PokemonType.WATER, null, 0.8, 34.5, AbilityId.ILLUMINATE, AbilityId.NATURAL_CURE, AbilityId.ANALYTIC, 340, 30, 45, 55, 70, 55, 85, 225, 50, 68, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.STARMIE, 1, false, false, false, "Mysterious Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.1, 80, AbilityId.ILLUMINATE, AbilityId.NATURAL_CURE, AbilityId.ANALYTIC, 520, 60, 75, 85, 100, 85, 115, 60, 50, 182, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.MR_MIME, 1, false, false, false, "Barrier Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.3, 54.5, AbilityId.SOUNDPROOF, AbilityId.FILTER, AbilityId.TECHNICIAN, 460, 40, 45, 65, 100, 120, 90, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SCYTHER, 1, false, false, false, "Mantis Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.5, 56, AbilityId.SWARM, AbilityId.TECHNICIAN, AbilityId.STEADFAST, 500, 70, 110, 80, 55, 80, 105, 45, 50, 100, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.JYNX, 1, false, false, false, "Human Shape Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.4, 40.6, AbilityId.OBLIVIOUS, AbilityId.FOREWARN, AbilityId.DRY_SKIN, 455, 65, 50, 35, 115, 95, 95, 45, 50, 159, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(SpeciesId.ELECTABUZZ, 1, false, false, false, "Electric Pokémon", PokemonType.ELECTRIC, null, 1.1, 30, AbilityId.STATIC, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 490, 65, 83, 57, 95, 85, 105, 45, 50, 172, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(SpeciesId.MAGMAR, 1, false, false, false, "Spitfire Pokémon", PokemonType.FIRE, null, 1.3, 44.5, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 495, 65, 95, 57, 100, 85, 93, 45, 50, 173, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(SpeciesId.PINSIR, 1, false, false, false, "Stag Beetle Pokémon", PokemonType.BUG, null, 1.5, 55, AbilityId.HYPER_CUTTER, AbilityId.MOLD_BREAKER, AbilityId.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, null, 1.5, 55, AbilityId.HYPER_CUTTER, AbilityId.MOLD_BREAKER, AbilityId.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.FLYING, 1.7, 59, AbilityId.AERILATE, AbilityId.AERILATE, AbilityId.AERILATE, 600, 65, 155, 120, 65, 90, 105, 45, 50, 175) + ), + new PokemonSpecies(SpeciesId.TAUROS, 1, false, false, false, "Wild Bull Pokémon", PokemonType.NORMAL, null, 1.4, 88.4, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.SHEER_FORCE, 490, 75, 100, 95, 40, 70, 110, 45, 50, 172, GrowthRate.SLOW, 100, false), + new PokemonSpecies(SpeciesId.MAGIKARP, 1, false, false, false, "Fish Pokémon", PokemonType.WATER, null, 0.9, 10, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.RATTLED, 200, 20, 10, 55, 15, 20, 80, 255, 50, 40, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.GYARADOS, 1, false, false, false, "Atrocious Pokémon", PokemonType.WATER, PokemonType.FLYING, 6.5, 235, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.FLYING, 6.5, 235, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.DARK, 6.5, 305, AbilityId.MOLD_BREAKER, AbilityId.MOLD_BREAKER, AbilityId.MOLD_BREAKER, 640, 95, 155, 109, 70, 130, 81, 45, 50, 189, true) + ), + new PokemonSpecies(SpeciesId.LAPRAS, 1, false, false, false, "Transport Pokémon", PokemonType.WATER, PokemonType.ICE, 2.5, 220, AbilityId.WATER_ABSORB, AbilityId.SHELL_ARMOR, AbilityId.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ICE, 2.5, 220, AbilityId.WATER_ABSORB, AbilityId.SHELL_ARMOR, AbilityId.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ICE, 24, 999.9, AbilityId.SHIELD_DUST, AbilityId.SHIELD_DUST, AbilityId.SHIELD_DUST, 635, 170, 97, 85, 107, 111, 65, 45, 50, 187) + ), + new PokemonSpecies(SpeciesId.DITTO, 1, false, false, false, "Transform Pokémon", PokemonType.NORMAL, null, 0.3, 4, AbilityId.LIMBER, AbilityId.NONE, AbilityId.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.EEVEE, 1, false, false, false, "Evolution Pokémon", PokemonType.NORMAL, null, 0.3, 6.5, AbilityId.RUN_AWAY, AbilityId.ADAPTABILITY, AbilityId.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.3, 6.5, AbilityId.RUN_AWAY, AbilityId.ADAPTABILITY, AbilityId.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), + new PokemonForm("Partner", "partner", PokemonType.NORMAL, null, 0.3, 6.5, AbilityId.RUN_AWAY, AbilityId.ADAPTABILITY, AbilityId.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 18, 999.9, AbilityId.PROTEAN, AbilityId.PROTEAN, AbilityId.PROTEAN, 535, 110, 95, 70, 90, 85, 85, 45, 50, 65) + ), + new PokemonSpecies(SpeciesId.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", PokemonType.WATER, null, 1, 29, AbilityId.WATER_ABSORB, AbilityId.NONE, AbilityId.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.JOLTEON, 1, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.8, 24.5, AbilityId.VOLT_ABSORB, AbilityId.NONE, AbilityId.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.FLAREON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 0.9, 25, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.GUTS, 525, 65, 130, 60, 95, 110, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.PORYGON, 1, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.8, 36.5, AbilityId.TRACE, AbilityId.DOWNLOAD, AbilityId.ANALYTIC, 395, 65, 60, 70, 85, 75, 40, 45, 50, 79, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.OMANYTE, 1, false, false, false, "Spiral Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.4, 7.5, AbilityId.SWIFT_SWIM, AbilityId.SHELL_ARMOR, AbilityId.WEAK_ARMOR, 355, 35, 40, 100, 90, 55, 35, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.OMASTAR, 1, false, false, false, "Spiral Pokémon", PokemonType.ROCK, PokemonType.WATER, 1, 35, AbilityId.SWIFT_SWIM, AbilityId.SHELL_ARMOR, AbilityId.WEAK_ARMOR, 495, 70, 60, 125, 115, 70, 55, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.KABUTO, 1, false, false, false, "Shellfish Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.5, 11.5, AbilityId.SWIFT_SWIM, AbilityId.BATTLE_ARMOR, AbilityId.WEAK_ARMOR, 355, 30, 80, 90, 55, 45, 55, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.KABUTOPS, 1, false, false, false, "Shellfish Pokémon", PokemonType.ROCK, PokemonType.WATER, 1.3, 40.5, AbilityId.SWIFT_SWIM, AbilityId.BATTLE_ARMOR, AbilityId.WEAK_ARMOR, 495, 60, 115, 105, 65, 70, 80, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.AERODACTYL, 1, false, false, false, "Fossil Pokémon", PokemonType.ROCK, PokemonType.FLYING, 1.8, 59, AbilityId.ROCK_HEAD, AbilityId.PRESSURE, AbilityId.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, GrowthRate.SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FLYING, 1.8, 59, AbilityId.ROCK_HEAD, AbilityId.PRESSURE, AbilityId.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.FLYING, 2.1, 79, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, 615, 80, 135, 85, 70, 95, 150, 45, 50, 180) + ), + new PokemonSpecies(SpeciesId.SNORLAX, 1, false, false, false, "Sleeping Pokémon", PokemonType.NORMAL, null, 2.1, 460, AbilityId.IMMUNITY, AbilityId.THICK_FAT, AbilityId.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 2.1, 460, AbilityId.IMMUNITY, AbilityId.THICK_FAT, AbilityId.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 35, 999.9, AbilityId.HARVEST, AbilityId.HARVEST, AbilityId.HARVEST, 640, 210, 135, 70, 90, 115, 20, 25, 50, 189) + ), + new PokemonSpecies(SpeciesId.ARTICUNO, 1, true, false, false, "Freeze Pokémon", PokemonType.ICE, PokemonType.FLYING, 1.7, 55.4, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ZAPDOS, 1, true, false, false, "Electric Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.6, 52.6, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.MOLTRES, 1, true, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FLYING, 2, 60, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.FLAME_BODY, 580, 90, 100, 90, 125, 85, 90, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.DRATINI, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 1.8, 3.3, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.MARVEL_SCALE, 300, 41, 64, 45, 50, 50, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.DRAGONAIR, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 4, 16.5, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.MARVEL_SCALE, 420, 61, 84, 65, 70, 70, 70, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.DRAGONITE, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 2.2, 210, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.MULTISCALE, 600, 91, 134, 95, 100, 100, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.MEWTWO, 1, false, true, false, "Genetic Pokémon", PokemonType.PSYCHIC, null, 2, 122, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 2, 122, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, false, null, true), + new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, PokemonType.PSYCHIC, PokemonType.FIGHTING, 2.3, 127, AbilityId.STEADFAST, AbilityId.NONE, AbilityId.STEADFAST, 780, 106, 190, 100, 154, 100, 130, 3, 0, 340), + new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.PSYCHIC, null, 1.5, 33, AbilityId.INSOMNIA, AbilityId.NONE, AbilityId.INSOMNIA, 780, 106, 150, 70, 194, 120, 140, 3, 0, 340) + ), + new PokemonSpecies(SpeciesId.MEW, 1, false, false, true, "New Species Pokémon", PokemonType.PSYCHIC, null, 0.4, 4, AbilityId.SYNCHRONIZE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(SpeciesId.CHIKORITA, 2, false, false, false, "Leaf Pokémon", PokemonType.GRASS, null, 0.9, 6.4, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LEAF_GUARD, 318, 45, 49, 65, 49, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.BAYLEEF, 2, false, false, false, "Leaf Pokémon", PokemonType.GRASS, null, 1.2, 15.8, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LEAF_GUARD, 405, 60, 62, 80, 63, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.MEGANIUM, 2, false, false, false, "Herb Pokémon", PokemonType.GRASS, null, 1.8, 100.5, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LEAF_GUARD, 525, 80, 82, 100, 83, 100, 80, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(SpeciesId.CYNDAQUIL, 2, false, false, false, "Fire Mouse Pokémon", PokemonType.FIRE, null, 0.5, 7.9, AbilityId.BLAZE, AbilityId.NONE, AbilityId.FLASH_FIRE, 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.QUILAVA, 2, false, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 0.9, 19, AbilityId.BLAZE, AbilityId.NONE, AbilityId.FLASH_FIRE, 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.TYPHLOSION, 2, false, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 1.7, 79.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.FLASH_FIRE, 534, 78, 84, 78, 109, 85, 100, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.TOTODILE, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 0.6, 9.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHEER_FORCE, 314, 50, 65, 64, 44, 48, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.CROCONAW, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 1.1, 25, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHEER_FORCE, 405, 65, 80, 80, 59, 63, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.FERALIGATR, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 2.3, 88.8, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHEER_FORCE, 530, 85, 105, 100, 79, 83, 78, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.SENTRET, 2, false, false, false, "Scout Pokémon", PokemonType.NORMAL, null, 0.8, 6, AbilityId.RUN_AWAY, AbilityId.KEEN_EYE, AbilityId.FRISK, 215, 35, 46, 34, 35, 45, 20, 255, 70, 43, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FURRET, 2, false, false, false, "Long Body Pokémon", PokemonType.NORMAL, null, 1.8, 32.5, AbilityId.RUN_AWAY, AbilityId.KEEN_EYE, AbilityId.FRISK, 415, 85, 76, 64, 45, 55, 90, 90, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HOOTHOOT, 2, false, false, false, "Owl Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.7, 21.2, AbilityId.INSOMNIA, AbilityId.KEEN_EYE, AbilityId.TINTED_LENS, 262, 60, 30, 30, 36, 56, 50, 255, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.NOCTOWL, 2, false, false, false, "Owl Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.6, 40.8, AbilityId.INSOMNIA, AbilityId.KEEN_EYE, AbilityId.TINTED_LENS, 452, 100, 50, 50, 86, 96, 70, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LEDYBA, 2, false, false, false, "Five Star Pokémon", PokemonType.BUG, PokemonType.FLYING, 1, 10.8, AbilityId.SWARM, AbilityId.EARLY_BIRD, AbilityId.RATTLED, 265, 40, 20, 30, 40, 80, 55, 255, 70, 53, GrowthRate.FAST, 50, true), + new PokemonSpecies(SpeciesId.LEDIAN, 2, false, false, false, "Five Star Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.4, 35.6, AbilityId.SWARM, AbilityId.EARLY_BIRD, AbilityId.IRON_FIST, 390, 55, 35, 50, 55, 110, 85, 90, 70, 137, GrowthRate.FAST, 50, true), + new PokemonSpecies(SpeciesId.SPINARAK, 2, false, false, false, "String Spit Pokémon", PokemonType.BUG, PokemonType.POISON, 0.5, 8.5, AbilityId.SWARM, AbilityId.INSOMNIA, AbilityId.SNIPER, 250, 40, 60, 40, 40, 40, 30, 255, 70, 50, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.ARIADOS, 2, false, false, false, "Long Leg Pokémon", PokemonType.BUG, PokemonType.POISON, 1.1, 33.5, AbilityId.SWARM, AbilityId.INSOMNIA, AbilityId.SNIPER, 400, 70, 90, 70, 60, 70, 40, 90, 70, 140, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.CROBAT, 2, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 1.8, 75, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.INFILTRATOR, 535, 85, 90, 80, 70, 80, 130, 90, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CHINCHOU, 2, false, false, false, "Angler Pokémon", PokemonType.WATER, PokemonType.ELECTRIC, 0.5, 12, AbilityId.VOLT_ABSORB, AbilityId.ILLUMINATE, AbilityId.WATER_ABSORB, 330, 75, 38, 38, 56, 56, 67, 190, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.LANTURN, 2, false, false, false, "Light Pokémon", PokemonType.WATER, PokemonType.ELECTRIC, 1.2, 22.5, AbilityId.VOLT_ABSORB, AbilityId.ILLUMINATE, AbilityId.WATER_ABSORB, 460, 125, 58, 58, 76, 76, 67, 75, 50, 161, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.PICHU, 2, false, false, false, "Tiny Mouse Pokémon", PokemonType.ELECTRIC, null, 0.3, 2, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.4, 2, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), + new PokemonForm("Spiky-Eared", "spiky", PokemonType.ELECTRIC, null, 1.4, 2, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true) + ), + new PokemonSpecies(SpeciesId.CLEFFA, 2, false, false, false, "Star Shape Pokémon", PokemonType.FAIRY, null, 0.3, 3, AbilityId.CUTE_CHARM, AbilityId.MAGIC_GUARD, AbilityId.FRIEND_GUARD, 218, 50, 25, 28, 45, 55, 15, 150, 140, 44, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.IGGLYBUFF, 2, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.3, 1, AbilityId.CUTE_CHARM, AbilityId.COMPETITIVE, AbilityId.FRIEND_GUARD, 210, 90, 30, 15, 40, 20, 15, 170, 50, 42, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.TOGEPI, 2, false, false, false, "Spike Ball Pokémon", PokemonType.FAIRY, null, 0.3, 1.5, AbilityId.HUSTLE, AbilityId.SERENE_GRACE, AbilityId.SUPER_LUCK, 245, 35, 20, 65, 40, 65, 20, 190, 50, 49, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(SpeciesId.TOGETIC, 2, false, false, false, "Happiness Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 0.6, 3.2, AbilityId.HUSTLE, AbilityId.SERENE_GRACE, AbilityId.SUPER_LUCK, 405, 55, 40, 85, 80, 105, 40, 75, 50, 142, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(SpeciesId.NATU, 2, false, false, false, "Tiny Bird Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.2, 2, AbilityId.SYNCHRONIZE, AbilityId.EARLY_BIRD, AbilityId.MAGIC_BOUNCE, 320, 40, 50, 45, 70, 45, 70, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.XATU, 2, false, false, false, "Mystic Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.5, 15, AbilityId.SYNCHRONIZE, AbilityId.EARLY_BIRD, AbilityId.MAGIC_BOUNCE, 470, 65, 75, 70, 95, 70, 95, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.MAREEP, 2, false, false, false, "Wool Pokémon", PokemonType.ELECTRIC, null, 0.6, 7.8, AbilityId.STATIC, AbilityId.NONE, AbilityId.PLUS, 280, 55, 40, 40, 65, 45, 35, 235, 70, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.FLAAFFY, 2, false, false, false, "Wool Pokémon", PokemonType.ELECTRIC, null, 0.8, 13.3, AbilityId.STATIC, AbilityId.NONE, AbilityId.PLUS, 365, 70, 55, 55, 80, 60, 45, 120, 70, 128, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.AMPHAROS, 2, false, false, false, "Light Pokémon", PokemonType.ELECTRIC, null, 1.4, 61.5, AbilityId.STATIC, AbilityId.NONE, AbilityId.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.4, 61.5, AbilityId.STATIC, AbilityId.NONE, AbilityId.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ELECTRIC, PokemonType.DRAGON, 1.4, 61.5, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.MOLD_BREAKER, 610, 90, 95, 105, 165, 110, 45, 45, 70, 255) + ), + new PokemonSpecies(SpeciesId.BELLOSSOM, 2, false, false, false, "Flower Pokémon", PokemonType.GRASS, null, 0.4, 5.8, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.HEALER, 490, 75, 80, 95, 90, 100, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.MARILL, 2, false, false, false, "Aqua Mouse Pokémon", PokemonType.WATER, PokemonType.FAIRY, 0.4, 8.5, AbilityId.THICK_FAT, AbilityId.HUGE_POWER, AbilityId.SAP_SIPPER, 250, 70, 20, 50, 20, 50, 40, 190, 50, 88, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.AZUMARILL, 2, false, false, false, "Aqua Rabbit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 0.8, 28.5, AbilityId.THICK_FAT, AbilityId.HUGE_POWER, AbilityId.SAP_SIPPER, 420, 100, 50, 80, 60, 80, 50, 75, 50, 210, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.SUDOWOODO, 2, false, false, false, "Imitation Pokémon", PokemonType.ROCK, null, 1.2, 38, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.RATTLED, 410, 70, 100, 115, 30, 65, 30, 65, 50, 144, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.POLITOED, 2, false, false, false, "Frog Pokémon", PokemonType.WATER, null, 1.1, 33.9, AbilityId.WATER_ABSORB, AbilityId.DAMP, AbilityId.DRIZZLE, 500, 90, 75, 75, 90, 100, 70, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.HOPPIP, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.4, 0.5, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.INFILTRATOR, 250, 35, 35, 40, 35, 55, 50, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SKIPLOOM, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.6, 1, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.INFILTRATOR, 340, 55, 45, 50, 45, 65, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.JUMPLUFF, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.8, 3, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.INFILTRATOR, 460, 75, 55, 70, 55, 95, 110, 45, 70, 230, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.AIPOM, 2, false, false, false, "Long Tail Pokémon", PokemonType.NORMAL, null, 0.8, 11.5, AbilityId.RUN_AWAY, AbilityId.PICKUP, AbilityId.SKILL_LINK, 360, 55, 70, 55, 40, 55, 85, 45, 70, 72, GrowthRate.FAST, 50, true), + new PokemonSpecies(SpeciesId.SUNKERN, 2, false, false, false, "Seed Pokémon", PokemonType.GRASS, null, 0.3, 1.8, AbilityId.CHLOROPHYLL, AbilityId.SOLAR_POWER, AbilityId.EARLY_BIRD, 180, 30, 30, 30, 30, 30, 30, 235, 70, 36, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SUNFLORA, 2, false, false, false, "Sun Pokémon", PokemonType.GRASS, null, 0.8, 8.5, AbilityId.CHLOROPHYLL, AbilityId.SOLAR_POWER, AbilityId.EARLY_BIRD, 425, 75, 75, 55, 105, 85, 30, 120, 70, 149, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.YANMA, 2, false, false, false, "Clear Wing Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 38, AbilityId.SPEED_BOOST, AbilityId.COMPOUND_EYES, AbilityId.FRISK, 390, 65, 65, 45, 75, 45, 95, 75, 70, 78, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WOOPER, 2, false, false, false, "Water Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.4, 8.5, AbilityId.DAMP, AbilityId.WATER_ABSORB, AbilityId.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.QUAGSIRE, 2, false, false, false, "Water Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.4, 75, AbilityId.DAMP, AbilityId.WATER_ABSORB, AbilityId.UNAWARE, 430, 95, 85, 85, 65, 65, 35, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.ESPEON, 2, false, false, false, "Sun Pokémon", PokemonType.PSYCHIC, null, 0.9, 26.5, AbilityId.SYNCHRONIZE, AbilityId.NONE, AbilityId.MAGIC_BOUNCE, 525, 65, 65, 60, 130, 95, 110, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.UMBREON, 2, false, false, false, "Moonlight Pokémon", PokemonType.DARK, null, 1, 27, AbilityId.SYNCHRONIZE, AbilityId.NONE, AbilityId.INNER_FOCUS, 525, 95, 65, 110, 60, 130, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.MURKROW, 2, false, false, false, "Darkness Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.5, 2.1, AbilityId.INSOMNIA, AbilityId.SUPER_LUCK, AbilityId.PRANKSTER, 405, 60, 85, 42, 85, 42, 91, 30, 35, 81, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.SLOWKING, 2, false, false, false, "Royal Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 2, 79.5, AbilityId.OBLIVIOUS, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 75, 80, 100, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MISDREAVUS, 2, false, false, false, "Screech Pokémon", PokemonType.GHOST, null, 0.7, 1, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 435, 60, 60, 60, 85, 85, 85, 45, 35, 87, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.UNOWN, 2, false, false, false, "Symbol Pokémon", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, GrowthRate.MEDIUM_FAST, null, false, false, + new PokemonForm("A", "a", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("B", "b", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("C", "c", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("D", "d", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("E", "e", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("F", "f", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("G", "g", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("H", "h", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("I", "i", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("J", "j", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("K", "k", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("L", "l", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("M", "m", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("N", "n", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("O", "o", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("P", "p", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Q", "q", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("R", "r", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("S", "s", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("T", "t", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("U", "u", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("V", "v", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("W", "w", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("X", "x", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Y", "y", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("Z", "z", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("!", "exclamation", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), + new PokemonForm("?", "question", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true) + ), + new PokemonSpecies(SpeciesId.WOBBUFFET, 2, false, false, false, "Patient Pokémon", PokemonType.PSYCHIC, null, 1.3, 28.5, AbilityId.SHADOW_TAG, AbilityId.NONE, AbilityId.TELEPATHY, 405, 190, 33, 58, 33, 58, 33, 45, 50, 142, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.GIRAFARIG, 2, false, false, false, "Long Neck Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.5, 41.5, AbilityId.INNER_FOCUS, AbilityId.EARLY_BIRD, AbilityId.SAP_SIPPER, 455, 70, 80, 65, 90, 65, 85, 60, 70, 159, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.PINECO, 2, false, false, false, "Bagworm Pokémon", PokemonType.BUG, null, 0.6, 7.2, AbilityId.STURDY, AbilityId.NONE, AbilityId.OVERCOAT, 290, 50, 65, 90, 35, 35, 15, 190, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FORRETRESS, 2, false, false, false, "Bagworm Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.2, 125.8, AbilityId.STURDY, AbilityId.NONE, AbilityId.OVERCOAT, 465, 75, 90, 140, 60, 60, 40, 75, 70, 163, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DUNSPARCE, 2, false, false, false, "Land Snake Pokémon", PokemonType.NORMAL, null, 1.5, 14, AbilityId.SERENE_GRACE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 415, 100, 70, 70, 65, 65, 45, 190, 50, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GLIGAR, 2, false, false, false, "Fly Scorpion Pokémon", PokemonType.GROUND, PokemonType.FLYING, 1.1, 64.8, AbilityId.HYPER_CUTTER, AbilityId.SAND_VEIL, AbilityId.IMMUNITY, 430, 65, 75, 105, 35, 65, 85, 60, 70, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.STEELIX, 2, false, false, false, "Iron Snake Pokémon", PokemonType.STEEL, PokemonType.GROUND, 9.2, 400, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.GROUND, 9.2, 400, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.GROUND, 10.5, 740, AbilityId.SAND_FORCE, AbilityId.SAND_FORCE, AbilityId.SAND_FORCE, 610, 75, 125, 230, 55, 95, 30, 25, 50, 179, true) + ), + new PokemonSpecies(SpeciesId.SNUBBULL, 2, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 0.6, 7.8, AbilityId.INTIMIDATE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 300, 60, 80, 50, 40, 40, 30, 190, 70, 60, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.GRANBULL, 2, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 1.4, 48.7, AbilityId.INTIMIDATE, AbilityId.QUICK_FEET, AbilityId.RATTLED, 450, 90, 120, 75, 60, 60, 45, 75, 70, 158, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.QWILFISH, 2, false, false, false, "Balloon Pokémon", PokemonType.WATER, PokemonType.POISON, 0.5, 3.9, AbilityId.POISON_POINT, AbilityId.SWIFT_SWIM, AbilityId.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SCIZOR, 2, false, false, false, "Pincer Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.8, 118, AbilityId.SWARM, AbilityId.TECHNICIAN, AbilityId.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.STEEL, 1.8, 118, AbilityId.SWARM, AbilityId.TECHNICIAN, AbilityId.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.STEEL, 2, 125, AbilityId.TECHNICIAN, AbilityId.TECHNICIAN, AbilityId.TECHNICIAN, 600, 70, 150, 140, 65, 100, 75, 25, 50, 175, true) + ), + new PokemonSpecies(SpeciesId.SHUCKLE, 2, false, false, false, "Mold Pokémon", PokemonType.BUG, PokemonType.ROCK, 0.6, 20.5, AbilityId.STURDY, AbilityId.GLUTTONY, AbilityId.CONTRARY, 505, 20, 10, 230, 10, 230, 5, 190, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.HERACROSS, 2, false, false, false, "Single Horn Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.5, 54, AbilityId.SWARM, AbilityId.GUTS, AbilityId.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.FIGHTING, 1.5, 54, AbilityId.SWARM, AbilityId.GUTS, AbilityId.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.FIGHTING, 1.7, 62.5, AbilityId.SKILL_LINK, AbilityId.SKILL_LINK, AbilityId.SKILL_LINK, 600, 80, 185, 115, 40, 105, 75, 45, 50, 175, true) + ), + new PokemonSpecies(SpeciesId.SNEASEL, 2, false, false, false, "Sharp Claw Pokémon", PokemonType.DARK, PokemonType.ICE, 0.9, 28, AbilityId.INNER_FOCUS, AbilityId.KEEN_EYE, AbilityId.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.TEDDIURSA, 2, false, false, false, "Little Bear Pokémon", PokemonType.NORMAL, null, 0.6, 8.8, AbilityId.PICKUP, AbilityId.QUICK_FEET, AbilityId.HONEY_GATHER, 330, 60, 80, 50, 50, 50, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.URSARING, 2, false, false, false, "Hibernator Pokémon", PokemonType.NORMAL, null, 1.8, 125.8, AbilityId.GUTS, AbilityId.QUICK_FEET, AbilityId.UNNERVE, 500, 90, 130, 75, 75, 75, 55, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.SLUGMA, 2, false, false, false, "Lava Pokémon", PokemonType.FIRE, null, 0.7, 35, AbilityId.MAGMA_ARMOR, AbilityId.FLAME_BODY, AbilityId.WEAK_ARMOR, 250, 40, 40, 40, 70, 40, 20, 190, 70, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MAGCARGO, 2, false, false, false, "Lava Pokémon", PokemonType.FIRE, PokemonType.ROCK, 0.8, 55, AbilityId.MAGMA_ARMOR, AbilityId.FLAME_BODY, AbilityId.WEAK_ARMOR, 430, 60, 50, 120, 90, 80, 30, 75, 70, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SWINUB, 2, false, false, false, "Pig Pokémon", PokemonType.ICE, PokemonType.GROUND, 0.4, 6.5, AbilityId.OBLIVIOUS, AbilityId.SNOW_CLOAK, AbilityId.THICK_FAT, 250, 50, 50, 40, 30, 30, 50, 225, 50, 50, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.PILOSWINE, 2, false, false, false, "Swine Pokémon", PokemonType.ICE, PokemonType.GROUND, 1.1, 55.8, AbilityId.OBLIVIOUS, AbilityId.SNOW_CLOAK, AbilityId.THICK_FAT, 450, 100, 100, 80, 60, 60, 50, 75, 50, 158, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.CORSOLA, 2, false, false, false, "Coral Pokémon", PokemonType.WATER, PokemonType.ROCK, 0.6, 5, AbilityId.HUSTLE, AbilityId.NATURAL_CURE, AbilityId.REGENERATOR, 410, 65, 55, 95, 65, 95, 35, 60, 50, 144, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.REMORAID, 2, false, false, false, "Jet Pokémon", PokemonType.WATER, null, 0.6, 12, AbilityId.HUSTLE, AbilityId.SNIPER, AbilityId.MOODY, 300, 35, 65, 35, 65, 35, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.OCTILLERY, 2, false, false, false, "Jet Pokémon", PokemonType.WATER, null, 0.9, 28.5, AbilityId.SUCTION_CUPS, AbilityId.SNIPER, AbilityId.MOODY, 480, 75, 105, 75, 105, 75, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.DELIBIRD, 2, false, false, false, "Delivery Pokémon", PokemonType.ICE, PokemonType.FLYING, 0.9, 16, AbilityId.VITAL_SPIRIT, AbilityId.HUSTLE, AbilityId.INSOMNIA, 330, 45, 55, 45, 65, 45, 75, 45, 50, 116, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.MANTINE, 2, false, false, false, "Kite Pokémon", PokemonType.WATER, PokemonType.FLYING, 2.1, 220, AbilityId.SWIFT_SWIM, AbilityId.WATER_ABSORB, AbilityId.WATER_VEIL, 485, 85, 40, 70, 80, 140, 70, 25, 50, 170, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.SKARMORY, 2, false, false, false, "Armor Bird Pokémon", PokemonType.STEEL, PokemonType.FLYING, 1.7, 50.5, AbilityId.KEEN_EYE, AbilityId.STURDY, AbilityId.WEAK_ARMOR, 465, 65, 80, 140, 40, 70, 70, 25, 50, 163, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.HOUNDOUR, 2, false, false, false, "Dark Pokémon", PokemonType.DARK, PokemonType.FIRE, 0.6, 10.8, AbilityId.EARLY_BIRD, AbilityId.FLASH_FIRE, AbilityId.UNNERVE, 330, 45, 60, 30, 80, 50, 65, 120, 35, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.HOUNDOOM, 2, false, false, false, "Dark Pokémon", PokemonType.DARK, PokemonType.FIRE, 1.4, 35, AbilityId.EARLY_BIRD, AbilityId.FLASH_FIRE, AbilityId.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.FIRE, 1.4, 35, AbilityId.EARLY_BIRD, AbilityId.FLASH_FIRE, AbilityId.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, PokemonType.FIRE, 1.9, 49.5, AbilityId.SOLAR_POWER, AbilityId.SOLAR_POWER, AbilityId.SOLAR_POWER, 600, 75, 90, 90, 140, 90, 115, 45, 35, 175, true) + ), + new PokemonSpecies(SpeciesId.KINGDRA, 2, false, false, false, "Dragon Pokémon", PokemonType.WATER, PokemonType.DRAGON, 1.8, 152, AbilityId.SWIFT_SWIM, AbilityId.SNIPER, AbilityId.DAMP, 540, 75, 95, 95, 95, 95, 85, 45, 50, 270, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PHANPY, 2, false, false, false, "Long Nose Pokémon", PokemonType.GROUND, null, 0.5, 33.5, AbilityId.PICKUP, AbilityId.NONE, AbilityId.SAND_VEIL, 330, 90, 60, 60, 40, 40, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DONPHAN, 2, false, false, false, "Armor Pokémon", PokemonType.GROUND, null, 1.1, 120, AbilityId.STURDY, AbilityId.NONE, AbilityId.SAND_VEIL, 500, 90, 120, 120, 60, 60, 50, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.PORYGON2, 2, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.6, 32.5, AbilityId.TRACE, AbilityId.DOWNLOAD, AbilityId.ANALYTIC, 515, 85, 80, 90, 105, 95, 60, 45, 50, 180, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.STANTLER, 2, false, false, false, "Big Horn Pokémon", PokemonType.NORMAL, null, 1.4, 71.2, AbilityId.INTIMIDATE, AbilityId.FRISK, AbilityId.SAP_SIPPER, 465, 73, 95, 62, 85, 65, 85, 45, 70, 163, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.SMEARGLE, 2, false, false, false, "Painter Pokémon", PokemonType.NORMAL, null, 1.2, 58, AbilityId.OWN_TEMPO, AbilityId.TECHNICIAN, AbilityId.MOODY, 250, 55, 20, 35, 20, 45, 75, 45, 70, 88, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.TYROGUE, 2, false, false, false, "Scuffle Pokémon", PokemonType.FIGHTING, null, 0.7, 21, AbilityId.GUTS, AbilityId.STEADFAST, AbilityId.VITAL_SPIRIT, 210, 35, 35, 35, 35, 35, 35, 75, 50, 42, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.HITMONTOP, 2, false, false, false, "Handstand Pokémon", PokemonType.FIGHTING, null, 1.4, 48, AbilityId.INTIMIDATE, AbilityId.TECHNICIAN, AbilityId.STEADFAST, 455, 50, 95, 95, 35, 110, 70, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.SMOOCHUM, 2, false, false, false, "Kiss Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 0.4, 6, AbilityId.OBLIVIOUS, AbilityId.FOREWARN, AbilityId.HYDRATION, 305, 45, 30, 15, 85, 65, 65, 45, 50, 61, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(SpeciesId.ELEKID, 2, false, false, false, "Electric Pokémon", PokemonType.ELECTRIC, null, 0.6, 23.5, AbilityId.STATIC, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 360, 45, 63, 37, 65, 55, 95, 45, 50, 72, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(SpeciesId.MAGBY, 2, false, false, false, "Live Coal Pokémon", PokemonType.FIRE, null, 0.7, 21.4, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 365, 45, 75, 37, 70, 55, 83, 45, 50, 73, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(SpeciesId.MILTANK, 2, false, false, false, "Milk Cow Pokémon", PokemonType.NORMAL, null, 1.2, 75.5, AbilityId.THICK_FAT, AbilityId.SCRAPPY, AbilityId.SAP_SIPPER, 490, 95, 80, 105, 40, 70, 100, 45, 50, 172, GrowthRate.SLOW, 0, false), + new PokemonSpecies(SpeciesId.BLISSEY, 2, false, false, false, "Happiness Pokémon", PokemonType.NORMAL, null, 1.5, 46.8, AbilityId.NATURAL_CURE, AbilityId.SERENE_GRACE, AbilityId.HEALER, 540, 255, 10, 10, 75, 135, 55, 30, 140, 608, GrowthRate.FAST, 0, false), + new PokemonSpecies(SpeciesId.RAIKOU, 2, true, false, false, "Thunder Pokémon", PokemonType.ELECTRIC, null, 1.9, 178, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.INNER_FOCUS, 580, 90, 85, 75, 115, 100, 115, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ENTEI, 2, true, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 2.1, 198, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.INNER_FOCUS, 580, 115, 115, 85, 90, 75, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SUICUNE, 2, true, false, false, "Aurora Pokémon", PokemonType.WATER, null, 2, 187, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.INNER_FOCUS, 580, 100, 75, 115, 90, 115, 85, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.LARVITAR, 2, false, false, false, "Rock Skin Pokémon", PokemonType.ROCK, PokemonType.GROUND, 0.6, 72, AbilityId.GUTS, AbilityId.NONE, AbilityId.SAND_VEIL, 300, 50, 64, 50, 45, 50, 41, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.PUPITAR, 2, false, false, false, "Hard Shell Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1.2, 152, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 410, 70, 84, 70, 65, 70, 51, 45, 35, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.TYRANITAR, 2, false, false, false, "Armor Pokémon", PokemonType.ROCK, PokemonType.DARK, 2, 202, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.DARK, 2, 202, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.DARK, 2.5, 255, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.SAND_STREAM, 700, 100, 164, 150, 95, 120, 71, 45, 35, 300) + ), + new PokemonSpecies(SpeciesId.LUGIA, 2, false, true, false, "Diving Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 5.2, 216, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.MULTISCALE, 680, 106, 90, 130, 90, 154, 110, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.HO_OH, 2, false, true, false, "Rainbow Pokémon", PokemonType.FIRE, PokemonType.FLYING, 3.8, 199, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.REGENERATOR, 680, 106, 130, 90, 110, 154, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.CELEBI, 2, false, false, true, "Time Travel Pokémon", PokemonType.PSYCHIC, PokemonType.GRASS, 0.6, 5, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(SpeciesId.TREECKO, 3, false, false, false, "Wood Gecko Pokémon", PokemonType.GRASS, null, 0.5, 5, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.UNBURDEN, 310, 40, 45, 35, 65, 55, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.GROVYLE, 3, false, false, false, "Wood Gecko Pokémon", PokemonType.GRASS, null, 0.9, 21.6, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.UNBURDEN, 405, 50, 65, 45, 85, 65, 95, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.SCEPTILE, 3, false, false, false, "Forest Pokémon", PokemonType.GRASS, null, 1.7, 52.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, null, 1.7, 52.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.DRAGON, 1.9, 55.2, AbilityId.LIGHTNING_ROD, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 630, 70, 110, 75, 145, 85, 145, 45, 50, 265) + ), + new PokemonSpecies(SpeciesId.TORCHIC, 3, false, false, false, "Chick Pokémon", PokemonType.FIRE, null, 0.4, 2.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SPEED_BOOST, 310, 45, 60, 40, 70, 50, 45, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(SpeciesId.COMBUSKEN, 3, false, false, false, "Young Fowl Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 0.9, 19.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SPEED_BOOST, 405, 60, 85, 60, 85, 60, 55, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(SpeciesId.BLAZIKEN, 3, false, false, false, "Blaze Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, true, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, AbilityId.SPEED_BOOST, AbilityId.NONE, AbilityId.SPEED_BOOST, 630, 80, 160, 80, 130, 80, 100, 45, 50, 265, true) + ), + new PokemonSpecies(SpeciesId.MUDKIP, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, null, 0.4, 7.6, AbilityId.TORRENT, AbilityId.NONE, AbilityId.DAMP, 310, 50, 70, 50, 50, 50, 40, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.MARSHTOMP, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.7, 28, AbilityId.TORRENT, AbilityId.NONE, AbilityId.DAMP, 405, 70, 85, 70, 60, 70, 50, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.SWAMPERT, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.5, 81.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.GROUND, 1.5, 81.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.GROUND, 1.9, 102, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.SWIFT_SWIM, 635, 100, 150, 110, 95, 110, 70, 45, 50, 268) + ), + new PokemonSpecies(SpeciesId.POOCHYENA, 3, false, false, false, "Bite Pokémon", PokemonType.DARK, null, 0.5, 13.6, AbilityId.RUN_AWAY, AbilityId.QUICK_FEET, AbilityId.RATTLED, 220, 35, 55, 35, 30, 30, 35, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MIGHTYENA, 3, false, false, false, "Bite Pokémon", PokemonType.DARK, null, 1, 37, AbilityId.INTIMIDATE, AbilityId.QUICK_FEET, AbilityId.MOXIE, 420, 70, 90, 70, 60, 60, 70, 127, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ZIGZAGOON, 3, false, false, false, "Tiny Raccoon Pokémon", PokemonType.NORMAL, null, 0.4, 17.5, AbilityId.PICKUP, AbilityId.GLUTTONY, AbilityId.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LINOONE, 3, false, false, false, "Rushing Pokémon", PokemonType.NORMAL, null, 0.5, 32.5, AbilityId.PICKUP, AbilityId.GLUTTONY, AbilityId.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WURMPLE, 3, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 3.6, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.RUN_AWAY, 195, 45, 45, 35, 20, 30, 20, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SILCOON, 3, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.6, 10, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BEAUTIFLY, 3, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1, 28.4, AbilityId.SWARM, AbilityId.NONE, AbilityId.RIVALRY, 395, 60, 70, 50, 100, 50, 65, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.CASCOON, 3, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 11.5, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DUSTOX, 3, false, false, false, "Poison Moth Pokémon", PokemonType.BUG, PokemonType.POISON, 1.2, 31.6, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.COMPOUND_EYES, 385, 60, 50, 70, 50, 90, 65, 45, 70, 193, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.LOTAD, 3, false, false, false, "Water Weed Pokémon", PokemonType.WATER, PokemonType.GRASS, 0.5, 2.6, AbilityId.SWIFT_SWIM, AbilityId.RAIN_DISH, AbilityId.OWN_TEMPO, 220, 40, 30, 30, 40, 50, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.LOMBRE, 3, false, false, false, "Jolly Pokémon", PokemonType.WATER, PokemonType.GRASS, 1.2, 32.5, AbilityId.SWIFT_SWIM, AbilityId.RAIN_DISH, AbilityId.OWN_TEMPO, 340, 60, 50, 50, 60, 70, 50, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.LUDICOLO, 3, false, false, false, "Carefree Pokémon", PokemonType.WATER, PokemonType.GRASS, 1.5, 55, AbilityId.SWIFT_SWIM, AbilityId.RAIN_DISH, AbilityId.OWN_TEMPO, 480, 80, 70, 70, 90, 100, 70, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.SEEDOT, 3, false, false, false, "Acorn Pokémon", PokemonType.GRASS, null, 0.5, 4, AbilityId.CHLOROPHYLL, AbilityId.EARLY_BIRD, AbilityId.PICKPOCKET, 220, 40, 40, 50, 30, 30, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.NUZLEAF, 3, false, false, false, "Wily Pokémon", PokemonType.GRASS, PokemonType.DARK, 1, 28, AbilityId.CHLOROPHYLL, AbilityId.EARLY_BIRD, AbilityId.PICKPOCKET, 340, 70, 70, 40, 60, 40, 60, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.SHIFTRY, 3, false, false, false, "Wicked Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.3, 59.6, AbilityId.CHLOROPHYLL, AbilityId.WIND_RIDER, AbilityId.PICKPOCKET, 480, 90, 100, 60, 90, 60, 80, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.TAILLOW, 3, false, false, false, "Tiny Swallow Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2.3, AbilityId.GUTS, AbilityId.NONE, AbilityId.SCRAPPY, 270, 40, 55, 30, 30, 30, 85, 200, 70, 54, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SWELLOW, 3, false, false, false, "Swallow Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.7, 19.8, AbilityId.GUTS, AbilityId.NONE, AbilityId.SCRAPPY, 455, 60, 85, 60, 75, 50, 125, 45, 70, 159, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.WINGULL, 3, false, false, false, "Seagull Pokémon", PokemonType.WATER, PokemonType.FLYING, 0.6, 9.5, AbilityId.KEEN_EYE, AbilityId.HYDRATION, AbilityId.RAIN_DISH, 270, 40, 30, 30, 55, 30, 85, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PELIPPER, 3, false, false, false, "Water Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 1.2, 28, AbilityId.KEEN_EYE, AbilityId.DRIZZLE, AbilityId.RAIN_DISH, 440, 60, 50, 100, 95, 70, 65, 45, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.RALTS, 3, false, false, false, "Feeling Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.4, 6.6, AbilityId.SYNCHRONIZE, AbilityId.TRACE, AbilityId.TELEPATHY, 198, 28, 25, 25, 45, 35, 40, 235, 35, 40, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.KIRLIA, 3, false, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.8, 20.2, AbilityId.SYNCHRONIZE, AbilityId.TRACE, AbilityId.TELEPATHY, 278, 38, 35, 35, 65, 55, 50, 120, 35, 97, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.GARDEVOIR, 3, false, false, false, "Embrace Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, AbilityId.SYNCHRONIZE, AbilityId.TRACE, AbilityId.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, AbilityId.SYNCHRONIZE, AbilityId.TRACE, AbilityId.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, AbilityId.PIXILATE, AbilityId.PIXILATE, AbilityId.PIXILATE, 618, 68, 85, 65, 165, 135, 100, 45, 35, 259) + ), + new PokemonSpecies(SpeciesId.SURSKIT, 3, false, false, false, "Pond Skater Pokémon", PokemonType.BUG, PokemonType.WATER, 0.5, 1.7, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.RAIN_DISH, 269, 40, 30, 32, 50, 52, 65, 200, 70, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MASQUERAIN, 3, false, false, false, "Eyeball Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.8, 3.6, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.UNNERVE, 454, 70, 60, 62, 100, 82, 80, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SHROOMISH, 3, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, null, 0.4, 4.5, AbilityId.EFFECT_SPORE, AbilityId.POISON_HEAL, AbilityId.QUICK_FEET, 295, 60, 40, 60, 40, 60, 35, 255, 70, 59, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.BRELOOM, 3, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.2, 39.2, AbilityId.EFFECT_SPORE, AbilityId.POISON_HEAL, AbilityId.TECHNICIAN, 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.SLAKOTH, 3, false, false, false, "Slacker Pokémon", PokemonType.NORMAL, null, 0.8, 24, AbilityId.TRUANT, AbilityId.NONE, AbilityId.STALL, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(SpeciesId.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", PokemonType.NORMAL, null, 1.4, 46.5, AbilityId.VITAL_SPIRIT, AbilityId.NONE, AbilityId.INSOMNIA, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(SpeciesId.SLAKING, 3, false, false, false, "Lazy Pokémon", PokemonType.NORMAL, null, 2, 130.5, AbilityId.TRUANT, AbilityId.NONE, AbilityId.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 285, GrowthRate.SLOW, 50, false), //Custom Hidden + new PokemonSpecies(SpeciesId.NINCADA, 3, false, false, false, "Trainee Pokémon", PokemonType.BUG, PokemonType.GROUND, 0.5, 5.5, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.RUN_AWAY, 266, 31, 45, 90, 30, 30, 40, 255, 50, 53, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.NINJASK, 3, false, false, false, "Ninja Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.8, 12, AbilityId.SPEED_BOOST, AbilityId.NONE, AbilityId.INFILTRATOR, 456, 61, 90, 45, 50, 50, 160, 120, 50, 160, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.SHEDINJA, 3, false, false, false, "Shed Pokémon", PokemonType.BUG, PokemonType.GHOST, 0.8, 1.2, AbilityId.WONDER_GUARD, AbilityId.NONE, AbilityId.NONE, 236, 1, 90, 45, 30, 30, 40, 45, 50, 83, GrowthRate.ERRATIC, null, false), + new PokemonSpecies(SpeciesId.WHISMUR, 3, false, false, false, "Whisper Pokémon", PokemonType.NORMAL, null, 0.6, 16.3, AbilityId.SOUNDPROOF, AbilityId.NONE, AbilityId.RATTLED, 240, 64, 51, 23, 51, 23, 28, 190, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.LOUDRED, 3, false, false, false, "Big Voice Pokémon", PokemonType.NORMAL, null, 1, 40.5, AbilityId.SOUNDPROOF, AbilityId.NONE, AbilityId.SCRAPPY, 360, 84, 71, 43, 71, 43, 48, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.EXPLOUD, 3, false, false, false, "Loud Noise Pokémon", PokemonType.NORMAL, null, 1.5, 84, AbilityId.SOUNDPROOF, AbilityId.NONE, AbilityId.SCRAPPY, 490, 104, 91, 63, 91, 73, 68, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.MAKUHITA, 3, false, false, false, "Guts Pokémon", PokemonType.FIGHTING, null, 1, 86.4, AbilityId.THICK_FAT, AbilityId.GUTS, AbilityId.SHEER_FORCE, 237, 72, 60, 30, 20, 30, 25, 180, 70, 47, GrowthRate.FLUCTUATING, 75, false), + new PokemonSpecies(SpeciesId.HARIYAMA, 3, false, false, false, "Arm Thrust Pokémon", PokemonType.FIGHTING, null, 2.3, 253.8, AbilityId.THICK_FAT, AbilityId.GUTS, AbilityId.SHEER_FORCE, 474, 144, 120, 60, 40, 60, 50, 200, 70, 166, GrowthRate.FLUCTUATING, 75, false), + new PokemonSpecies(SpeciesId.AZURILL, 3, false, false, false, "Polka Dot Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.2, 2, AbilityId.THICK_FAT, AbilityId.HUGE_POWER, AbilityId.SAP_SIPPER, 190, 50, 20, 40, 20, 40, 20, 150, 50, 38, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.NOSEPASS, 3, false, false, false, "Compass Pokémon", PokemonType.ROCK, null, 1, 97, AbilityId.STURDY, AbilityId.MAGNET_PULL, AbilityId.SAND_FORCE, 375, 30, 45, 135, 45, 90, 30, 255, 70, 75, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SKITTY, 3, false, false, false, "Kitten Pokémon", PokemonType.NORMAL, null, 0.6, 11, AbilityId.CUTE_CHARM, AbilityId.NORMALIZE, AbilityId.WONDER_SKIN, 260, 50, 45, 45, 35, 35, 50, 255, 70, 52, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.DELCATTY, 3, false, false, false, "Prim Pokémon", PokemonType.NORMAL, null, 1.1, 32.6, AbilityId.CUTE_CHARM, AbilityId.NORMALIZE, AbilityId.WONDER_SKIN, 400, 70, 65, 65, 55, 55, 90, 60, 70, 140, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.SABLEYE, 3, false, false, false, "Darkness Pokémon", PokemonType.DARK, PokemonType.GHOST, 0.5, 11, AbilityId.KEEN_EYE, AbilityId.STALL, AbilityId.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.GHOST, 0.5, 11, AbilityId.KEEN_EYE, AbilityId.STALL, AbilityId.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, PokemonType.GHOST, 0.5, 161, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, 480, 50, 85, 125, 85, 115, 20, 45, 35, 133) + ), + new PokemonSpecies(SpeciesId.MAWILE, 3, false, false, false, "Deceiver Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 0.6, 11.5, AbilityId.HYPER_CUTTER, AbilityId.INTIMIDATE, AbilityId.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, GrowthRate.FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.FAIRY, 0.6, 11.5, AbilityId.HYPER_CUTTER, AbilityId.INTIMIDATE, AbilityId.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.FAIRY, 1, 23.5, AbilityId.HUGE_POWER, AbilityId.HUGE_POWER, AbilityId.HUGE_POWER, 480, 50, 105, 125, 55, 95, 50, 45, 50, 133) + ), + new PokemonSpecies(SpeciesId.ARON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 0.4, 60, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.HEAVY_METAL, 330, 50, 70, 100, 40, 40, 30, 180, 35, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.LAIRON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 0.9, 120, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.HEAVY_METAL, 430, 60, 90, 140, 50, 50, 40, 90, 35, 151, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.AGGRON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 2.1, 360, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.ROCK, 2.1, 360, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, null, 2.2, 395, AbilityId.FILTER, AbilityId.FILTER, AbilityId.FILTER, 630, 70, 140, 230, 60, 80, 50, 45, 35, 265) + ), + new PokemonSpecies(SpeciesId.MEDITITE, 3, false, false, false, "Meditate Pokémon", PokemonType.FIGHTING, PokemonType.PSYCHIC, 0.6, 11.2, AbilityId.PURE_POWER, AbilityId.NONE, AbilityId.TELEPATHY, 280, 30, 40, 55, 40, 55, 60, 180, 70, 56, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.MEDICHAM, 3, false, false, false, "Meditate Pokémon", PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, AbilityId.PURE_POWER, AbilityId.NONE, AbilityId.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, AbilityId.PURE_POWER, AbilityId.NONE, AbilityId.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, AbilityId.PURE_POWER, AbilityId.NONE, AbilityId.PURE_POWER, 510, 60, 100, 85, 80, 85, 100, 90, 70, 144, true) + ), + new PokemonSpecies(SpeciesId.ELECTRIKE, 3, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.6, 15.2, AbilityId.STATIC, AbilityId.LIGHTNING_ROD, AbilityId.MINUS, 295, 40, 45, 40, 65, 40, 65, 120, 50, 59, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.MANECTRIC, 3, false, false, false, "Discharge Pokémon", PokemonType.ELECTRIC, null, 1.5, 40.2, AbilityId.STATIC, AbilityId.LIGHTNING_ROD, AbilityId.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.5, 40.2, AbilityId.STATIC, AbilityId.LIGHTNING_ROD, AbilityId.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ELECTRIC, null, 1.8, 44, AbilityId.INTIMIDATE, AbilityId.INTIMIDATE, AbilityId.INTIMIDATE, 575, 70, 75, 80, 135, 80, 135, 45, 50, 166) + ), + new PokemonSpecies(SpeciesId.PLUSLE, 3, false, false, false, "Cheering Pokémon", PokemonType.ELECTRIC, null, 0.4, 4.2, AbilityId.PLUS, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 405, 60, 50, 40, 85, 75, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MINUN, 3, false, false, false, "Cheering Pokémon", PokemonType.ELECTRIC, null, 0.4, 4.2, AbilityId.MINUS, AbilityId.NONE, AbilityId.VOLT_ABSORB, 405, 60, 40, 50, 75, 85, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.VOLBEAT, 3, false, false, false, "Firefly Pokémon", PokemonType.BUG, null, 0.7, 17.7, AbilityId.ILLUMINATE, AbilityId.SWARM, AbilityId.PRANKSTER, 430, 65, 73, 75, 47, 85, 85, 150, 70, 151, GrowthRate.ERRATIC, 100, false), + new PokemonSpecies(SpeciesId.ILLUMISE, 3, false, false, false, "Firefly Pokémon", PokemonType.BUG, null, 0.6, 17.7, AbilityId.OBLIVIOUS, AbilityId.TINTED_LENS, AbilityId.PRANKSTER, 430, 65, 47, 75, 73, 85, 85, 150, 70, 151, GrowthRate.FLUCTUATING, 0, false), + new PokemonSpecies(SpeciesId.ROSELIA, 3, false, false, false, "Thorn Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.3, 2, AbilityId.NATURAL_CURE, AbilityId.POISON_POINT, AbilityId.LEAF_GUARD, 400, 50, 60, 45, 100, 80, 65, 150, 50, 140, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.GULPIN, 3, false, false, false, "Stomach Pokémon", PokemonType.POISON, null, 0.4, 10.3, AbilityId.LIQUID_OOZE, AbilityId.STICKY_HOLD, AbilityId.GLUTTONY, 302, 70, 43, 53, 43, 53, 40, 225, 70, 60, GrowthRate.FLUCTUATING, 50, true), + new PokemonSpecies(SpeciesId.SWALOT, 3, false, false, false, "Poison Bag Pokémon", PokemonType.POISON, null, 1.7, 80, AbilityId.LIQUID_OOZE, AbilityId.STICKY_HOLD, AbilityId.GLUTTONY, 467, 100, 73, 83, 73, 83, 55, 75, 70, 163, GrowthRate.FLUCTUATING, 50, true), + new PokemonSpecies(SpeciesId.CARVANHA, 3, false, false, false, "Savage Pokémon", PokemonType.WATER, PokemonType.DARK, 0.8, 20.8, AbilityId.ROUGH_SKIN, AbilityId.NONE, AbilityId.SPEED_BOOST, 305, 45, 90, 20, 65, 20, 65, 225, 35, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.SHARPEDO, 3, false, false, false, "Brutal Pokémon", PokemonType.WATER, PokemonType.DARK, 1.8, 88.8, AbilityId.ROUGH_SKIN, AbilityId.NONE, AbilityId.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DARK, 1.8, 88.8, AbilityId.ROUGH_SKIN, AbilityId.NONE, AbilityId.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.DARK, 2.5, 130.3, AbilityId.STRONG_JAW, AbilityId.NONE, AbilityId.STRONG_JAW, 560, 70, 140, 70, 110, 65, 105, 60, 35, 161) + ), + new PokemonSpecies(SpeciesId.WAILMER, 3, false, false, false, "Ball Whale Pokémon", PokemonType.WATER, null, 2, 130, AbilityId.WATER_VEIL, AbilityId.OBLIVIOUS, AbilityId.PRESSURE, 400, 130, 70, 35, 70, 35, 60, 125, 50, 80, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.WAILORD, 3, false, false, false, "Float Whale Pokémon", PokemonType.WATER, null, 14.5, 398, AbilityId.WATER_VEIL, AbilityId.OBLIVIOUS, AbilityId.PRESSURE, 500, 170, 90, 45, 90, 45, 60, 60, 50, 175, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.NUMEL, 3, false, false, false, "Numb Pokémon", PokemonType.FIRE, PokemonType.GROUND, 0.7, 24, AbilityId.OBLIVIOUS, AbilityId.SIMPLE, AbilityId.OWN_TEMPO, 305, 60, 60, 40, 65, 45, 35, 255, 70, 61, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.CAMERUPT, 3, false, false, false, "Eruption Pokémon", PokemonType.FIRE, PokemonType.GROUND, 1.9, 220, AbilityId.MAGMA_ARMOR, AbilityId.SOLID_ROCK, AbilityId.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, GrowthRate.MEDIUM_FAST, 50, true, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.GROUND, 1.9, 220, AbilityId.MAGMA_ARMOR, AbilityId.SOLID_ROCK, AbilityId.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIRE, PokemonType.GROUND, 2.5, 320.5, AbilityId.SHEER_FORCE, AbilityId.SHEER_FORCE, AbilityId.SHEER_FORCE, 560, 70, 120, 100, 145, 105, 20, 150, 70, 161) + ), + new PokemonSpecies(SpeciesId.TORKOAL, 3, false, false, false, "Coal Pokémon", PokemonType.FIRE, null, 0.5, 80.4, AbilityId.WHITE_SMOKE, AbilityId.DROUGHT, AbilityId.SHELL_ARMOR, 470, 70, 85, 140, 85, 70, 20, 90, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SPOINK, 3, false, false, false, "Bounce Pokémon", PokemonType.PSYCHIC, null, 0.7, 30.6, AbilityId.THICK_FAT, AbilityId.OWN_TEMPO, AbilityId.GLUTTONY, 330, 60, 25, 35, 70, 80, 60, 255, 70, 66, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.GRUMPIG, 3, false, false, false, "Manipulate Pokémon", PokemonType.PSYCHIC, null, 0.9, 71.5, AbilityId.THICK_FAT, AbilityId.OWN_TEMPO, AbilityId.GLUTTONY, 470, 80, 45, 65, 90, 110, 80, 60, 70, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.SPINDA, 3, false, false, false, "Spot Panda Pokémon", PokemonType.NORMAL, null, 1.1, 5, AbilityId.OWN_TEMPO, AbilityId.TANGLED_FEET, AbilityId.CONTRARY, 360, 60, 60, 60, 60, 60, 60, 255, 70, 126, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.TRAPINCH, 3, false, false, false, "Ant Pit Pokémon", PokemonType.GROUND, null, 0.7, 15, AbilityId.HYPER_CUTTER, AbilityId.ARENA_TRAP, AbilityId.SHEER_FORCE, 290, 45, 100, 45, 45, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.VIBRAVA, 3, false, false, false, "Vibration Pokémon", PokemonType.GROUND, PokemonType.DRAGON, 1.1, 15.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 340, 50, 70, 50, 50, 50, 70, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.FLYGON, 3, false, false, false, "Mystic Pokémon", PokemonType.GROUND, PokemonType.DRAGON, 2, 82, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 80, 100, 80, 80, 80, 100, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CACNEA, 3, false, false, false, "Cactus Pokémon", PokemonType.GRASS, null, 0.4, 51.3, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.WATER_ABSORB, 335, 50, 85, 40, 85, 40, 35, 190, 35, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CACTURNE, 3, false, false, false, "Scarecrow Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.3, 77.4, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.WATER_ABSORB, 475, 70, 115, 60, 115, 60, 55, 60, 35, 166, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.SWABLU, 3, false, false, false, "Cotton Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.4, 1.2, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.CLOUD_NINE, 310, 45, 40, 60, 40, 75, 50, 255, 50, 62, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.ALTARIA, 3, false, false, false, "Humming Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 1.1, 20.6, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, GrowthRate.ERRATIC, 50, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 1.1, 20.6, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FAIRY, 1.5, 20.6, AbilityId.PIXILATE, AbilityId.NONE, AbilityId.PIXILATE, 590, 75, 110, 110, 110, 105, 80, 45, 50, 172) + ), + new PokemonSpecies(SpeciesId.ZANGOOSE, 3, false, false, false, "Cat Ferret Pokémon", PokemonType.NORMAL, null, 1.3, 40.3, AbilityId.IMMUNITY, AbilityId.NONE, AbilityId.TOXIC_BOOST, 458, 73, 115, 60, 60, 60, 90, 90, 70, 160, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.SEVIPER, 3, false, false, false, "Fang Snake Pokémon", PokemonType.POISON, null, 2.7, 52.5, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.INFILTRATOR, 458, 73, 100, 60, 100, 60, 65, 90, 70, 160, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.LUNATONE, 3, false, false, false, "Meteorite Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1, 168, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 460, 90, 55, 65, 95, 85, 70, 45, 50, 161, GrowthRate.FAST, null, false), + new PokemonSpecies(SpeciesId.SOLROCK, 3, false, false, false, "Meteorite Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1.2, 154, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 460, 90, 95, 85, 55, 65, 70, 45, 50, 161, GrowthRate.FAST, null, false), + new PokemonSpecies(SpeciesId.BARBOACH, 3, false, false, false, "Whiskers Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.4, 1.9, AbilityId.OBLIVIOUS, AbilityId.ANTICIPATION, AbilityId.HYDRATION, 288, 50, 48, 43, 46, 41, 60, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WHISCASH, 3, false, false, false, "Whiskers Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.9, 23.6, AbilityId.OBLIVIOUS, AbilityId.ANTICIPATION, AbilityId.HYDRATION, 468, 110, 78, 73, 76, 71, 60, 75, 50, 164, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CORPHISH, 3, false, false, false, "Ruffian Pokémon", PokemonType.WATER, null, 0.6, 11.5, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.ADAPTABILITY, 308, 43, 80, 65, 50, 35, 35, 205, 50, 62, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.CRAWDAUNT, 3, false, false, false, "Rogue Pokémon", PokemonType.WATER, PokemonType.DARK, 1.1, 32.8, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.ADAPTABILITY, 468, 63, 120, 85, 90, 55, 55, 155, 50, 164, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.BALTOY, 3, false, false, false, "Clay Doll Pokémon", PokemonType.GROUND, PokemonType.PSYCHIC, 0.5, 21.5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 300, 40, 40, 55, 40, 70, 55, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.CLAYDOL, 3, false, false, false, "Clay Doll Pokémon", PokemonType.GROUND, PokemonType.PSYCHIC, 1.5, 108, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 500, 60, 70, 105, 70, 120, 75, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.LILEEP, 3, false, false, false, "Sea Lily Pokémon", PokemonType.ROCK, PokemonType.GRASS, 1, 23.8, AbilityId.SUCTION_CUPS, AbilityId.NONE, AbilityId.STORM_DRAIN, 355, 66, 41, 77, 61, 87, 23, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(SpeciesId.CRADILY, 3, false, false, false, "Barnacle Pokémon", PokemonType.ROCK, PokemonType.GRASS, 1.5, 60.4, AbilityId.SUCTION_CUPS, AbilityId.NONE, AbilityId.STORM_DRAIN, 495, 86, 81, 97, 81, 107, 43, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(SpeciesId.ANORITH, 3, false, false, false, "Old Shrimp Pokémon", PokemonType.ROCK, PokemonType.BUG, 0.7, 12.5, AbilityId.BATTLE_ARMOR, AbilityId.NONE, AbilityId.SWIFT_SWIM, 355, 45, 95, 50, 40, 50, 75, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(SpeciesId.ARMALDO, 3, false, false, false, "Plate Pokémon", PokemonType.ROCK, PokemonType.BUG, 1.5, 68.2, AbilityId.BATTLE_ARMOR, AbilityId.NONE, AbilityId.SWIFT_SWIM, 495, 75, 125, 100, 70, 80, 45, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(SpeciesId.FEEBAS, 3, false, false, false, "Fish Pokémon", PokemonType.WATER, null, 0.6, 7.4, AbilityId.SWIFT_SWIM, AbilityId.OBLIVIOUS, AbilityId.ADAPTABILITY, 200, 20, 15, 20, 10, 55, 80, 255, 50, 40, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.MILOTIC, 3, false, false, false, "Tender Pokémon", PokemonType.WATER, null, 6.2, 162, AbilityId.MARVEL_SCALE, AbilityId.COMPETITIVE, AbilityId.CUTE_CHARM, 540, 95, 60, 79, 100, 125, 81, 60, 50, 189, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(SpeciesId.CASTFORM, 3, false, false, false, "Weather Pokémon", PokemonType.NORMAL, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal Form", "", PokemonType.NORMAL, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, false, null, true), + new PokemonForm("Sunny Form", "sunny", PokemonType.FIRE, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), + new PokemonForm("Rainy Form", "rainy", PokemonType.WATER, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), + new PokemonForm("Snowy Form", "snowy", PokemonType.ICE, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147) + ), + new PokemonSpecies(SpeciesId.KECLEON, 3, false, false, false, "Color Swap Pokémon", PokemonType.NORMAL, null, 1, 22, AbilityId.COLOR_CHANGE, AbilityId.NONE, AbilityId.PROTEAN, 440, 60, 90, 70, 60, 120, 40, 200, 70, 154, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SHUPPET, 3, false, false, false, "Puppet Pokémon", PokemonType.GHOST, null, 0.6, 2.3, AbilityId.INSOMNIA, AbilityId.FRISK, AbilityId.CURSED_BODY, 295, 44, 75, 35, 63, 33, 45, 225, 35, 59, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.BANETTE, 3, false, false, false, "Marionette Pokémon", PokemonType.GHOST, null, 1.1, 12.5, AbilityId.INSOMNIA, AbilityId.FRISK, AbilityId.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, GrowthRate.FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GHOST, null, 1.1, 12.5, AbilityId.INSOMNIA, AbilityId.FRISK, AbilityId.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GHOST, null, 1.2, 13, AbilityId.PRANKSTER, AbilityId.PRANKSTER, AbilityId.PRANKSTER, 555, 64, 165, 75, 93, 83, 75, 45, 35, 159) + ), + new PokemonSpecies(SpeciesId.DUSKULL, 3, false, false, false, "Requiem Pokémon", PokemonType.GHOST, null, 0.8, 15, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.FRISK, 295, 20, 40, 90, 30, 90, 25, 190, 35, 59, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.DUSCLOPS, 3, false, false, false, "Beckon Pokémon", PokemonType.GHOST, null, 1.6, 30.6, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.FRISK, 455, 40, 70, 130, 60, 130, 25, 90, 35, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.TROPIUS, 3, false, false, false, "Fruit Pokémon", PokemonType.GRASS, PokemonType.FLYING, 2, 100, AbilityId.CHLOROPHYLL, AbilityId.SOLAR_POWER, AbilityId.HARVEST, 460, 99, 68, 83, 72, 87, 51, 200, 70, 161, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.CHIMECHO, 3, false, false, false, "Wind Chime Pokémon", PokemonType.PSYCHIC, null, 0.6, 1, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 455, 75, 50, 80, 95, 90, 65, 45, 70, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.ABSOL, 3, false, false, false, "Disaster Pokémon", PokemonType.DARK, null, 1.2, 47, AbilityId.PRESSURE, AbilityId.SUPER_LUCK, AbilityId.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.DARK, null, 1.2, 47, AbilityId.PRESSURE, AbilityId.SUPER_LUCK, AbilityId.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, null, 1.2, 49, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, 565, 65, 150, 60, 115, 60, 115, 30, 35, 163) + ), + new PokemonSpecies(SpeciesId.WYNAUT, 3, false, false, false, "Bright Pokémon", PokemonType.PSYCHIC, null, 0.6, 14, AbilityId.SHADOW_TAG, AbilityId.NONE, AbilityId.TELEPATHY, 260, 95, 23, 48, 23, 48, 23, 125, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SNORUNT, 3, false, false, false, "Snow Hat Pokémon", PokemonType.ICE, null, 0.7, 16.8, AbilityId.INNER_FOCUS, AbilityId.ICE_BODY, AbilityId.MOODY, 300, 50, 50, 50, 50, 50, 50, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GLALIE, 3, false, false, false, "Face Pokémon", PokemonType.ICE, null, 1.5, 256.5, AbilityId.INNER_FOCUS, AbilityId.ICE_BODY, AbilityId.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ICE, null, 1.5, 256.5, AbilityId.INNER_FOCUS, AbilityId.ICE_BODY, AbilityId.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ICE, null, 2.1, 350.2, AbilityId.REFRIGERATE, AbilityId.REFRIGERATE, AbilityId.REFRIGERATE, 580, 80, 120, 80, 120, 80, 100, 75, 50, 168) + ), + new PokemonSpecies(SpeciesId.SPHEAL, 3, false, false, false, "Clap Pokémon", PokemonType.ICE, PokemonType.WATER, 0.8, 39.5, AbilityId.THICK_FAT, AbilityId.ICE_BODY, AbilityId.OBLIVIOUS, 290, 70, 40, 50, 55, 50, 25, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SEALEO, 3, false, false, false, "Ball Roll Pokémon", PokemonType.ICE, PokemonType.WATER, 1.1, 87.6, AbilityId.THICK_FAT, AbilityId.ICE_BODY, AbilityId.OBLIVIOUS, 410, 90, 60, 70, 75, 70, 45, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.WALREIN, 3, false, false, false, "Ice Break Pokémon", PokemonType.ICE, PokemonType.WATER, 1.4, 150.6, AbilityId.THICK_FAT, AbilityId.ICE_BODY, AbilityId.OBLIVIOUS, 530, 110, 80, 90, 95, 90, 65, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CLAMPERL, 3, false, false, false, "Bivalve Pokémon", PokemonType.WATER, null, 0.4, 52.5, AbilityId.SHELL_ARMOR, AbilityId.NONE, AbilityId.RATTLED, 345, 35, 64, 85, 74, 55, 32, 255, 70, 69, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.HUNTAIL, 3, false, false, false, "Deep Sea Pokémon", PokemonType.WATER, null, 1.7, 27, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.WATER_VEIL, 485, 55, 104, 105, 94, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.GOREBYSS, 3, false, false, false, "South Sea Pokémon", PokemonType.WATER, null, 1.8, 22.6, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.HYDRATION, 485, 55, 84, 105, 114, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.RELICANTH, 3, false, false, false, "Longevity Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 23.4, AbilityId.SWIFT_SWIM, AbilityId.ROCK_HEAD, AbilityId.STURDY, 485, 100, 90, 130, 45, 65, 55, 25, 50, 170, GrowthRate.SLOW, 87.5, true), + new PokemonSpecies(SpeciesId.LUVDISC, 3, false, false, false, "Rendezvous Pokémon", PokemonType.WATER, null, 0.6, 8.7, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.HYDRATION, 330, 43, 30, 55, 40, 65, 97, 225, 70, 116, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.BAGON, 3, false, false, false, "Rock Head Pokémon", PokemonType.DRAGON, null, 0.6, 42.1, AbilityId.ROCK_HEAD, AbilityId.NONE, AbilityId.SHEER_FORCE, 300, 45, 75, 60, 40, 30, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.SHELGON, 3, false, false, false, "Endurance Pokémon", PokemonType.DRAGON, null, 1.1, 110.5, AbilityId.ROCK_HEAD, AbilityId.NONE, AbilityId.OVERCOAT, 420, 65, 95, 100, 60, 50, 50, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.SALAMENCE, 3, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 1.5, 102.6, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 1.5, 102.6, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FLYING, 1.8, 112.6, AbilityId.AERILATE, AbilityId.NONE, AbilityId.AERILATE, 700, 95, 145, 130, 120, 90, 120, 45, 35, 300) + ), + new PokemonSpecies(SpeciesId.BELDUM, 3, false, false, false, "Iron Ball Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.6, 95.2, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 300, 40, 55, 80, 35, 60, 30, 45, 35, 60, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Frigibax + new PokemonSpecies(SpeciesId.METANG, 3, false, false, false, "Iron Claw Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.2, 202.5, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 420, 60, 75, 100, 55, 80, 50, 25, 35, 147, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Arctibax + new PokemonSpecies(SpeciesId.METAGROSS, 3, false, false, false, "Iron Leg Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 550, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 10, 35, 300, GrowthRate.SLOW, null, false, true, //Custom Catchrate, matching Baxcalibur + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 550, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 3, 35, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.PSYCHIC, 2.5, 942.9, AbilityId.TOUGH_CLAWS, AbilityId.NONE, AbilityId.TOUGH_CLAWS, 700, 80, 145, 150, 105, 110, 110, 3, 35, 300) + ), + new PokemonSpecies(SpeciesId.REGIROCK, 3, true, false, false, "Rock Peak Pokémon", PokemonType.ROCK, null, 1.7, 230, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.STURDY, 580, 80, 100, 200, 50, 100, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.REGICE, 3, true, false, false, "Iceberg Pokémon", PokemonType.ICE, null, 1.8, 175, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.ICE_BODY, 580, 80, 50, 100, 100, 200, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.REGISTEEL, 3, true, false, false, "Iron Pokémon", PokemonType.STEEL, null, 1.9, 205, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 580, 80, 75, 150, 75, 150, 50, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.LATIAS, 3, true, false, false, "Eon Pokémon", PokemonType.DRAGON, PokemonType.PSYCHIC, 1.4, 40, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, GrowthRate.SLOW, 0, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.PSYCHIC, 1.4, 40, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.PSYCHIC, 1.8, 52, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 700, 80, 100, 120, 140, 150, 110, 3, 90, 300) + ), + new PokemonSpecies(SpeciesId.LATIOS, 3, true, false, false, "Eon Pokémon", PokemonType.DRAGON, PokemonType.PSYCHIC, 2, 60, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.PSYCHIC, 2, 60, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.PSYCHIC, 2.3, 70, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 700, 80, 130, 100, 160, 120, 110, 3, 90, 300) + ), + new PokemonSpecies(SpeciesId.KYOGRE, 3, false, true, false, "Sea Basin Pokémon", PokemonType.WATER, null, 4.5, 352, AbilityId.DRIZZLE, AbilityId.NONE, AbilityId.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 4.5, 352, AbilityId.DRIZZLE, AbilityId.NONE, AbilityId.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, false, null, true), + new PokemonForm("Primal", "primal", PokemonType.WATER, null, 9.8, 430, AbilityId.PRIMORDIAL_SEA, AbilityId.NONE, AbilityId.NONE, 770, 100, 150, 90, 180, 160, 90, 3, 0, 335) + ), + new PokemonSpecies(SpeciesId.GROUDON, 3, false, true, false, "Continent Pokémon", PokemonType.GROUND, null, 3.5, 950, AbilityId.DROUGHT, AbilityId.NONE, AbilityId.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.GROUND, null, 3.5, 950, AbilityId.DROUGHT, AbilityId.NONE, AbilityId.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, false, null, true), + new PokemonForm("Primal", "primal", PokemonType.GROUND, PokemonType.FIRE, 5, 999.7, AbilityId.DESOLATE_LAND, AbilityId.NONE, AbilityId.NONE, 770, 100, 180, 160, 150, 90, 90, 3, 0, 335) + ), + new PokemonSpecies(SpeciesId.RAYQUAZA, 3, false, true, false, "Sky High Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 7, 206.5, AbilityId.AIR_LOCK, AbilityId.NONE, AbilityId.NONE, 680, 105, 150, 90, 150, 90, 95, 3, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 7, 206.5, AbilityId.AIR_LOCK, AbilityId.NONE, AbilityId.NONE, 680, 105, 150, 90, 150, 90, 95, 3, 0, 340, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FLYING, 10.8, 392, AbilityId.DELTA_STREAM, AbilityId.NONE, AbilityId.NONE, 780, 105, 180, 100, 180, 100, 115, 3, 0, 340) + ), + new PokemonSpecies(SpeciesId.JIRACHI, 3, false, false, true, "Wish Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.3, 1.1, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.DEOXYS, 3, false, false, true, "DNA Pokémon", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal Forme", "normal", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, false, "", true), + new PokemonForm("Attack Forme", "attack", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 180, 20, 180, 20, 150, 3, 0, 300), + new PokemonForm("Defense Forme", "defense", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 70, 160, 70, 160, 90, 3, 0, 300), + new PokemonForm("Speed Forme", "speed", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 95, 90, 95, 90, 180, 3, 0, 300) + ), + new PokemonSpecies(SpeciesId.TURTWIG, 4, false, false, false, "Tiny Leaf Pokémon", PokemonType.GRASS, null, 0.4, 10.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.SHELL_ARMOR, 318, 55, 68, 64, 45, 55, 31, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.GROTLE, 4, false, false, false, "Grove Pokémon", PokemonType.GRASS, null, 1.1, 97, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.SHELL_ARMOR, 405, 75, 89, 85, 55, 65, 36, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.TORTERRA, 4, false, false, false, "Continent Pokémon", PokemonType.GRASS, PokemonType.GROUND, 2.2, 310, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.SHELL_ARMOR, 525, 95, 109, 105, 75, 85, 56, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.CHIMCHAR, 4, false, false, false, "Chimp Pokémon", PokemonType.FIRE, null, 0.5, 6.2, AbilityId.BLAZE, AbilityId.NONE, AbilityId.IRON_FIST, 309, 44, 58, 44, 58, 44, 61, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.MONFERNO, 4, false, false, false, "Playful Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 0.9, 22, AbilityId.BLAZE, AbilityId.NONE, AbilityId.IRON_FIST, 405, 64, 78, 52, 78, 52, 81, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.INFERNAPE, 4, false, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.2, 55, AbilityId.BLAZE, AbilityId.NONE, AbilityId.IRON_FIST, 534, 76, 104, 71, 104, 71, 108, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.PIPLUP, 4, false, false, false, "Penguin Pokémon", PokemonType.WATER, null, 0.4, 5.2, AbilityId.TORRENT, AbilityId.NONE, AbilityId.COMPETITIVE, 314, 53, 51, 53, 61, 56, 40, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.PRINPLUP, 4, false, false, false, "Penguin Pokémon", PokemonType.WATER, null, 0.8, 23, AbilityId.TORRENT, AbilityId.NONE, AbilityId.COMPETITIVE, 405, 64, 66, 68, 81, 76, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.EMPOLEON, 4, false, false, false, "Emperor Pokémon", PokemonType.WATER, PokemonType.STEEL, 1.7, 84.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.COMPETITIVE, 530, 84, 86, 88, 111, 101, 60, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.STARLY, 4, false, false, false, "Starling Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2, AbilityId.KEEN_EYE, AbilityId.NONE, AbilityId.RECKLESS, 245, 40, 55, 30, 30, 30, 60, 255, 70, 49, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.STARAVIA, 4, false, false, false, "Starling Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 15.5, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.RECKLESS, 340, 55, 75, 50, 40, 40, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.STARAPTOR, 4, false, false, false, "Predator Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 24.9, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.RECKLESS, 485, 85, 120, 70, 50, 60, 100, 45, 70, 243, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.BIDOOF, 4, false, false, false, "Plump Mouse Pokémon", PokemonType.NORMAL, null, 0.5, 20, AbilityId.SIMPLE, AbilityId.UNAWARE, AbilityId.MOODY, 250, 59, 45, 40, 35, 40, 31, 255, 70, 50, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.BIBAREL, 4, false, false, false, "Beaver Pokémon", PokemonType.NORMAL, PokemonType.WATER, 1, 31.5, AbilityId.SIMPLE, AbilityId.UNAWARE, AbilityId.MOODY, 410, 79, 85, 60, 55, 60, 71, 127, 70, 144, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.KRICKETOT, 4, false, false, false, "Cricket Pokémon", PokemonType.BUG, null, 0.3, 2.2, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.RUN_AWAY, 194, 37, 25, 41, 25, 41, 25, 255, 70, 39, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.KRICKETUNE, 4, false, false, false, "Cricket Pokémon", PokemonType.BUG, null, 1, 25.5, AbilityId.SWARM, AbilityId.NONE, AbilityId.TECHNICIAN, 384, 77, 85, 51, 55, 51, 65, 45, 70, 134, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.SHINX, 4, false, false, false, "Flash Pokémon", PokemonType.ELECTRIC, null, 0.5, 9.5, AbilityId.RIVALRY, AbilityId.INTIMIDATE, AbilityId.GUTS, 263, 45, 65, 34, 40, 34, 45, 235, 50, 53, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.LUXIO, 4, false, false, false, "Spark Pokémon", PokemonType.ELECTRIC, null, 0.9, 30.5, AbilityId.RIVALRY, AbilityId.INTIMIDATE, AbilityId.GUTS, 363, 60, 85, 49, 60, 49, 60, 120, 100, 127, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.LUXRAY, 4, false, false, false, "Gleam Eyes Pokémon", PokemonType.ELECTRIC, null, 1.4, 42, AbilityId.RIVALRY, AbilityId.INTIMIDATE, AbilityId.GUTS, 523, 80, 120, 79, 95, 79, 70, 45, 50, 262, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.BUDEW, 4, false, false, false, "Bud Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.2, 1.2, AbilityId.NATURAL_CURE, AbilityId.POISON_POINT, AbilityId.LEAF_GUARD, 280, 40, 30, 35, 50, 70, 55, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.ROSERADE, 4, false, false, false, "Bouquet Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.9, 14.5, AbilityId.NATURAL_CURE, AbilityId.POISON_POINT, AbilityId.TECHNICIAN, 515, 60, 70, 65, 125, 105, 90, 75, 50, 258, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.CRANIDOS, 4, false, false, false, "Head Butt Pokémon", PokemonType.ROCK, null, 0.9, 31.5, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.SHEER_FORCE, 350, 67, 125, 40, 30, 30, 58, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(SpeciesId.RAMPARDOS, 4, false, false, false, "Head Butt Pokémon", PokemonType.ROCK, null, 1.6, 102.5, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.SHEER_FORCE, 495, 97, 165, 60, 65, 50, 58, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(SpeciesId.SHIELDON, 4, false, false, false, "Shield Pokémon", PokemonType.ROCK, PokemonType.STEEL, 0.5, 57, AbilityId.STURDY, AbilityId.NONE, AbilityId.SOUNDPROOF, 350, 30, 42, 118, 42, 88, 30, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(SpeciesId.BASTIODON, 4, false, false, false, "Shield Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.3, 149.5, AbilityId.STURDY, AbilityId.NONE, AbilityId.SOUNDPROOF, 495, 60, 52, 168, 47, 138, 30, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), + new PokemonSpecies(SpeciesId.BURMY, 4, false, false, false, "Bagworm Pokémon", PokemonType.BUG, null, 0.2, 3.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Plant Cloak", "plant", PokemonType.BUG, null, 0.2, 3.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), + new PokemonForm("Sandy Cloak", "sandy", PokemonType.BUG, null, 0.2, 3.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), + new PokemonForm("Trash Cloak", "trash", PokemonType.BUG, null, 0.2, 3.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true) + ), + new PokemonSpecies(SpeciesId.WORMADAM, 4, false, false, false, "Bagworm Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.5, 6.5, AbilityId.ANTICIPATION, AbilityId.NONE, AbilityId.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Plant Cloak", "plant", PokemonType.BUG, PokemonType.GRASS, 0.5, 6.5, AbilityId.ANTICIPATION, AbilityId.NONE, AbilityId.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, false, null, true), + new PokemonForm("Sandy Cloak", "sandy", PokemonType.BUG, PokemonType.GROUND, 0.5, 6.5, AbilityId.ANTICIPATION, AbilityId.NONE, AbilityId.OVERCOAT, 424, 60, 79, 105, 59, 85, 36, 45, 70, 148, false, null, true), + new PokemonForm("Trash Cloak", "trash", PokemonType.BUG, PokemonType.STEEL, 0.5, 6.5, AbilityId.ANTICIPATION, AbilityId.NONE, AbilityId.OVERCOAT, 424, 60, 69, 95, 69, 95, 36, 45, 70, 148, false, null, true) + ), + new PokemonSpecies(SpeciesId.MOTHIM, 4, false, false, false, "Moth Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.9, 23.3, AbilityId.SWARM, AbilityId.NONE, AbilityId.TINTED_LENS, 424, 70, 94, 50, 94, 50, 66, 45, 70, 148, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.COMBEE, 4, false, false, false, "Tiny Bee Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.3, 5.5, AbilityId.HONEY_GATHER, AbilityId.NONE, AbilityId.HUSTLE, 244, 30, 30, 42, 30, 42, 70, 120, 50, 49, GrowthRate.MEDIUM_SLOW, 87.5, true), + new PokemonSpecies(SpeciesId.VESPIQUEN, 4, false, false, false, "Beehive Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 38.5, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.UNNERVE, 474, 70, 80, 102, 80, 102, 40, 45, 50, 166, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.PACHIRISU, 4, false, false, false, "EleSquirrel Pokémon", PokemonType.ELECTRIC, null, 0.4, 3.9, AbilityId.RUN_AWAY, AbilityId.PICKUP, AbilityId.VOLT_ABSORB, 405, 60, 45, 70, 45, 90, 95, 200, 100, 142, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.BUIZEL, 4, false, false, false, "Sea Weasel Pokémon", PokemonType.WATER, null, 0.7, 29.5, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.WATER_VEIL, 330, 55, 65, 35, 60, 30, 85, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.FLOATZEL, 4, false, false, false, "Sea Weasel Pokémon", PokemonType.WATER, null, 1.1, 33.5, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.WATER_VEIL, 495, 85, 105, 55, 85, 50, 115, 75, 70, 173, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.CHERUBI, 4, false, false, false, "Cherry Pokémon", PokemonType.GRASS, null, 0.4, 3.3, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.NONE, 275, 45, 35, 45, 62, 53, 35, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CHERRIM, 4, false, false, false, "Blossom Pokémon", PokemonType.GRASS, null, 0.5, 9.3, AbilityId.FLOWER_GIFT, AbilityId.NONE, AbilityId.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Overcast Form", "overcast", PokemonType.GRASS, null, 0.5, 9.3, AbilityId.FLOWER_GIFT, AbilityId.NONE, AbilityId.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, false, null, true), + new PokemonForm("Sunshine Form", "sunshine", PokemonType.GRASS, null, 0.5, 9.3, AbilityId.FLOWER_GIFT, AbilityId.NONE, AbilityId.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158) + ), + new PokemonSpecies(SpeciesId.SHELLOS, 4, false, false, false, "Sea Slug Pokémon", PokemonType.WATER, null, 0.3, 6.3, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("East Sea", "east", PokemonType.WATER, null, 0.3, 6.3, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), + new PokemonForm("West Sea", "west", PokemonType.WATER, null, 0.3, 6.3, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true) + ), + new PokemonSpecies(SpeciesId.GASTRODON, 4, false, false, false, "Sea Slug Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("East Sea", "east", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), + new PokemonForm("West Sea", "west", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true) + ), + new PokemonSpecies(SpeciesId.AMBIPOM, 4, false, false, false, "Long Tail Pokémon", PokemonType.NORMAL, null, 1.2, 20.3, AbilityId.TECHNICIAN, AbilityId.PICKUP, AbilityId.SKILL_LINK, 482, 75, 100, 66, 60, 66, 115, 45, 100, 169, GrowthRate.FAST, 50, true), + new PokemonSpecies(SpeciesId.DRIFLOON, 4, false, false, false, "Balloon Pokémon", PokemonType.GHOST, PokemonType.FLYING, 0.4, 1.2, AbilityId.AFTERMATH, AbilityId.UNBURDEN, AbilityId.FLARE_BOOST, 348, 90, 50, 34, 60, 44, 70, 125, 50, 70, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.DRIFBLIM, 4, false, false, false, "Blimp Pokémon", PokemonType.GHOST, PokemonType.FLYING, 1.2, 15, AbilityId.AFTERMATH, AbilityId.UNBURDEN, AbilityId.FLARE_BOOST, 498, 150, 80, 44, 90, 54, 80, 60, 50, 174, GrowthRate.FLUCTUATING, 50, false), + new PokemonSpecies(SpeciesId.BUNEARY, 4, false, false, false, "Rabbit Pokémon", PokemonType.NORMAL, null, 0.4, 5.5, AbilityId.RUN_AWAY, AbilityId.KLUTZ, AbilityId.LIMBER, 350, 55, 66, 44, 44, 56, 85, 190, 0, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LOPUNNY, 4, false, false, false, "Rabbit Pokémon", PokemonType.NORMAL, null, 1.2, 33.3, AbilityId.CUTE_CHARM, AbilityId.KLUTZ, AbilityId.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 1.2, 33.3, AbilityId.CUTE_CHARM, AbilityId.KLUTZ, AbilityId.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FIGHTING, 1.3, 28.3, AbilityId.SCRAPPY, AbilityId.SCRAPPY, AbilityId.SCRAPPY, 580, 65, 136, 94, 54, 96, 135, 60, 140, 168) + ), + new PokemonSpecies(SpeciesId.MISMAGIUS, 4, false, false, false, "Magical Pokémon", PokemonType.GHOST, null, 0.9, 4.4, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 495, 60, 60, 60, 105, 105, 105, 45, 35, 173, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.HONCHKROW, 4, false, false, false, "Big Boss Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.9, 27.3, AbilityId.INSOMNIA, AbilityId.SUPER_LUCK, AbilityId.MOXIE, 505, 100, 125, 52, 105, 52, 71, 30, 35, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GLAMEOW, 4, false, false, false, "Catty Pokémon", PokemonType.NORMAL, null, 0.5, 3.9, AbilityId.LIMBER, AbilityId.OWN_TEMPO, AbilityId.KEEN_EYE, 310, 49, 55, 42, 42, 37, 85, 190, 70, 62, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.PURUGLY, 4, false, false, false, "Tiger Cat Pokémon", PokemonType.NORMAL, null, 1, 43.8, AbilityId.THICK_FAT, AbilityId.OWN_TEMPO, AbilityId.DEFIANT, 452, 71, 82, 64, 64, 59, 112, 75, 70, 158, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.CHINGLING, 4, false, false, false, "Bell Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.6, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 285, 45, 30, 50, 65, 50, 45, 120, 70, 57, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.STUNKY, 4, false, false, false, "Skunk Pokémon", PokemonType.POISON, PokemonType.DARK, 0.4, 19.2, AbilityId.STENCH, AbilityId.AFTERMATH, AbilityId.KEEN_EYE, 329, 63, 63, 47, 41, 41, 74, 225, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SKUNTANK, 4, false, false, false, "Skunk Pokémon", PokemonType.POISON, PokemonType.DARK, 1, 38, AbilityId.STENCH, AbilityId.AFTERMATH, AbilityId.KEEN_EYE, 479, 103, 93, 67, 71, 61, 84, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BRONZOR, 4, false, false, false, "Bronze Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.5, 60.5, AbilityId.LEVITATE, AbilityId.HEATPROOF, AbilityId.HEAVY_METAL, 300, 57, 24, 86, 24, 86, 23, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.BRONZONG, 4, false, false, false, "Bronze Bell Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.3, 187, AbilityId.LEVITATE, AbilityId.HEATPROOF, AbilityId.HEAVY_METAL, 500, 67, 89, 116, 79, 116, 33, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.BONSLY, 4, false, false, false, "Bonsai Pokémon", PokemonType.ROCK, null, 0.5, 15, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.RATTLED, 290, 50, 80, 95, 10, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MIME_JR, 4, false, false, false, "Mime Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.6, 13, AbilityId.SOUNDPROOF, AbilityId.FILTER, AbilityId.TECHNICIAN, 310, 20, 25, 45, 70, 90, 60, 145, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HAPPINY, 4, false, false, false, "Playhouse Pokémon", PokemonType.NORMAL, null, 0.6, 24.4, AbilityId.NATURAL_CURE, AbilityId.SERENE_GRACE, AbilityId.FRIEND_GUARD, 220, 100, 5, 5, 15, 65, 30, 130, 140, 110, GrowthRate.FAST, 0, false), + new PokemonSpecies(SpeciesId.CHATOT, 4, false, false, false, "Music Note Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.5, 1.9, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 411, 76, 65, 45, 92, 42, 91, 30, 35, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SPIRITOMB, 4, false, false, false, "Forbidden Pokémon", PokemonType.GHOST, PokemonType.DARK, 1, 108, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.INFILTRATOR, 485, 50, 92, 108, 92, 108, 35, 100, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GIBLE, 4, false, false, false, "Land Shark Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 0.7, 20.5, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.ROUGH_SKIN, 300, 58, 70, 45, 40, 45, 42, 45, 50, 60, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.GABITE, 4, false, false, false, "Cave Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 1.4, 56, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.ROUGH_SKIN, 410, 68, 90, 65, 50, 55, 82, 45, 50, 144, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.GARCHOMP, 4, false, false, false, "Mach Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, AbilityId.SAND_FORCE, AbilityId.NONE, AbilityId.SAND_FORCE, 700, 108, 170, 115, 120, 95, 92, 45, 50, 300, true) + ), + new PokemonSpecies(SpeciesId.MUNCHLAX, 4, false, false, false, "Big Eater Pokémon", PokemonType.NORMAL, null, 0.6, 105, AbilityId.PICKUP, AbilityId.THICK_FAT, AbilityId.GLUTTONY, 390, 135, 85, 40, 40, 85, 5, 50, 50, 78, GrowthRate.SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.RIOLU, 4, false, false, false, "Emanation Pokémon", PokemonType.FIGHTING, null, 0.7, 20.2, AbilityId.STEADFAST, AbilityId.INNER_FOCUS, AbilityId.PRANKSTER, 285, 40, 70, 40, 35, 40, 60, 75, 50, 57, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.LUCARIO, 4, false, false, false, "Aura Pokémon", PokemonType.FIGHTING, PokemonType.STEEL, 1.2, 54, AbilityId.STEADFAST, AbilityId.INNER_FOCUS, AbilityId.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.STEEL, 1.2, 54, AbilityId.STEADFAST, AbilityId.INNER_FOCUS, AbilityId.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIGHTING, PokemonType.STEEL, 1.3, 57.5, AbilityId.ADAPTABILITY, AbilityId.ADAPTABILITY, AbilityId.ADAPTABILITY, 625, 70, 145, 88, 140, 70, 112, 45, 50, 184) + ), + new PokemonSpecies(SpeciesId.HIPPOPOTAS, 4, false, false, false, "Hippo Pokémon", PokemonType.GROUND, null, 0.8, 49.5, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.SAND_FORCE, 330, 68, 72, 78, 38, 42, 32, 140, 50, 66, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.HIPPOWDON, 4, false, false, false, "Heavyweight Pokémon", PokemonType.GROUND, null, 2, 300, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.SAND_FORCE, 525, 108, 112, 118, 68, 72, 47, 60, 50, 184, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.SKORUPI, 4, false, false, false, "Scorpion Pokémon", PokemonType.POISON, PokemonType.BUG, 0.8, 12, AbilityId.BATTLE_ARMOR, AbilityId.SNIPER, AbilityId.KEEN_EYE, 330, 40, 50, 90, 30, 55, 65, 120, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.DRAPION, 4, false, false, false, "Ogre Scorpion Pokémon", PokemonType.POISON, PokemonType.DARK, 1.3, 61.5, AbilityId.BATTLE_ARMOR, AbilityId.SNIPER, AbilityId.KEEN_EYE, 500, 70, 90, 110, 60, 75, 95, 45, 50, 175, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.CROAGUNK, 4, false, false, false, "Toxic Mouth Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 0.7, 23, AbilityId.ANTICIPATION, AbilityId.DRY_SKIN, AbilityId.POISON_TOUCH, 300, 48, 61, 40, 61, 40, 50, 140, 100, 60, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.TOXICROAK, 4, false, false, false, "Toxic Mouth Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 1.3, 44.4, AbilityId.ANTICIPATION, AbilityId.DRY_SKIN, AbilityId.POISON_TOUCH, 490, 83, 106, 65, 86, 65, 85, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.CARNIVINE, 4, false, false, false, "Bug Catcher Pokémon", PokemonType.GRASS, null, 1.4, 27, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 454, 74, 100, 72, 90, 72, 46, 200, 70, 159, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.FINNEON, 4, false, false, false, "Wing Fish Pokémon", PokemonType.WATER, null, 0.4, 7, AbilityId.SWIFT_SWIM, AbilityId.STORM_DRAIN, AbilityId.WATER_VEIL, 330, 49, 49, 56, 49, 61, 66, 190, 70, 66, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(SpeciesId.LUMINEON, 4, false, false, false, "Neon Pokémon", PokemonType.WATER, null, 1.2, 24, AbilityId.SWIFT_SWIM, AbilityId.STORM_DRAIN, AbilityId.WATER_VEIL, 460, 69, 69, 76, 69, 86, 91, 75, 70, 161, GrowthRate.ERRATIC, 50, true), + new PokemonSpecies(SpeciesId.MANTYKE, 4, false, false, false, "Kite Pokémon", PokemonType.WATER, PokemonType.FLYING, 1, 65, AbilityId.SWIFT_SWIM, AbilityId.WATER_ABSORB, AbilityId.WATER_VEIL, 345, 45, 20, 50, 60, 120, 50, 25, 50, 69, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.SNOVER, 4, false, false, false, "Frost Tree Pokémon", PokemonType.GRASS, PokemonType.ICE, 1, 50.5, AbilityId.SNOW_WARNING, AbilityId.NONE, AbilityId.SOUNDPROOF, 334, 60, 62, 50, 62, 60, 40, 120, 50, 67, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.ABOMASNOW, 4, false, false, false, "Frost Tree Pokémon", PokemonType.GRASS, PokemonType.ICE, 2.2, 135.5, AbilityId.SNOW_WARNING, AbilityId.NONE, AbilityId.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, GrowthRate.SLOW, 50, true, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.ICE, 2.2, 135.5, AbilityId.SNOW_WARNING, AbilityId.NONE, AbilityId.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, true, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.ICE, 2.7, 185, AbilityId.SNOW_WARNING, AbilityId.NONE, AbilityId.SNOW_WARNING, 594, 90, 132, 105, 132, 105, 30, 60, 50, 173, true) + ), + new PokemonSpecies(SpeciesId.WEAVILE, 4, false, false, false, "Sharp Claw Pokémon", PokemonType.DARK, PokemonType.ICE, 1.1, 34, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.PICKPOCKET, 510, 70, 120, 65, 45, 85, 125, 45, 35, 179, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.MAGNEZONE, 4, false, false, false, "Magnet Area Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 1.2, 180, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.ANALYTIC, 535, 70, 70, 115, 130, 90, 60, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.LICKILICKY, 4, false, false, false, "Licking Pokémon", PokemonType.NORMAL, null, 1.7, 140, AbilityId.OWN_TEMPO, AbilityId.OBLIVIOUS, AbilityId.CLOUD_NINE, 515, 110, 85, 95, 80, 95, 50, 30, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.RHYPERIOR, 4, false, false, false, "Drill Pokémon", PokemonType.GROUND, PokemonType.ROCK, 2.4, 282.8, AbilityId.LIGHTNING_ROD, AbilityId.SOLID_ROCK, AbilityId.RECKLESS, 535, 115, 140, 130, 55, 55, 40, 30, 50, 268, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.TANGROWTH, 4, false, false, false, "Vine Pokémon", PokemonType.GRASS, null, 2, 128.6, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.REGENERATOR, 535, 100, 100, 125, 110, 50, 50, 30, 50, 187, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.ELECTIVIRE, 4, false, false, false, "Thunderbolt Pokémon", PokemonType.ELECTRIC, null, 1.8, 138.6, AbilityId.MOTOR_DRIVE, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 540, 75, 123, 67, 95, 85, 95, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(SpeciesId.MAGMORTAR, 4, false, false, false, "Blast Pokémon", PokemonType.FIRE, null, 1.6, 68, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 540, 75, 95, 67, 125, 95, 83, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), + new PokemonSpecies(SpeciesId.TOGEKISS, 4, false, false, false, "Jubilee Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 1.5, 38, AbilityId.HUSTLE, AbilityId.SERENE_GRACE, AbilityId.SUPER_LUCK, 545, 85, 50, 95, 120, 115, 80, 30, 50, 273, GrowthRate.FAST, 87.5, false), + new PokemonSpecies(SpeciesId.YANMEGA, 4, false, false, false, "Ogre Darner Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.9, 51.5, AbilityId.SPEED_BOOST, AbilityId.TINTED_LENS, AbilityId.FRISK, 515, 86, 76, 86, 116, 56, 95, 30, 70, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LEAFEON, 4, false, false, false, "Verdant Pokémon", PokemonType.GRASS, null, 1, 25.5, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.CHLOROPHYLL, 525, 65, 110, 130, 60, 65, 95, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.GLACEON, 4, false, false, false, "Fresh Snow Pokémon", PokemonType.ICE, null, 0.8, 25.9, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.ICE_BODY, 525, 65, 60, 110, 130, 95, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.GLISCOR, 4, false, false, false, "Fang Scorpion Pokémon", PokemonType.GROUND, PokemonType.FLYING, 2, 42.5, AbilityId.HYPER_CUTTER, AbilityId.SAND_VEIL, AbilityId.POISON_HEAL, 510, 75, 95, 125, 45, 75, 95, 30, 70, 179, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.MAMOSWINE, 4, false, false, false, "Twin Tusk Pokémon", PokemonType.ICE, PokemonType.GROUND, 2.5, 291, AbilityId.OBLIVIOUS, AbilityId.SNOW_CLOAK, AbilityId.THICK_FAT, 530, 110, 130, 80, 70, 60, 80, 50, 50, 265, GrowthRate.SLOW, 50, true), + new PokemonSpecies(SpeciesId.PORYGON_Z, 4, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.9, 34, AbilityId.ADAPTABILITY, AbilityId.DOWNLOAD, AbilityId.ANALYTIC, 535, 85, 80, 70, 135, 75, 90, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.GALLADE, 4, false, false, false, "Blade Pokémon", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, AbilityId.STEADFAST, AbilityId.SHARPNESS, AbilityId.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, AbilityId.STEADFAST, AbilityId.SHARPNESS, AbilityId.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 56.4, AbilityId.INNER_FOCUS, AbilityId.INNER_FOCUS, AbilityId.INNER_FOCUS, 618, 68, 165, 95, 65, 115, 110, 45, 35, 259) + ), + new PokemonSpecies(SpeciesId.PROBOPASS, 4, false, false, false, "Compass Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.4, 340, AbilityId.STURDY, AbilityId.MAGNET_PULL, AbilityId.SAND_FORCE, 525, 60, 55, 145, 75, 150, 40, 60, 70, 184, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DUSKNOIR, 4, false, false, false, "Gripper Pokémon", PokemonType.GHOST, null, 2.2, 106.6, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.FRISK, 525, 45, 100, 135, 65, 135, 45, 45, 35, 263, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.FROSLASS, 4, false, false, false, "Snow Land Pokémon", PokemonType.ICE, PokemonType.GHOST, 1.3, 26.6, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.CURSED_BODY, 480, 70, 80, 70, 80, 70, 110, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(SpeciesId.ROTOM, 4, false, false, false, "Plasma Pokémon", PokemonType.ELECTRIC, PokemonType.GHOST, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, GrowthRate.MEDIUM_FAST, null, false, false, + new PokemonForm("Normal", "", PokemonType.ELECTRIC, PokemonType.GHOST, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, false, null, true), + new PokemonForm("Heat", "heat", PokemonType.ELECTRIC, PokemonType.FIRE, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + new PokemonForm("Wash", "wash", PokemonType.ELECTRIC, PokemonType.WATER, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + new PokemonForm("Frost", "frost", PokemonType.ELECTRIC, PokemonType.ICE, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + new PokemonForm("Fan", "fan", PokemonType.ELECTRIC, PokemonType.FLYING, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), + new PokemonForm("Mow", "mow", PokemonType.ELECTRIC, PokemonType.GRASS, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true) + ), + new PokemonSpecies(SpeciesId.UXIE, 4, true, false, false, "Knowledge Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 580, 75, 75, 130, 75, 130, 95, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.MESPRIT, 4, true, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 580, 80, 105, 105, 105, 105, 80, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.AZELF, 4, true, false, false, "Willpower Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 580, 75, 125, 70, 125, 70, 115, 3, 140, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.DIALGA, 4, false, true, false, "Temporal Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 5.4, 683, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.DRAGON, 5.4, 683, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, false, null, true), + new PokemonForm("Origin Forme", "origin", PokemonType.STEEL, PokemonType.DRAGON, 7, 848.7, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 100, 100, 120, 150, 120, 90, 3, 0, 340) + ), + new PokemonSpecies(SpeciesId.PALKIA, 4, false, true, false, "Spatial Pokémon", PokemonType.WATER, PokemonType.DRAGON, 4.2, 336, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DRAGON, 4.2, 336, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, false, null, true), + new PokemonForm("Origin Forme", "origin", PokemonType.WATER, PokemonType.DRAGON, 6.3, 659, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 90, 100, 100, 150, 120, 120, 3, 0, 340) + ), + new PokemonSpecies(SpeciesId.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", PokemonType.FIRE, PokemonType.STEEL, 1.7, 430, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", PokemonType.NORMAL, null, 3.7, 420, AbilityId.SLOW_START, AbilityId.NONE, AbilityId.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.GIRATINA, 4, false, true, false, "Renegade Pokémon", PokemonType.GHOST, PokemonType.DRAGON, 4.5, 750, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Altered Forme", "altered", PokemonType.GHOST, PokemonType.DRAGON, 4.5, 750, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), + new PokemonForm("Origin Forme", "origin", PokemonType.GHOST, PokemonType.DRAGON, 6.9, 650, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.LEVITATE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340) + ), + new PokemonSpecies(SpeciesId.CRESSELIA, 4, true, false, false, "Lunar Pokémon", PokemonType.PSYCHIC, null, 1.5, 85.6, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), + new PokemonSpecies(SpeciesId.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", PokemonType.WATER, null, 0.4, 3.1, AbilityId.HYDRATION, AbilityId.NONE, AbilityId.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.MANAPHY, 4, false, false, true, "Seafaring Pokémon", PokemonType.WATER, null, 0.3, 1.4, AbilityId.HYDRATION, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.DARKRAI, 4, false, false, true, "Pitch-Black Pokémon", PokemonType.DARK, null, 1.5, 50.5, AbilityId.BAD_DREAMS, AbilityId.NONE, AbilityId.NONE, 600, 70, 90, 90, 135, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SHAYMIN, 4, false, false, true, "Gratitude Pokémon", PokemonType.GRASS, null, 0.2, 2.1, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false, true, + new PokemonForm("Land Forme", "land", PokemonType.GRASS, null, 0.2, 2.1, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, false, null, true), + new PokemonForm("Sky Forme", "sky", PokemonType.GRASS, PokemonType.FLYING, 0.4, 5.2, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 103, 75, 120, 75, 127, 45, 100, 300) + ), + new PokemonSpecies(SpeciesId.ARCEUS, 4, false, false, true, "Alpha Pokémon", PokemonType.NORMAL, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "normal", PokemonType.NORMAL, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, true), + new PokemonForm("Fighting", "fighting", PokemonType.FIGHTING, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Flying", "flying", PokemonType.FLYING, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Poison", "poison", PokemonType.POISON, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ground", "ground", PokemonType.GROUND, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Rock", "rock", PokemonType.ROCK, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Bug", "bug", PokemonType.BUG, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ghost", "ghost", PokemonType.GHOST, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Steel", "steel", PokemonType.STEEL, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Fire", "fire", PokemonType.FIRE, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Water", "water", PokemonType.WATER, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Grass", "grass", PokemonType.GRASS, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Electric", "electric", PokemonType.ELECTRIC, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Psychic", "psychic", PokemonType.PSYCHIC, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Ice", "ice", PokemonType.ICE, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Dragon", "dragon", PokemonType.DRAGON, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Dark", "dark", PokemonType.DARK, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("Fairy", "fairy", PokemonType.FAIRY, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), + new PokemonForm("???", "unknown", PokemonType.UNKNOWN, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true) + ), + new PokemonSpecies(SpeciesId.VICTINI, 5, false, false, true, "Victory Pokémon", PokemonType.PSYCHIC, PokemonType.FIRE, 0.4, 4, AbilityId.VICTORY_STAR, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SNIVY, 5, false, false, false, "Grass Snake Pokémon", PokemonType.GRASS, null, 0.6, 8.1, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.SERVINE, 5, false, false, false, "Grass Snake Pokémon", PokemonType.GRASS, null, 0.8, 16, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.SERPERIOR, 5, false, false, false, "Regal Pokémon", PokemonType.GRASS, null, 3.3, 63, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.TEPIG, 5, false, false, false, "Fire Pig Pokémon", PokemonType.FIRE, null, 0.5, 9.9, AbilityId.BLAZE, AbilityId.NONE, AbilityId.THICK_FAT, 308, 65, 63, 45, 45, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.PIGNITE, 5, false, false, false, "Fire Pig Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1, 55.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.THICK_FAT, 418, 90, 93, 55, 70, 55, 55, 45, 70, 146, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.EMBOAR, 5, false, false, false, "Mega Fire Pig Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.6, 150, AbilityId.BLAZE, AbilityId.NONE, AbilityId.RECKLESS, 528, 110, 123, 65, 100, 65, 65, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.OSHAWOTT, 5, false, false, false, "Sea Otter Pokémon", PokemonType.WATER, null, 0.5, 5.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHELL_ARMOR, 308, 55, 55, 45, 63, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.DEWOTT, 5, false, false, false, "Discipline Pokémon", PokemonType.WATER, null, 0.8, 24.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHELL_ARMOR, 413, 75, 75, 60, 83, 60, 60, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.SAMUROTT, 5, false, false, false, "Formidable Pokémon", PokemonType.WATER, null, 1.5, 94.6, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHELL_ARMOR, 528, 95, 100, 85, 108, 70, 70, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.PATRAT, 5, false, false, false, "Scout Pokémon", PokemonType.NORMAL, null, 0.5, 11.6, AbilityId.RUN_AWAY, AbilityId.KEEN_EYE, AbilityId.ANALYTIC, 255, 45, 55, 39, 35, 39, 42, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WATCHOG, 5, false, false, false, "Lookout Pokémon", PokemonType.NORMAL, null, 1.1, 27, AbilityId.ILLUMINATE, AbilityId.KEEN_EYE, AbilityId.ANALYTIC, 420, 60, 85, 69, 60, 69, 77, 255, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LILLIPUP, 5, false, false, false, "Puppy Pokémon", PokemonType.NORMAL, null, 0.4, 4.1, AbilityId.VITAL_SPIRIT, AbilityId.PICKUP, AbilityId.RUN_AWAY, 275, 45, 60, 45, 25, 45, 55, 255, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.HERDIER, 5, false, false, false, "Loyal Dog Pokémon", PokemonType.NORMAL, null, 0.9, 14.7, AbilityId.INTIMIDATE, AbilityId.SAND_RUSH, AbilityId.SCRAPPY, 370, 65, 80, 65, 35, 65, 60, 120, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.STOUTLAND, 5, false, false, false, "Big-Hearted Pokémon", PokemonType.NORMAL, null, 1.2, 61, AbilityId.INTIMIDATE, AbilityId.SAND_RUSH, AbilityId.SCRAPPY, 500, 85, 110, 90, 45, 90, 80, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.PURRLOIN, 5, false, false, false, "Devious Pokémon", PokemonType.DARK, null, 0.4, 10.1, AbilityId.LIMBER, AbilityId.UNBURDEN, AbilityId.PRANKSTER, 281, 41, 50, 37, 50, 37, 66, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LIEPARD, 5, false, false, false, "Cruel Pokémon", PokemonType.DARK, null, 1.1, 37.5, AbilityId.LIMBER, AbilityId.UNBURDEN, AbilityId.PRANKSTER, 446, 64, 88, 50, 88, 50, 106, 90, 50, 156, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PANSAGE, 5, false, false, false, "Grass Monkey Pokémon", PokemonType.GRASS, null, 0.6, 10.5, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.OVERGROW, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.SIMISAGE, 5, false, false, false, "Thorn Monkey Pokémon", PokemonType.GRASS, null, 1.1, 30.5, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.OVERGROW, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.PANSEAR, 5, false, false, false, "High Temp Pokémon", PokemonType.FIRE, null, 0.6, 11, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.BLAZE, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.SIMISEAR, 5, false, false, false, "Ember Pokémon", PokemonType.FIRE, null, 1, 28, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.BLAZE, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.PANPOUR, 5, false, false, false, "Spray Pokémon", PokemonType.WATER, null, 0.6, 13.5, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.TORRENT, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.SIMIPOUR, 5, false, false, false, "Geyser Pokémon", PokemonType.WATER, null, 1, 29, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.TORRENT, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.MUNNA, 5, false, false, false, "Dream Eater Pokémon", PokemonType.PSYCHIC, null, 0.6, 23.3, AbilityId.FOREWARN, AbilityId.SYNCHRONIZE, AbilityId.TELEPATHY, 292, 76, 25, 45, 67, 55, 24, 190, 50, 58, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.MUSHARNA, 5, false, false, false, "Drowsing Pokémon", PokemonType.PSYCHIC, null, 1.1, 60.5, AbilityId.FOREWARN, AbilityId.SYNCHRONIZE, AbilityId.TELEPATHY, 487, 116, 55, 85, 107, 95, 29, 75, 50, 170, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.PIDOVE, 5, false, false, false, "Tiny Pigeon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2.1, AbilityId.BIG_PECKS, AbilityId.SUPER_LUCK, AbilityId.RIVALRY, 264, 50, 55, 50, 36, 30, 43, 255, 50, 53, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.TRANQUILL, 5, false, false, false, "Wild Pigeon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 15, AbilityId.BIG_PECKS, AbilityId.SUPER_LUCK, AbilityId.RIVALRY, 358, 62, 77, 62, 50, 42, 65, 120, 50, 125, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.UNFEZANT, 5, false, false, false, "Proud Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 29, AbilityId.BIG_PECKS, AbilityId.SUPER_LUCK, AbilityId.RIVALRY, 488, 80, 115, 80, 65, 55, 93, 45, 50, 244, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.BLITZLE, 5, false, false, false, "Electrified Pokémon", PokemonType.ELECTRIC, null, 0.8, 29.8, AbilityId.LIGHTNING_ROD, AbilityId.MOTOR_DRIVE, AbilityId.SAP_SIPPER, 295, 45, 60, 32, 50, 32, 76, 190, 70, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ZEBSTRIKA, 5, false, false, false, "Thunderbolt Pokémon", PokemonType.ELECTRIC, null, 1.6, 79.5, AbilityId.LIGHTNING_ROD, AbilityId.MOTOR_DRIVE, AbilityId.SAP_SIPPER, 497, 75, 100, 63, 80, 63, 116, 75, 70, 174, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ROGGENROLA, 5, false, false, false, "Mantle Pokémon", PokemonType.ROCK, null, 0.4, 18, AbilityId.STURDY, AbilityId.WEAK_ARMOR, AbilityId.SAND_FORCE, 280, 55, 75, 85, 25, 25, 15, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.BOLDORE, 5, false, false, false, "Ore Pokémon", PokemonType.ROCK, null, 0.9, 102, AbilityId.STURDY, AbilityId.WEAK_ARMOR, AbilityId.SAND_FORCE, 390, 70, 105, 105, 50, 40, 20, 120, 50, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GIGALITH, 5, false, false, false, "Compressed Pokémon", PokemonType.ROCK, null, 1.7, 260, AbilityId.STURDY, AbilityId.SAND_STREAM, AbilityId.SAND_FORCE, 515, 85, 135, 130, 60, 80, 25, 45, 50, 258, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.WOOBAT, 5, false, false, false, "Bat Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.4, 2.1, AbilityId.UNAWARE, AbilityId.KLUTZ, AbilityId.SIMPLE, 323, 65, 45, 43, 55, 43, 72, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SWOOBAT, 5, false, false, false, "Courting Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.9, 10.5, AbilityId.UNAWARE, AbilityId.KLUTZ, AbilityId.SIMPLE, 425, 67, 57, 55, 77, 55, 114, 45, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DRILBUR, 5, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.3, 8.5, AbilityId.SAND_RUSH, AbilityId.SAND_FORCE, AbilityId.MOLD_BREAKER, 328, 60, 85, 40, 30, 45, 68, 120, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.EXCADRILL, 5, false, false, false, "Subterrene Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 40.4, AbilityId.SAND_RUSH, AbilityId.SAND_FORCE, AbilityId.MOLD_BREAKER, 508, 110, 135, 60, 50, 65, 88, 60, 50, 178, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.AUDINO, 5, false, false, false, "Hearing Pokémon", PokemonType.NORMAL, null, 1.1, 31, AbilityId.HEALER, AbilityId.REGENERATOR, AbilityId.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, GrowthRate.FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.NORMAL, null, 1.1, 31, AbilityId.HEALER, AbilityId.REGENERATOR, AbilityId.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FAIRY, 1.5, 32, AbilityId.REGENERATOR, AbilityId.REGENERATOR, AbilityId.REGENERATOR, 545, 103, 60, 126, 80, 126, 50, 255, 50, 390) + ), + new PokemonSpecies(SpeciesId.TIMBURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 0.6, 12.5, AbilityId.GUTS, AbilityId.SHEER_FORCE, AbilityId.IRON_FIST, 305, 75, 80, 55, 25, 35, 35, 180, 70, 61, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(SpeciesId.GURDURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 1.2, 40, AbilityId.GUTS, AbilityId.SHEER_FORCE, AbilityId.IRON_FIST, 405, 85, 105, 85, 40, 50, 40, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(SpeciesId.CONKELDURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 1.4, 87, AbilityId.GUTS, AbilityId.SHEER_FORCE, AbilityId.IRON_FIST, 505, 105, 140, 95, 55, 65, 45, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false), + new PokemonSpecies(SpeciesId.TYMPOLE, 5, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 0.5, 4.5, AbilityId.SWIFT_SWIM, AbilityId.HYDRATION, AbilityId.WATER_ABSORB, 294, 50, 50, 40, 50, 40, 64, 255, 50, 59, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.PALPITOAD, 5, false, false, false, "Vibration Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.8, 17, AbilityId.SWIFT_SWIM, AbilityId.HYDRATION, AbilityId.WATER_ABSORB, 384, 75, 65, 55, 65, 55, 69, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SEISMITOAD, 5, false, false, false, "Vibration Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.5, 62, AbilityId.SWIFT_SWIM, AbilityId.POISON_TOUCH, AbilityId.WATER_ABSORB, 509, 105, 95, 75, 85, 75, 74, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.THROH, 5, false, false, false, "Judo Pokémon", PokemonType.FIGHTING, null, 1.3, 55.5, AbilityId.GUTS, AbilityId.INNER_FOCUS, AbilityId.MOLD_BREAKER, 465, 120, 100, 85, 30, 85, 45, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.SAWK, 5, false, false, false, "Karate Pokémon", PokemonType.FIGHTING, null, 1.4, 51, AbilityId.STURDY, AbilityId.INNER_FOCUS, AbilityId.MOLD_BREAKER, 465, 75, 125, 75, 30, 75, 85, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.SEWADDLE, 5, false, false, false, "Sewing Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.3, 2.5, AbilityId.SWARM, AbilityId.CHLOROPHYLL, AbilityId.OVERCOAT, 310, 45, 53, 70, 40, 60, 42, 255, 70, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SWADLOON, 5, false, false, false, "Leaf-Wrapped Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.5, 7.3, AbilityId.LEAF_GUARD, AbilityId.CHLOROPHYLL, AbilityId.OVERCOAT, 380, 55, 63, 90, 50, 80, 42, 120, 70, 133, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.LEAVANNY, 5, false, false, false, "Nurturing Pokémon", PokemonType.BUG, PokemonType.GRASS, 1.2, 20.5, AbilityId.SWARM, AbilityId.CHLOROPHYLL, AbilityId.OVERCOAT, 500, 75, 103, 80, 70, 80, 92, 45, 70, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.VENIPEDE, 5, false, false, false, "Centipede Pokémon", PokemonType.BUG, PokemonType.POISON, 0.4, 5.3, AbilityId.POISON_POINT, AbilityId.SWARM, AbilityId.SPEED_BOOST, 260, 30, 45, 59, 30, 39, 57, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.WHIRLIPEDE, 5, false, false, false, "Curlipede Pokémon", PokemonType.BUG, PokemonType.POISON, 1.2, 58.5, AbilityId.POISON_POINT, AbilityId.SWARM, AbilityId.SPEED_BOOST, 360, 40, 55, 99, 40, 79, 47, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SCOLIPEDE, 5, false, false, false, "Megapede Pokémon", PokemonType.BUG, PokemonType.POISON, 2.5, 200.5, AbilityId.POISON_POINT, AbilityId.SWARM, AbilityId.SPEED_BOOST, 485, 60, 100, 89, 55, 69, 112, 45, 50, 243, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.COTTONEE, 5, false, false, false, "Cotton Puff Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.3, 0.6, AbilityId.PRANKSTER, AbilityId.INFILTRATOR, AbilityId.CHLOROPHYLL, 280, 40, 27, 60, 37, 50, 66, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WHIMSICOTT, 5, false, false, false, "Windveiled Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.7, 6.6, AbilityId.PRANKSTER, AbilityId.INFILTRATOR, AbilityId.CHLOROPHYLL, 480, 60, 67, 85, 77, 75, 116, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PETILIL, 5, false, false, false, "Bulb Pokémon", PokemonType.GRASS, null, 0.5, 6.6, AbilityId.CHLOROPHYLL, AbilityId.OWN_TEMPO, AbilityId.LEAF_GUARD, 280, 45, 35, 50, 70, 50, 30, 190, 50, 56, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(SpeciesId.LILLIGANT, 5, false, false, false, "Flowering Pokémon", PokemonType.GRASS, null, 1.1, 16.3, AbilityId.CHLOROPHYLL, AbilityId.OWN_TEMPO, AbilityId.LEAF_GUARD, 480, 70, 60, 75, 110, 75, 90, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(SpeciesId.BASCULIN, 5, false, false, false, "Hostile Pokémon", PokemonType.WATER, null, 1, 18, AbilityId.RECKLESS, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 190, 50, 161, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Red-Striped Form", "red-striped", PokemonType.WATER, null, 1, 18, AbilityId.RECKLESS, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 190, 50, 161, false, null, true), + new PokemonForm("Blue-Striped Form", "blue-striped", PokemonType.WATER, null, 1, 18, AbilityId.ROCK_HEAD, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 190, 50, 161, false, null, true), + new PokemonForm("White-Striped Form", "white-striped", PokemonType.WATER, null, 1, 18, AbilityId.RATTLED, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 190, 50, 161, false, null, true) + ), + new PokemonSpecies(SpeciesId.SANDILE, 5, false, false, false, "Desert Croc Pokémon", PokemonType.GROUND, PokemonType.DARK, 0.7, 15.2, AbilityId.INTIMIDATE, AbilityId.MOXIE, AbilityId.ANGER_POINT, 292, 50, 72, 35, 35, 35, 65, 180, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.KROKOROK, 5, false, false, false, "Desert Croc Pokémon", PokemonType.GROUND, PokemonType.DARK, 1, 33.4, AbilityId.INTIMIDATE, AbilityId.MOXIE, AbilityId.ANGER_POINT, 351, 60, 82, 45, 45, 45, 74, 90, 50, 123, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.KROOKODILE, 5, false, false, false, "Intimidation Pokémon", PokemonType.GROUND, PokemonType.DARK, 1.5, 96.3, AbilityId.INTIMIDATE, AbilityId.MOXIE, AbilityId.ANGER_POINT, 519, 95, 117, 80, 65, 70, 92, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.DARUMAKA, 5, false, false, false, "Zen Charm Pokémon", PokemonType.FIRE, null, 0.6, 37.5, AbilityId.HUSTLE, AbilityId.NONE, AbilityId.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.DARMANITAN, 5, false, false, false, "Blazing Pokémon", PokemonType.FIRE, null, 1.3, 92.9, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Standard Mode", "", PokemonType.FIRE, null, 1.3, 92.9, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), + new PokemonForm("Zen Mode", "zen", PokemonType.FIRE, PokemonType.PSYCHIC, 1.3, 92.9, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.ZEN_MODE, 540, 105, 30, 105, 140, 105, 55, 60, 50, 189) + ), + new PokemonSpecies(SpeciesId.MARACTUS, 5, false, false, false, "Cactus Pokémon", PokemonType.GRASS, null, 1, 28, AbilityId.WATER_ABSORB, AbilityId.CHLOROPHYLL, AbilityId.STORM_DRAIN, 461, 75, 86, 67, 106, 67, 60, 255, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DWEBBLE, 5, false, false, false, "Rock Inn Pokémon", PokemonType.BUG, PokemonType.ROCK, 0.3, 14.5, AbilityId.STURDY, AbilityId.SHELL_ARMOR, AbilityId.WEAK_ARMOR, 325, 50, 65, 85, 35, 35, 55, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CRUSTLE, 5, false, false, false, "Stone Home Pokémon", PokemonType.BUG, PokemonType.ROCK, 1.4, 200, AbilityId.STURDY, AbilityId.SHELL_ARMOR, AbilityId.WEAK_ARMOR, 485, 70, 105, 125, 65, 75, 45, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SCRAGGY, 5, false, false, false, "Shedding Pokémon", PokemonType.DARK, PokemonType.FIGHTING, 0.6, 11.8, AbilityId.SHED_SKIN, AbilityId.MOXIE, AbilityId.INTIMIDATE, 348, 50, 75, 70, 35, 70, 48, 180, 35, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SCRAFTY, 5, false, false, false, "Hoodlum Pokémon", PokemonType.DARK, PokemonType.FIGHTING, 1.1, 30, AbilityId.SHED_SKIN, AbilityId.MOXIE, AbilityId.INTIMIDATE, 488, 65, 90, 115, 45, 115, 58, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SIGILYPH, 5, false, false, false, "Avianoid Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.4, 14, AbilityId.WONDER_SKIN, AbilityId.MAGIC_GUARD, AbilityId.TINTED_LENS, 490, 72, 58, 80, 103, 80, 97, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.YAMASK, 5, false, false, false, "Spirit Pokémon", PokemonType.GHOST, null, 0.5, 1.5, AbilityId.MUMMY, AbilityId.NONE, AbilityId.NONE, 303, 38, 30, 85, 55, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.COFAGRIGUS, 5, false, false, false, "Coffin Pokémon", PokemonType.GHOST, null, 1.7, 76.5, AbilityId.MUMMY, AbilityId.NONE, AbilityId.NONE, 483, 58, 50, 145, 95, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TIRTOUGA, 5, false, false, false, "Prototurtle Pokémon", PokemonType.WATER, PokemonType.ROCK, 0.7, 16.5, AbilityId.SOLID_ROCK, AbilityId.STURDY, AbilityId.SWIFT_SWIM, 355, 54, 78, 103, 53, 45, 22, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.CARRACOSTA, 5, false, false, false, "Prototurtle Pokémon", PokemonType.WATER, PokemonType.ROCK, 1.2, 81, AbilityId.SOLID_ROCK, AbilityId.STURDY, AbilityId.SWIFT_SWIM, 495, 74, 108, 133, 83, 65, 32, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.ARCHEN, 5, false, false, false, "First Bird Pokémon", PokemonType.ROCK, PokemonType.FLYING, 0.5, 9.5, AbilityId.DEFEATIST, AbilityId.NONE, AbilityId.WIMP_OUT, 401, 55, 112, 45, 74, 45, 70, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden + new PokemonSpecies(SpeciesId.ARCHEOPS, 5, false, false, false, "First Bird Pokémon", PokemonType.ROCK, PokemonType.FLYING, 1.4, 32, AbilityId.DEFEATIST, AbilityId.NONE, AbilityId.EMERGENCY_EXIT, 567, 75, 140, 65, 112, 65, 110, 45, 50, 177, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden + new PokemonSpecies(SpeciesId.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", PokemonType.POISON, null, 0.6, 31, AbilityId.STENCH, AbilityId.STICKY_HOLD, AbilityId.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", PokemonType.POISON, null, 1.9, 107.3, AbilityId.STENCH, AbilityId.WEAK_ARMOR, AbilityId.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.POISON, null, 1.9, 107.3, AbilityId.STENCH, AbilityId.WEAK_ARMOR, AbilityId.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.POISON, PokemonType.STEEL, 21, 999.9, AbilityId.TOXIC_DEBRIS, AbilityId.TOXIC_DEBRIS, AbilityId.TOXIC_DEBRIS, 574, 115, 121, 102, 81, 102, 53, 60, 50, 166) + ), + new PokemonSpecies(SpeciesId.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", PokemonType.DARK, null, 0.7, 12.5, AbilityId.ILLUSION, AbilityId.NONE, AbilityId.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", PokemonType.DARK, null, 1.6, 81.1, AbilityId.ILLUSION, AbilityId.NONE, AbilityId.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.MINCCINO, 5, false, false, false, "Chinchilla Pokémon", PokemonType.NORMAL, null, 0.4, 5.8, AbilityId.CUTE_CHARM, AbilityId.TECHNICIAN, AbilityId.SKILL_LINK, 300, 55, 50, 40, 40, 40, 75, 255, 50, 60, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.CINCCINO, 5, false, false, false, "Scarf Pokémon", PokemonType.NORMAL, null, 0.5, 7.5, AbilityId.CUTE_CHARM, AbilityId.TECHNICIAN, AbilityId.SKILL_LINK, 470, 75, 95, 60, 65, 60, 115, 60, 50, 165, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.GOTHITA, 5, false, false, false, "Fixation Pokémon", PokemonType.PSYCHIC, null, 0.4, 5.8, AbilityId.FRISK, AbilityId.COMPETITIVE, AbilityId.SHADOW_TAG, 290, 45, 30, 50, 55, 65, 45, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(SpeciesId.GOTHORITA, 5, false, false, false, "Manipulate Pokémon", PokemonType.PSYCHIC, null, 0.7, 18, AbilityId.FRISK, AbilityId.COMPETITIVE, AbilityId.SHADOW_TAG, 390, 60, 45, 70, 75, 85, 55, 100, 50, 137, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(SpeciesId.GOTHITELLE, 5, false, false, false, "Astral Body Pokémon", PokemonType.PSYCHIC, null, 1.5, 44, AbilityId.FRISK, AbilityId.COMPETITIVE, AbilityId.SHADOW_TAG, 490, 70, 55, 95, 95, 110, 65, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 25, false), + new PokemonSpecies(SpeciesId.SOLOSIS, 5, false, false, false, "Cell Pokémon", PokemonType.PSYCHIC, null, 0.3, 1, AbilityId.OVERCOAT, AbilityId.MAGIC_GUARD, AbilityId.REGENERATOR, 290, 45, 30, 40, 105, 50, 20, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.DUOSION, 5, false, false, false, "Mitosis Pokémon", PokemonType.PSYCHIC, null, 0.6, 8, AbilityId.OVERCOAT, AbilityId.MAGIC_GUARD, AbilityId.REGENERATOR, 370, 65, 40, 50, 125, 60, 30, 100, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.REUNICLUS, 5, false, false, false, "Multiplying Pokémon", PokemonType.PSYCHIC, null, 1, 20.1, AbilityId.OVERCOAT, AbilityId.MAGIC_GUARD, AbilityId.REGENERATOR, 490, 110, 65, 75, 125, 85, 30, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.DUCKLETT, 5, false, false, false, "Water Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 0.5, 5.5, AbilityId.KEEN_EYE, AbilityId.BIG_PECKS, AbilityId.HYDRATION, 305, 62, 44, 50, 44, 50, 55, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SWANNA, 5, false, false, false, "White Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 1.3, 24.2, AbilityId.KEEN_EYE, AbilityId.BIG_PECKS, AbilityId.HYDRATION, 473, 75, 87, 63, 87, 63, 98, 45, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.VANILLITE, 5, false, false, false, "Fresh Snow Pokémon", PokemonType.ICE, null, 0.4, 5.7, AbilityId.ICE_BODY, AbilityId.SNOW_CLOAK, AbilityId.WEAK_ARMOR, 305, 36, 50, 50, 65, 60, 44, 255, 50, 61, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.VANILLISH, 5, false, false, false, "Icy Snow Pokémon", PokemonType.ICE, null, 1.1, 41, AbilityId.ICE_BODY, AbilityId.SNOW_CLOAK, AbilityId.WEAK_ARMOR, 395, 51, 65, 65, 80, 75, 59, 120, 50, 138, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.VANILLUXE, 5, false, false, false, "Snowstorm Pokémon", PokemonType.ICE, null, 1.3, 57.5, AbilityId.ICE_BODY, AbilityId.SNOW_WARNING, AbilityId.WEAK_ARMOR, 535, 71, 95, 85, 110, 95, 79, 45, 50, 268, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.DEERLING, 5, false, false, false, "Season Pokémon", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Spring Form", "spring", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Summer Form", "summer", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Autumn Form", "autumn", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), + new PokemonForm("Winter Form", "winter", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true) + ), + new PokemonSpecies(SpeciesId.SAWSBUCK, 5, false, false, false, "Season Pokémon", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Spring Form", "spring", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), + new PokemonForm("Summer Form", "summer", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), + new PokemonForm("Autumn Form", "autumn", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), + new PokemonForm("Winter Form", "winter", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true) + ), + new PokemonSpecies(SpeciesId.EMOLGA, 5, false, false, false, "Sky Squirrel Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 0.4, 5, AbilityId.STATIC, AbilityId.NONE, AbilityId.MOTOR_DRIVE, 428, 55, 75, 60, 75, 60, 103, 200, 50, 150, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.KARRABLAST, 5, false, false, false, "Clamping Pokémon", PokemonType.BUG, null, 0.5, 5.9, AbilityId.SWARM, AbilityId.SHED_SKIN, AbilityId.NO_GUARD, 315, 50, 75, 45, 40, 45, 60, 200, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ESCAVALIER, 5, false, false, false, "Cavalry Pokémon", PokemonType.BUG, PokemonType.STEEL, 1, 33, AbilityId.SWARM, AbilityId.SHELL_ARMOR, AbilityId.OVERCOAT, 495, 70, 135, 105, 60, 105, 20, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FOONGUS, 5, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.2, 1, AbilityId.EFFECT_SPORE, AbilityId.NONE, AbilityId.REGENERATOR, 294, 69, 55, 45, 55, 55, 15, 190, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.AMOONGUSS, 5, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.6, 10.5, AbilityId.EFFECT_SPORE, AbilityId.NONE, AbilityId.REGENERATOR, 464, 114, 85, 70, 85, 80, 30, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FRILLISH, 5, false, false, false, "Floating Pokémon", PokemonType.WATER, PokemonType.GHOST, 1.2, 33, AbilityId.WATER_ABSORB, AbilityId.CURSED_BODY, AbilityId.DAMP, 335, 55, 40, 50, 65, 85, 40, 190, 50, 67, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.JELLICENT, 5, false, false, false, "Floating Pokémon", PokemonType.WATER, PokemonType.GHOST, 2.2, 135, AbilityId.WATER_ABSORB, AbilityId.CURSED_BODY, AbilityId.DAMP, 480, 100, 60, 70, 85, 105, 60, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), + new PokemonSpecies(SpeciesId.ALOMOMOLA, 5, false, false, false, "Caring Pokémon", PokemonType.WATER, null, 1.2, 31.6, AbilityId.HEALER, AbilityId.HYDRATION, AbilityId.REGENERATOR, 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.JOLTIK, 5, false, false, false, "Attaching Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.1, 0.6, AbilityId.COMPOUND_EYES, AbilityId.UNNERVE, AbilityId.SWARM, 319, 50, 47, 50, 57, 50, 65, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALVANTULA, 5, false, false, false, "EleSpider Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.8, 14.3, AbilityId.COMPOUND_EYES, AbilityId.UNNERVE, AbilityId.SWARM, 472, 70, 77, 60, 97, 60, 108, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", PokemonType.GRASS, PokemonType.STEEL, 0.6, 18.8, AbilityId.IRON_BARBS, AbilityId.NONE, AbilityId.ANTICIPATION, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FERROTHORN, 5, false, false, false, "Thorn Pod Pokémon", PokemonType.GRASS, PokemonType.STEEL, 1, 110, AbilityId.IRON_BARBS, AbilityId.NONE, AbilityId.ANTICIPATION, 489, 74, 94, 131, 54, 116, 20, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.KLINK, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.3, 21, AbilityId.PLUS, AbilityId.MINUS, AbilityId.CLEAR_BODY, 300, 40, 55, 70, 45, 60, 30, 130, 50, 60, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(SpeciesId.KLANG, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.6, 51, AbilityId.PLUS, AbilityId.MINUS, AbilityId.CLEAR_BODY, 440, 60, 80, 95, 70, 85, 50, 60, 50, 154, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(SpeciesId.KLINKLANG, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.6, 81, AbilityId.PLUS, AbilityId.MINUS, AbilityId.CLEAR_BODY, 520, 60, 100, 115, 70, 85, 90, 30, 50, 260, GrowthRate.MEDIUM_SLOW, null, false), + new PokemonSpecies(SpeciesId.TYNAMO, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 0.2, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 275, 35, 55, 40, 45, 40, 60, 190, 70, 55, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.EELEKTRIK, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 1.2, 22, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 405, 65, 85, 70, 75, 70, 40, 60, 70, 142, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.EELEKTROSS, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 2.1, 80.5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 515, 85, 115, 80, 105, 80, 50, 30, 70, 258, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.ELGYEM, 5, false, false, false, "Cerebral Pokémon", PokemonType.PSYCHIC, null, 0.5, 9, AbilityId.TELEPATHY, AbilityId.SYNCHRONIZE, AbilityId.ANALYTIC, 335, 55, 55, 55, 85, 55, 30, 255, 50, 67, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BEHEEYEM, 5, false, false, false, "Cerebral Pokémon", PokemonType.PSYCHIC, null, 1, 34.5, AbilityId.TELEPATHY, AbilityId.SYNCHRONIZE, AbilityId.ANALYTIC, 485, 75, 75, 75, 125, 95, 40, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LITWICK, 5, false, false, false, "Candle Pokémon", PokemonType.GHOST, PokemonType.FIRE, 0.3, 3.1, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, AbilityId.INFILTRATOR, 275, 50, 30, 55, 65, 55, 20, 190, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.LAMPENT, 5, false, false, false, "Lamp Pokémon", PokemonType.GHOST, PokemonType.FIRE, 0.6, 13, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, AbilityId.INFILTRATOR, 370, 60, 40, 60, 95, 60, 55, 90, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CHANDELURE, 5, false, false, false, "Luring Pokémon", PokemonType.GHOST, PokemonType.FIRE, 1, 34.3, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, AbilityId.INFILTRATOR, 520, 60, 55, 90, 145, 90, 80, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.AXEW, 5, false, false, false, "Tusk Pokémon", PokemonType.DRAGON, null, 0.6, 18, AbilityId.RIVALRY, AbilityId.MOLD_BREAKER, AbilityId.UNNERVE, 320, 46, 87, 60, 30, 40, 57, 75, 35, 64, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.FRAXURE, 5, false, false, false, "Axe Jaw Pokémon", PokemonType.DRAGON, null, 1, 36, AbilityId.RIVALRY, AbilityId.MOLD_BREAKER, AbilityId.UNNERVE, 410, 66, 117, 70, 40, 50, 67, 60, 35, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.HAXORUS, 5, false, false, false, "Axe Jaw Pokémon", PokemonType.DRAGON, null, 1.8, 105.5, AbilityId.RIVALRY, AbilityId.MOLD_BREAKER, AbilityId.UNNERVE, 540, 76, 147, 90, 60, 70, 97, 45, 35, 270, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.CUBCHOO, 5, false, false, false, "Chill Pokémon", PokemonType.ICE, null, 0.5, 8.5, AbilityId.SNOW_CLOAK, AbilityId.SLUSH_RUSH, AbilityId.RATTLED, 305, 55, 70, 40, 60, 40, 40, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BEARTIC, 5, false, false, false, "Freezing Pokémon", PokemonType.ICE, null, 2.6, 260, AbilityId.SNOW_CLOAK, AbilityId.SLUSH_RUSH, AbilityId.SWIFT_SWIM, 505, 95, 130, 80, 70, 80, 50, 60, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CRYOGONAL, 5, false, false, false, "Crystallizing Pokémon", PokemonType.ICE, null, 1.1, 148, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 515, 80, 50, 50, 95, 135, 105, 25, 50, 180, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.SHELMET, 5, false, false, false, "Snail Pokémon", PokemonType.BUG, null, 0.4, 7.7, AbilityId.HYDRATION, AbilityId.SHELL_ARMOR, AbilityId.OVERCOAT, 305, 50, 40, 85, 40, 65, 25, 200, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ACCELGOR, 5, false, false, false, "Shell Out Pokémon", PokemonType.BUG, null, 0.8, 25.3, AbilityId.HYDRATION, AbilityId.STICKY_HOLD, AbilityId.UNBURDEN, 495, 80, 70, 40, 100, 60, 145, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.STUNFISK, 5, false, false, false, "Trap Pokémon", PokemonType.GROUND, PokemonType.ELECTRIC, 0.7, 11, AbilityId.STATIC, AbilityId.LIMBER, AbilityId.SAND_VEIL, 471, 109, 66, 84, 81, 99, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MIENFOO, 5, false, false, false, "Martial Arts Pokémon", PokemonType.FIGHTING, null, 0.9, 20, AbilityId.INNER_FOCUS, AbilityId.REGENERATOR, AbilityId.RECKLESS, 350, 45, 85, 50, 55, 50, 65, 180, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.MIENSHAO, 5, false, false, false, "Martial Arts Pokémon", PokemonType.FIGHTING, null, 1.4, 35.5, AbilityId.INNER_FOCUS, AbilityId.REGENERATOR, AbilityId.RECKLESS, 510, 65, 125, 60, 95, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.DRUDDIGON, 5, false, false, false, "Cave Pokémon", PokemonType.DRAGON, null, 1.6, 139, AbilityId.ROUGH_SKIN, AbilityId.SHEER_FORCE, AbilityId.MOLD_BREAKER, 485, 77, 120, 90, 60, 90, 48, 45, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GOLETT, 5, false, false, false, "Automaton Pokémon", PokemonType.GROUND, PokemonType.GHOST, 1, 92, AbilityId.IRON_FIST, AbilityId.KLUTZ, AbilityId.NO_GUARD, 303, 59, 74, 50, 35, 50, 35, 190, 50, 61, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.GOLURK, 5, false, false, false, "Automaton Pokémon", PokemonType.GROUND, PokemonType.GHOST, 2.8, 330, AbilityId.IRON_FIST, AbilityId.KLUTZ, AbilityId.NO_GUARD, 483, 89, 124, 80, 55, 80, 55, 90, 50, 169, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.PAWNIARD, 5, false, false, false, "Sharp Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 0.5, 10.2, AbilityId.DEFIANT, AbilityId.INNER_FOCUS, AbilityId.PRESSURE, 340, 45, 85, 70, 40, 40, 60, 120, 35, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BISHARP, 5, false, false, false, "Sword Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 1.6, 70, AbilityId.DEFIANT, AbilityId.INNER_FOCUS, AbilityId.PRESSURE, 490, 65, 125, 100, 60, 70, 70, 45, 35, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BOUFFALANT, 5, false, false, false, "Bash Buffalo Pokémon", PokemonType.NORMAL, null, 1.6, 94.6, AbilityId.RECKLESS, AbilityId.SAP_SIPPER, AbilityId.SOUNDPROOF, 490, 95, 110, 95, 40, 95, 55, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.RUFFLET, 5, false, false, false, "Eaglet Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.5, 10.5, AbilityId.KEEN_EYE, AbilityId.SHEER_FORCE, AbilityId.HUSTLE, 350, 70, 83, 50, 37, 50, 60, 190, 50, 70, GrowthRate.SLOW, 100, false), + new PokemonSpecies(SpeciesId.BRAVIARY, 5, false, false, false, "Valiant Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 41, AbilityId.KEEN_EYE, AbilityId.SHEER_FORCE, AbilityId.DEFIANT, 510, 100, 123, 75, 57, 75, 80, 60, 50, 179, GrowthRate.SLOW, 100, false), + new PokemonSpecies(SpeciesId.VULLABY, 5, false, false, false, "Diapered Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.5, 9, AbilityId.BIG_PECKS, AbilityId.OVERCOAT, AbilityId.WEAK_ARMOR, 370, 70, 55, 75, 45, 65, 60, 190, 35, 74, GrowthRate.SLOW, 0, false), + new PokemonSpecies(SpeciesId.MANDIBUZZ, 5, false, false, false, "Bone Vulture Pokémon", PokemonType.DARK, PokemonType.FLYING, 1.2, 39.5, AbilityId.BIG_PECKS, AbilityId.OVERCOAT, AbilityId.WEAK_ARMOR, 510, 110, 65, 105, 55, 95, 80, 60, 35, 179, GrowthRate.SLOW, 0, false), + new PokemonSpecies(SpeciesId.HEATMOR, 5, false, false, false, "Anteater Pokémon", PokemonType.FIRE, null, 1.4, 58, AbilityId.GLUTTONY, AbilityId.FLASH_FIRE, AbilityId.WHITE_SMOKE, 484, 85, 97, 66, 105, 66, 65, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DURANT, 5, false, false, false, "Iron Ant Pokémon", PokemonType.BUG, PokemonType.STEEL, 0.3, 33, AbilityId.SWARM, AbilityId.HUSTLE, AbilityId.TRUANT, 484, 58, 109, 112, 48, 48, 109, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DEINO, 5, false, false, false, "Irate Pokémon", PokemonType.DARK, PokemonType.DRAGON, 0.8, 17.3, AbilityId.HUSTLE, AbilityId.NONE, AbilityId.NONE, 300, 52, 65, 50, 45, 50, 38, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.ZWEILOUS, 5, false, false, false, "Hostile Pokémon", PokemonType.DARK, PokemonType.DRAGON, 1.4, 50, AbilityId.HUSTLE, AbilityId.NONE, AbilityId.NONE, 420, 72, 85, 70, 65, 70, 58, 45, 35, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.HYDREIGON, 5, false, false, false, "Brutal Pokémon", PokemonType.DARK, PokemonType.DRAGON, 1.8, 160, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 92, 105, 90, 125, 90, 98, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.LARVESTA, 5, false, false, false, "Torch Pokémon", PokemonType.BUG, PokemonType.FIRE, 1.1, 28.8, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.SWARM, 360, 55, 85, 55, 50, 55, 60, 45, 50, 72, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.VOLCARONA, 5, false, false, false, "Sun Pokémon", PokemonType.BUG, PokemonType.FIRE, 1.6, 46, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.SWARM, 550, 85, 60, 65, 135, 105, 100, 15, 50, 275, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.COBALION, 5, true, false, false, "Iron Will Pokémon", PokemonType.STEEL, PokemonType.FIGHTING, 2.1, 250, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 90, 129, 90, 72, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.TERRAKION, 5, true, false, false, "Cavern Pokémon", PokemonType.ROCK, PokemonType.FIGHTING, 1.9, 260, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 129, 90, 72, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.VIRIZION, 5, true, false, false, "Grassland Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 2, 200, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 90, 72, 90, 129, 108, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.TORNADUS, 5, true, false, false, "Cyclone Pokémon", PokemonType.FLYING, null, 1.5, 63, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Incarnate Forme", "incarnate", PokemonType.FLYING, null, 1.5, 63, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), + new PokemonForm("Therian Forme", "therian", PokemonType.FLYING, null, 1.4, 63, AbilityId.REGENERATOR, AbilityId.NONE, AbilityId.REGENERATOR, 580, 79, 100, 80, 110, 90, 121, 3, 90, 290) + ), + new PokemonSpecies(SpeciesId.THUNDURUS, 5, true, false, false, "Bolt Strike Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.5, 61, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Incarnate Forme", "incarnate", PokemonType.ELECTRIC, PokemonType.FLYING, 1.5, 61, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), + new PokemonForm("Therian Forme", "therian", PokemonType.ELECTRIC, PokemonType.FLYING, 3, 61, AbilityId.VOLT_ABSORB, AbilityId.NONE, AbilityId.VOLT_ABSORB, 580, 79, 105, 70, 145, 80, 101, 3, 90, 290) + ), + new PokemonSpecies(SpeciesId.RESHIRAM, 5, false, true, false, "Vast White Pokémon", PokemonType.DRAGON, PokemonType.FIRE, 3.2, 330, AbilityId.TURBOBLAZE, AbilityId.NONE, AbilityId.NONE, 680, 100, 120, 100, 150, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ZEKROM, 5, false, true, false, "Deep Black Pokémon", PokemonType.DRAGON, PokemonType.ELECTRIC, 2.9, 345, AbilityId.TERAVOLT, AbilityId.NONE, AbilityId.NONE, 680, 100, 150, 120, 120, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.LANDORUS, 5, true, false, false, "Abundance Pokémon", PokemonType.GROUND, PokemonType.FLYING, 1.5, 68, AbilityId.SAND_FORCE, AbilityId.NONE, AbilityId.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, GrowthRate.SLOW, 100, false, true, + new PokemonForm("Incarnate Forme", "incarnate", PokemonType.GROUND, PokemonType.FLYING, 1.5, 68, AbilityId.SAND_FORCE, AbilityId.NONE, AbilityId.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, false, null, true), + new PokemonForm("Therian Forme", "therian", PokemonType.GROUND, PokemonType.FLYING, 1.3, 68, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.INTIMIDATE, 600, 89, 145, 90, 105, 80, 91, 3, 90, 300) + ), + new PokemonSpecies(SpeciesId.KYUREM, 5, false, true, false, "Boundary Pokémon", PokemonType.DRAGON, PokemonType.ICE, 3, 325, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.ICE, 3, 325, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, false, null, true), + new PokemonForm("Black", "black", PokemonType.DRAGON, PokemonType.ICE, 3.3, 325, AbilityId.TERAVOLT, AbilityId.NONE, AbilityId.NONE, 700, 125, 170, 100, 120, 90, 95, 3, 0, 350), + new PokemonForm("White", "white", PokemonType.DRAGON, PokemonType.ICE, 3.6, 325, AbilityId.TURBOBLAZE, AbilityId.NONE, AbilityId.NONE, 700, 125, 120, 90, 170, 100, 95, 3, 0, 350) + ), + new PokemonSpecies(SpeciesId.KELDEO, 5, false, false, true, "Colt Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false, true, + new PokemonForm("Ordinary Form", "ordinary", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, false, null, true), + new PokemonForm("Resolute", "resolute", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290) + ), + new PokemonSpecies(SpeciesId.MELOETTA, 5, false, false, true, "Melody Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 0.6, 6.5, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Aria Forme", "aria", PokemonType.NORMAL, PokemonType.PSYCHIC, 0.6, 6.5, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, false, null, true), + new PokemonForm("Pirouette Forme", "pirouette", PokemonType.NORMAL, PokemonType.FIGHTING, 0.6, 6.5, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 128, 90, 77, 77, 128, 3, 100, 300, false, null, true) + ), + new PokemonSpecies(SpeciesId.GENESECT, 5, false, false, true, "Paleozoic Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, false, null, true), + new PokemonForm("Shock Drive", "shock", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Burn Drive", "burn", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Chill Drive", "chill", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), + new PokemonForm("Douse Drive", "douse", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300) + ), + new PokemonSpecies(SpeciesId.CHESPIN, 6, false, false, false, "Spiny Nut Pokémon", PokemonType.GRASS, null, 0.4, 9, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.BULLETPROOF, 313, 56, 61, 65, 48, 45, 38, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.QUILLADIN, 6, false, false, false, "Spiny Armor Pokémon", PokemonType.GRASS, null, 0.7, 29, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.BULLETPROOF, 405, 61, 78, 95, 56, 58, 57, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.CHESNAUGHT, 6, false, false, false, "Spiny Armor Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.6, 90, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.BULLETPROOF, 530, 88, 107, 122, 74, 75, 64, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.FENNEKIN, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 0.4, 9.4, AbilityId.BLAZE, AbilityId.NONE, AbilityId.MAGICIAN, 307, 40, 45, 40, 62, 60, 60, 45, 70, 61, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.BRAIXEN, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 1, 14.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.MAGICIAN, 409, 59, 59, 58, 90, 70, 73, 45, 70, 143, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.DELPHOX, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 39, AbilityId.BLAZE, AbilityId.NONE, AbilityId.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.3, 7, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false, false, + new PokemonForm("Normal", "", PokemonType.WATER, null, 0.3, 7, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, null, true), + new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.3, 7, AbilityId.TORRENT, AbilityId.NONE, AbilityId.TORRENT, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true) + ), + new PokemonSpecies(SpeciesId.FROGADIER, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.6, 10.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false, false, + new PokemonForm("Normal", "", PokemonType.WATER, null, 0.6, 10.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, null, true), + new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.6, 10.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.NONE, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true) + ), + new PokemonSpecies(SpeciesId.GRENINJA, 6, false, false, false, "Ninja Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 40, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, false, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DARK, 1.5, 40, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, null, true), + new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, PokemonType.DARK, 1.5, 40, AbilityId.BATTLE_BOND, AbilityId.NONE, AbilityId.BATTLE_BOND, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, "", true), + new PokemonForm("Ash", "ash", PokemonType.WATER, PokemonType.DARK, 1.5, 40, AbilityId.BATTLE_BOND, AbilityId.NONE, AbilityId.NONE, 640, 72, 145, 67, 153, 71, 132, 45, 70, 265) + ), + new PokemonSpecies(SpeciesId.BUNNELBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, null, 0.4, 5, AbilityId.PICKUP, AbilityId.CHEEK_POUCH, AbilityId.HUGE_POWER, 237, 38, 36, 38, 32, 36, 57, 255, 50, 47, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DIGGERSBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, PokemonType.GROUND, 1, 42.4, AbilityId.PICKUP, AbilityId.CHEEK_POUCH, AbilityId.HUGE_POWER, 423, 85, 56, 77, 50, 77, 78, 127, 50, 148, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FLETCHLING, 6, false, false, false, "Tiny Robin Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.7, AbilityId.BIG_PECKS, AbilityId.NONE, AbilityId.GALE_WINGS, 278, 45, 50, 43, 40, 38, 62, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.FLETCHINDER, 6, false, false, false, "Ember Pokémon", PokemonType.FIRE, PokemonType.FLYING, 0.7, 16, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.GALE_WINGS, 382, 62, 73, 55, 56, 52, 84, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.TALONFLAME, 6, false, false, false, "Scorching Pokémon", PokemonType.FIRE, PokemonType.FLYING, 1.2, 24.5, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.GALE_WINGS, 499, 78, 81, 71, 74, 69, 126, 45, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SCATTERBUG, 6, false, false, false, "Scatterdust Pokémon", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("River Pattern", "river", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), + new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true) + ), + new PokemonSpecies(SpeciesId.SPEWPA, 6, false, false, false, "Scatterdust Pokémon", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.SHED_SKIN, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("River Pattern", "river", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), + new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true) + ), + new PokemonSpecies(SpeciesId.VIVILLON, 6, false, false, false, "Scale Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("River Pattern", "river", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), + new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true) + ), + new PokemonSpecies(SpeciesId.LITLEO, 6, false, false, false, "Lion Cub Pokémon", PokemonType.FIRE, PokemonType.NORMAL, 0.6, 13.5, AbilityId.RIVALRY, AbilityId.UNNERVE, AbilityId.MOXIE, 369, 62, 50, 58, 73, 54, 72, 220, 70, 74, GrowthRate.MEDIUM_SLOW, 12.5, false), + new PokemonSpecies(SpeciesId.PYROAR, 6, false, false, false, "Royal Pokémon", PokemonType.FIRE, PokemonType.NORMAL, 1.5, 81.5, AbilityId.RIVALRY, AbilityId.UNNERVE, AbilityId.MOXIE, 507, 86, 68, 72, 109, 66, 106, 65, 70, 177, GrowthRate.MEDIUM_SLOW, 12.5, true), + new PokemonSpecies(SpeciesId.FLABEBE, 6, false, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), + new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true) + ), + new PokemonSpecies(SpeciesId.FLOETTE, 6, false, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), + new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true) + ), + new PokemonSpecies(SpeciesId.FLORGES, 6, false, false, false, "Garden Pokémon", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, GrowthRate.MEDIUM_FAST, 0, false, false, + new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), + new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true) + ), + new PokemonSpecies(SpeciesId.SKIDDO, 6, false, false, false, "Mount Pokémon", PokemonType.GRASS, null, 0.9, 31, AbilityId.SAP_SIPPER, AbilityId.NONE, AbilityId.GRASS_PELT, 350, 66, 65, 48, 62, 57, 52, 200, 70, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GOGOAT, 6, false, false, false, "Mount Pokémon", PokemonType.GRASS, null, 1.7, 91, AbilityId.SAP_SIPPER, AbilityId.NONE, AbilityId.GRASS_PELT, 531, 123, 100, 62, 97, 81, 68, 45, 70, 186, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PANCHAM, 6, false, false, false, "Playful Pokémon", PokemonType.FIGHTING, null, 0.6, 8, AbilityId.IRON_FIST, AbilityId.MOLD_BREAKER, AbilityId.SCRAPPY, 348, 67, 82, 62, 46, 48, 43, 220, 50, 70, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PANGORO, 6, false, false, false, "Daunting Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 2.1, 136, AbilityId.IRON_FIST, AbilityId.MOLD_BREAKER, AbilityId.SCRAPPY, 495, 95, 124, 78, 69, 71, 58, 65, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FURFROU, 6, false, false, false, "Poodle Pokémon", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Natural Form", "", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Heart Trim", "heart", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Star Trim", "star", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Diamond Trim", "diamond", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Debutante Trim", "debutante", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Matron Trim", "matron", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Dandy Trim", "dandy", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("La Reine Trim", "la-reine", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Kabuki Trim", "kabuki", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), + new PokemonForm("Pharaoh Trim", "pharaoh", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true) + ), + new PokemonSpecies(SpeciesId.ESPURR, 6, false, false, false, "Restraint Pokémon", PokemonType.PSYCHIC, null, 0.3, 3.5, AbilityId.KEEN_EYE, AbilityId.INFILTRATOR, AbilityId.OWN_TEMPO, 355, 62, 48, 54, 63, 60, 68, 190, 50, 71, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MEOWSTIC, 6, false, false, false, "Constraint Pokémon", PokemonType.PSYCHIC, null, 0.6, 8.5, AbilityId.KEEN_EYE, AbilityId.INFILTRATOR, AbilityId.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.PSYCHIC, null, 0.6, 8.5, AbilityId.KEEN_EYE, AbilityId.INFILTRATOR, AbilityId.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, "", true), + new PokemonForm("Female", "female", PokemonType.PSYCHIC, null, 0.6, 8.5, AbilityId.KEEN_EYE, AbilityId.INFILTRATOR, AbilityId.COMPETITIVE, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, null, true) + ), + new PokemonSpecies(SpeciesId.HONEDGE, 6, false, false, false, "Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 0.8, 2, AbilityId.NO_GUARD, AbilityId.NONE, AbilityId.NONE, 325, 45, 80, 100, 35, 37, 28, 180, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DOUBLADE, 6, false, false, false, "Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 0.8, 4.5, AbilityId.NO_GUARD, AbilityId.NONE, AbilityId.NONE, 448, 59, 110, 150, 45, 49, 35, 90, 50, 157, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.AEGISLASH, 6, false, false, false, "Royal Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, AbilityId.STANCE_CHANGE, AbilityId.NONE, AbilityId.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Shield Forme", "shield", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, AbilityId.STANCE_CHANGE, AbilityId.NONE, AbilityId.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, false, "", true), + new PokemonForm("Blade Forme", "blade", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, AbilityId.STANCE_CHANGE, AbilityId.NONE, AbilityId.NONE, 500, 60, 140, 50, 140, 50, 60, 45, 50, 250) + ), + new PokemonSpecies(SpeciesId.SPRITZEE, 6, false, false, false, "Perfume Pokémon", PokemonType.FAIRY, null, 0.2, 0.5, AbilityId.HEALER, AbilityId.NONE, AbilityId.AROMA_VEIL, 341, 78, 52, 60, 63, 65, 23, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.AROMATISSE, 6, false, false, false, "Fragrance Pokémon", PokemonType.FAIRY, null, 0.8, 15.5, AbilityId.HEALER, AbilityId.NONE, AbilityId.AROMA_VEIL, 462, 101, 72, 72, 99, 89, 29, 140, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SWIRLIX, 6, false, false, false, "Cotton Candy Pokémon", PokemonType.FAIRY, null, 0.4, 3.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.UNBURDEN, 341, 62, 48, 66, 59, 57, 49, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SLURPUFF, 6, false, false, false, "Meringue Pokémon", PokemonType.FAIRY, null, 0.8, 5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.UNBURDEN, 480, 82, 80, 86, 85, 75, 72, 140, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.INKAY, 6, false, false, false, "Revolving Pokémon", PokemonType.DARK, PokemonType.PSYCHIC, 0.4, 3.5, AbilityId.CONTRARY, AbilityId.SUCTION_CUPS, AbilityId.INFILTRATOR, 288, 53, 54, 53, 37, 46, 45, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MALAMAR, 6, false, false, false, "Overturning Pokémon", PokemonType.DARK, PokemonType.PSYCHIC, 1.5, 47, AbilityId.CONTRARY, AbilityId.SUCTION_CUPS, AbilityId.INFILTRATOR, 482, 86, 92, 88, 68, 75, 73, 80, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BINACLE, 6, false, false, false, "Two-Handed Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.5, 31, AbilityId.TOUGH_CLAWS, AbilityId.SNIPER, AbilityId.PICKPOCKET, 306, 42, 52, 67, 39, 56, 50, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BARBARACLE, 6, false, false, false, "Collective Pokémon", PokemonType.ROCK, PokemonType.WATER, 1.3, 96, AbilityId.TOUGH_CLAWS, AbilityId.SNIPER, AbilityId.PICKPOCKET, 500, 72, 105, 115, 54, 86, 68, 45, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SKRELP, 6, false, false, false, "Mock Kelp Pokémon", PokemonType.POISON, PokemonType.WATER, 0.5, 7.3, AbilityId.POISON_POINT, AbilityId.POISON_TOUCH, AbilityId.ADAPTABILITY, 320, 50, 60, 60, 60, 60, 30, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DRAGALGE, 6, false, false, false, "Mock Kelp Pokémon", PokemonType.POISON, PokemonType.DRAGON, 1.8, 81.5, AbilityId.POISON_POINT, AbilityId.POISON_TOUCH, AbilityId.ADAPTABILITY, 494, 65, 75, 90, 97, 123, 44, 55, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CLAUNCHER, 6, false, false, false, "Water Gun Pokémon", PokemonType.WATER, null, 0.5, 8.3, AbilityId.MEGA_LAUNCHER, AbilityId.NONE, AbilityId.NONE, 330, 50, 53, 62, 58, 63, 44, 225, 50, 66, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.CLAWITZER, 6, false, false, false, "Howitzer Pokémon", PokemonType.WATER, null, 1.3, 35.3, AbilityId.MEGA_LAUNCHER, AbilityId.NONE, AbilityId.NONE, 500, 71, 73, 88, 120, 89, 59, 55, 50, 100, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.HELIOPTILE, 6, false, false, false, "Generator Pokémon", PokemonType.ELECTRIC, PokemonType.NORMAL, 0.5, 6, AbilityId.DRY_SKIN, AbilityId.SAND_VEIL, AbilityId.SOLAR_POWER, 289, 44, 38, 33, 61, 43, 70, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HELIOLISK, 6, false, false, false, "Generator Pokémon", PokemonType.ELECTRIC, PokemonType.NORMAL, 1, 21, AbilityId.DRY_SKIN, AbilityId.SAND_VEIL, AbilityId.SOLAR_POWER, 481, 62, 55, 52, 109, 94, 109, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TYRUNT, 6, false, false, false, "Royal Heir Pokémon", PokemonType.ROCK, PokemonType.DRAGON, 0.8, 26, AbilityId.STRONG_JAW, AbilityId.NONE, AbilityId.STURDY, 362, 58, 89, 77, 45, 45, 48, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.TYRANTRUM, 6, false, false, false, "Despot Pokémon", PokemonType.ROCK, PokemonType.DRAGON, 2.5, 270, AbilityId.STRONG_JAW, AbilityId.NONE, AbilityId.ROCK_HEAD, 521, 82, 121, 119, 69, 59, 71, 45, 50, 182, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.AMAURA, 6, false, false, false, "Tundra Pokémon", PokemonType.ROCK, PokemonType.ICE, 1.3, 25.2, AbilityId.REFRIGERATE, AbilityId.NONE, AbilityId.SNOW_WARNING, 362, 77, 59, 50, 67, 63, 46, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.AURORUS, 6, false, false, false, "Tundra Pokémon", PokemonType.ROCK, PokemonType.ICE, 2.7, 225, AbilityId.REFRIGERATE, AbilityId.NONE, AbilityId.SNOW_WARNING, 521, 123, 77, 72, 99, 92, 58, 45, 50, 104, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.SYLVEON, 6, false, false, false, "Intertwining Pokémon", PokemonType.FAIRY, null, 1, 23.5, AbilityId.CUTE_CHARM, AbilityId.NONE, AbilityId.PIXILATE, 525, 95, 65, 65, 110, 130, 60, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.HAWLUCHA, 6, false, false, false, "Wrestling Pokémon", PokemonType.FIGHTING, PokemonType.FLYING, 0.8, 21.5, AbilityId.LIMBER, AbilityId.UNBURDEN, AbilityId.MOLD_BREAKER, 500, 78, 92, 75, 74, 63, 118, 100, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DEDENNE, 6, false, false, false, "Antenna Pokémon", PokemonType.ELECTRIC, PokemonType.FAIRY, 0.2, 2.2, AbilityId.CHEEK_POUCH, AbilityId.PICKUP, AbilityId.PLUS, 431, 67, 58, 57, 81, 67, 101, 180, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CARBINK, 6, false, false, false, "Jewel Pokémon", PokemonType.ROCK, PokemonType.FAIRY, 0.3, 5.7, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.STURDY, 500, 50, 50, 150, 50, 150, 50, 60, 50, 100, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.GOOMY, 6, false, false, false, "Soft Tissue Pokémon", PokemonType.DRAGON, null, 0.3, 2.8, AbilityId.SAP_SIPPER, AbilityId.HYDRATION, AbilityId.GOOEY, 300, 45, 50, 35, 55, 75, 40, 45, 35, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.SLIGGOO, 6, false, false, false, "Soft Tissue Pokémon", PokemonType.DRAGON, null, 0.8, 17.5, AbilityId.SAP_SIPPER, AbilityId.HYDRATION, AbilityId.GOOEY, 452, 68, 75, 53, 83, 113, 60, 45, 35, 158, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.GOODRA, 6, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 2, 150.5, AbilityId.SAP_SIPPER, AbilityId.HYDRATION, AbilityId.GOOEY, 600, 90, 100, 70, 110, 150, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.KLEFKI, 6, false, false, false, "Key Ring Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 0.2, 3, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.MAGICIAN, 470, 57, 80, 91, 80, 87, 75, 75, 50, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.PHANTUMP, 6, false, false, false, "Stump Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.4, 7, AbilityId.NATURAL_CURE, AbilityId.FRISK, AbilityId.HARVEST, 309, 43, 70, 48, 50, 60, 38, 120, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TREVENANT, 6, false, false, false, "Elder Tree Pokémon", PokemonType.GHOST, PokemonType.GRASS, 1.5, 71, AbilityId.NATURAL_CURE, AbilityId.FRISK, AbilityId.HARVEST, 474, 85, 110, 76, 65, 82, 56, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PUMPKABOO, 6, false, false, false, "Pumpkin Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.4, 5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Average Size", "", PokemonType.GHOST, PokemonType.GRASS, 0.4, 5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, false, null, true), + new PokemonForm("Small Size", "small", PokemonType.GHOST, PokemonType.GRASS, 0.3, 3.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 44, 66, 70, 44, 55, 56, 120, 50, 67, false, "", true), + new PokemonForm("Large Size", "large", PokemonType.GHOST, PokemonType.GRASS, 0.5, 7.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 54, 66, 70, 44, 55, 46, 120, 50, 67, false, "", true), + new PokemonForm("Super Size", "super", PokemonType.GHOST, PokemonType.GRASS, 0.8, 15, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 59, 66, 70, 44, 55, 41, 120, 50, 67, false, "", true) + ), + new PokemonSpecies(SpeciesId.GOURGEIST, 6, false, false, false, "Pumpkin Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.9, 12.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Average Size", "", PokemonType.GHOST, PokemonType.GRASS, 0.9, 12.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, false, null, true), + new PokemonForm("Small Size", "small", PokemonType.GHOST, PokemonType.GRASS, 0.7, 9.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 55, 85, 122, 58, 75, 99, 60, 50, 173, false, "", true), + new PokemonForm("Large Size", "large", PokemonType.GHOST, PokemonType.GRASS, 1.1, 14, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 75, 95, 122, 58, 75, 69, 60, 50, 173, false, "", true), + new PokemonForm("Super Size", "super", PokemonType.GHOST, PokemonType.GRASS, 1.7, 39, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 85, 100, 122, 58, 75, 54, 60, 50, 173, false, "", true) + ), + new PokemonSpecies(SpeciesId.BERGMITE, 6, false, false, false, "Ice Chunk Pokémon", PokemonType.ICE, null, 1, 99.5, AbilityId.OWN_TEMPO, AbilityId.ICE_BODY, AbilityId.STURDY, 304, 55, 69, 85, 32, 35, 28, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.AVALUGG, 6, false, false, false, "Iceberg Pokémon", PokemonType.ICE, null, 2, 505, AbilityId.OWN_TEMPO, AbilityId.ICE_BODY, AbilityId.STURDY, 514, 95, 117, 184, 44, 46, 28, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.NOIBAT, 6, false, false, false, "Sound Wave Pokémon", PokemonType.FLYING, PokemonType.DRAGON, 0.5, 8, AbilityId.FRISK, AbilityId.INFILTRATOR, AbilityId.TELEPATHY, 245, 40, 30, 35, 45, 40, 55, 190, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.NOIVERN, 6, false, false, false, "Sound Wave Pokémon", PokemonType.FLYING, PokemonType.DRAGON, 1.5, 85, AbilityId.FRISK, AbilityId.INFILTRATOR, AbilityId.TELEPATHY, 535, 85, 70, 80, 97, 80, 123, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.XERNEAS, 6, false, true, false, "Life Pokémon", PokemonType.FAIRY, null, 3, 215, AbilityId.FAIRY_AURA, AbilityId.NONE, AbilityId.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false, true, + new PokemonForm("Neutral Mode", "neutral", PokemonType.FAIRY, null, 3, 215, AbilityId.FAIRY_AURA, AbilityId.NONE, AbilityId.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, false, null, true), + new PokemonForm("Active Mode", "active", PokemonType.FAIRY, null, 3, 215, AbilityId.FAIRY_AURA, AbilityId.NONE, AbilityId.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340) + ), + new PokemonSpecies(SpeciesId.YVELTAL, 6, false, true, false, "Destruction Pokémon", PokemonType.DARK, PokemonType.FLYING, 5.8, 203, AbilityId.DARK_AURA, AbilityId.NONE, AbilityId.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ZYGARDE, 6, false, true, false, "Order Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, AbilityId.AURA_BREAK, AbilityId.NONE, AbilityId.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("50% Forme", "50", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, AbilityId.AURA_BREAK, AbilityId.NONE, AbilityId.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), + new PokemonForm("10% Forme", "10", PokemonType.DRAGON, PokemonType.GROUND, 1.2, 33.5, AbilityId.AURA_BREAK, AbilityId.NONE, AbilityId.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 243, false, null, true), + new PokemonForm("50% Forme Power Construct", "50-pc", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, AbilityId.POWER_CONSTRUCT, AbilityId.NONE, AbilityId.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), + new PokemonForm("10% Forme Power Construct", "10-pc", PokemonType.DRAGON, PokemonType.GROUND, 1.2, 33.5, AbilityId.POWER_CONSTRUCT, AbilityId.NONE, AbilityId.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 243, false, "10", true), + new PokemonForm("Complete Forme (50% PC)", "complete", PokemonType.DRAGON, PokemonType.GROUND, 4.5, 610, AbilityId.POWER_CONSTRUCT, AbilityId.NONE, AbilityId.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354), + new PokemonForm("Complete Forme (10% PC)", "10-complete", PokemonType.DRAGON, PokemonType.GROUND, 4.5, 610, AbilityId.POWER_CONSTRUCT, AbilityId.NONE, AbilityId.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354, false, "complete") + ), + new PokemonSpecies(SpeciesId.DIANCIE, 6, false, false, true, "Jewel Pokémon", PokemonType.ROCK, PokemonType.FAIRY, 0.7, 8.8, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FAIRY, 0.7, 8.8, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, false, null, true), + new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.FAIRY, 1.1, 27.8, AbilityId.MAGIC_BOUNCE, AbilityId.NONE, AbilityId.NONE, 700, 50, 160, 110, 160, 110, 110, 3, 50, 300) + ), + new PokemonSpecies(SpeciesId.HOOPA, 6, false, false, true, "Mischief Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 0.5, 9, AbilityId.MAGICIAN, AbilityId.NONE, AbilityId.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Hoopa Confined", "", PokemonType.PSYCHIC, PokemonType.GHOST, 0.5, 9, AbilityId.MAGICIAN, AbilityId.NONE, AbilityId.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, false, null, true), + new PokemonForm("Hoopa Unbound", "unbound", PokemonType.PSYCHIC, PokemonType.DARK, 6.5, 490, AbilityId.MAGICIAN, AbilityId.NONE, AbilityId.NONE, 680, 80, 160, 60, 170, 130, 80, 3, 100, 340) + ), + new PokemonSpecies(SpeciesId.VOLCANION, 6, false, false, true, "Steam Pokémon", PokemonType.FIRE, PokemonType.WATER, 1.7, 195, AbilityId.WATER_ABSORB, AbilityId.NONE, AbilityId.NONE, 600, 80, 110, 120, 130, 90, 70, 3, 100, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ROWLET, 7, false, false, false, "Grass Quill Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.3, 1.5, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LONG_REACH, 320, 68, 55, 55, 50, 50, 42, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.DARTRIX, 7, false, false, false, "Blade Quill Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.7, 16, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LONG_REACH, 420, 78, 75, 75, 70, 70, 52, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.DECIDUEYE, 7, false, false, false, "Arrow Quill Pokémon", PokemonType.GRASS, PokemonType.GHOST, 1.6, 36.6, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LONG_REACH, 530, 78, 107, 75, 100, 100, 70, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.LITTEN, 7, false, false, false, "Fire Cat Pokémon", PokemonType.FIRE, null, 0.4, 4.3, AbilityId.BLAZE, AbilityId.NONE, AbilityId.INTIMIDATE, 320, 45, 65, 40, 60, 40, 70, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.TORRACAT, 7, false, false, false, "Fire Cat Pokémon", PokemonType.FIRE, null, 0.7, 25, AbilityId.BLAZE, AbilityId.NONE, AbilityId.INTIMIDATE, 420, 65, 85, 50, 80, 50, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.INCINEROAR, 7, false, false, false, "Heel Pokémon", PokemonType.FIRE, PokemonType.DARK, 1.8, 83, AbilityId.BLAZE, AbilityId.NONE, AbilityId.INTIMIDATE, 530, 95, 115, 90, 80, 90, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.POPPLIO, 7, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, null, 0.4, 7.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.LIQUID_VOICE, 320, 50, 54, 54, 66, 56, 40, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.BRIONNE, 7, false, false, false, "Pop Star Pokémon", PokemonType.WATER, null, 0.6, 17.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.LIQUID_VOICE, 420, 60, 69, 69, 91, 81, 50, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.PRIMARINA, 7, false, false, false, "Soloist Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.8, 44, AbilityId.TORRENT, AbilityId.NONE, AbilityId.LIQUID_VOICE, 530, 80, 74, 74, 126, 116, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.PIKIPEK, 7, false, false, false, "Woodpecker Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.2, AbilityId.KEEN_EYE, AbilityId.SKILL_LINK, AbilityId.PICKUP, 265, 35, 75, 30, 30, 30, 65, 255, 70, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TRUMBEAK, 7, false, false, false, "Bugle Beak Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 14.8, AbilityId.KEEN_EYE, AbilityId.SKILL_LINK, AbilityId.PICKUP, 355, 55, 85, 50, 40, 50, 75, 120, 70, 124, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TOUCANNON, 7, false, false, false, "Cannon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.1, 26, AbilityId.KEEN_EYE, AbilityId.SKILL_LINK, AbilityId.SHEER_FORCE, 485, 80, 120, 75, 75, 75, 60, 45, 70, 243, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.YUNGOOS, 7, false, false, false, "Loitering Pokémon", PokemonType.NORMAL, null, 0.4, 6, AbilityId.STAKEOUT, AbilityId.STRONG_JAW, AbilityId.ADAPTABILITY, 253, 48, 70, 30, 30, 30, 45, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GUMSHOOS, 7, false, false, false, "Stakeout Pokémon", PokemonType.NORMAL, null, 0.7, 14.2, AbilityId.STAKEOUT, AbilityId.STRONG_JAW, AbilityId.ADAPTABILITY, 418, 88, 110, 60, 55, 60, 45, 127, 70, 146, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GRUBBIN, 7, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 4.4, AbilityId.SWARM, AbilityId.NONE, AbilityId.NONE, 300, 47, 62, 45, 55, 45, 46, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CHARJABUG, 7, false, false, false, "Battery Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.5, 10.5, AbilityId.BATTERY, AbilityId.NONE, AbilityId.NONE, 400, 57, 82, 95, 55, 75, 36, 120, 50, 140, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.VIKAVOLT, 7, false, false, false, "Stag Beetle Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 1.5, 45, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 500, 77, 70, 90, 145, 75, 43, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CRABRAWLER, 7, false, false, false, "Boxing Pokémon", PokemonType.FIGHTING, null, 0.6, 7, AbilityId.HYPER_CUTTER, AbilityId.IRON_FIST, AbilityId.ANGER_POINT, 338, 47, 82, 57, 42, 47, 63, 225, 70, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CRABOMINABLE, 7, false, false, false, "Woolly Crab Pokémon", PokemonType.FIGHTING, PokemonType.ICE, 1.7, 180, AbilityId.HYPER_CUTTER, AbilityId.IRON_FIST, AbilityId.ANGER_POINT, 478, 97, 132, 77, 62, 67, 43, 60, 70, 167, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ORICORIO, 7, false, false, false, "Dancing Pokémon", PokemonType.FIRE, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, GrowthRate.MEDIUM_FAST, 25, false, false, + new PokemonForm("Baile Style", "baile", PokemonType.FIRE, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, "", true), + new PokemonForm("Pom-Pom Style", "pompom", PokemonType.ELECTRIC, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), + new PokemonForm("Pau Style", "pau", PokemonType.PSYCHIC, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), + new PokemonForm("Sensu Style", "sensu", PokemonType.GHOST, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true) + ), + new PokemonSpecies(SpeciesId.CUTIEFLY, 7, false, false, false, "Bee Fly Pokémon", PokemonType.BUG, PokemonType.FAIRY, 0.1, 0.2, AbilityId.HONEY_GATHER, AbilityId.SHIELD_DUST, AbilityId.SWEET_VEIL, 304, 40, 45, 40, 55, 40, 84, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.RIBOMBEE, 7, false, false, false, "Bee Fly Pokémon", PokemonType.BUG, PokemonType.FAIRY, 0.2, 0.5, AbilityId.HONEY_GATHER, AbilityId.SHIELD_DUST, AbilityId.SWEET_VEIL, 464, 60, 55, 60, 95, 70, 124, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ROCKRUFF, 7, false, false, false, "Puppy Pokémon", PokemonType.ROCK, null, 0.5, 9.2, AbilityId.KEEN_EYE, AbilityId.VITAL_SPIRIT, AbilityId.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.ROCK, null, 0.5, 9.2, AbilityId.KEEN_EYE, AbilityId.VITAL_SPIRIT, AbilityId.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, null, true), + new PokemonForm("Own Tempo", "own-tempo", PokemonType.ROCK, null, 0.5, 9.2, AbilityId.OWN_TEMPO, AbilityId.NONE, AbilityId.OWN_TEMPO, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, "", true) + ), + new PokemonSpecies(SpeciesId.LYCANROC, 7, false, false, false, "Wolf Pokémon", PokemonType.ROCK, null, 0.8, 25, AbilityId.KEEN_EYE, AbilityId.SAND_RUSH, AbilityId.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Midday Form", "midday", PokemonType.ROCK, null, 0.8, 25, AbilityId.KEEN_EYE, AbilityId.SAND_RUSH, AbilityId.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, false, "", true), + new PokemonForm("Midnight Form", "midnight", PokemonType.ROCK, null, 1.1, 25, AbilityId.KEEN_EYE, AbilityId.VITAL_SPIRIT, AbilityId.NO_GUARD, 487, 85, 115, 75, 55, 75, 82, 90, 50, 170, false, null, true), + new PokemonForm("Dusk Form", "dusk", PokemonType.ROCK, null, 0.8, 25, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, 487, 75, 117, 65, 55, 65, 110, 90, 50, 170, false, null, true) + ), + new PokemonSpecies(SpeciesId.WISHIWASHI, 7, false, false, false, "Small Fry Pokémon", PokemonType.WATER, null, 0.2, 0.3, AbilityId.SCHOOLING, AbilityId.NONE, AbilityId.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, GrowthRate.FAST, 50, false, false, + new PokemonForm("Solo Form", "", PokemonType.WATER, null, 0.2, 0.3, AbilityId.SCHOOLING, AbilityId.NONE, AbilityId.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, false, null, true), + new PokemonForm("School", "school", PokemonType.WATER, null, 8.2, 78.6, AbilityId.SCHOOLING, AbilityId.NONE, AbilityId.NONE, 620, 45, 140, 130, 140, 135, 30, 60, 50, 217) + ), + new PokemonSpecies(SpeciesId.MAREANIE, 7, false, false, false, "Brutal Star Pokémon", PokemonType.POISON, PokemonType.WATER, 0.4, 8, AbilityId.MERCILESS, AbilityId.LIMBER, AbilityId.REGENERATOR, 305, 50, 53, 62, 43, 52, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TOXAPEX, 7, false, false, false, "Brutal Star Pokémon", PokemonType.POISON, PokemonType.WATER, 0.7, 14.5, AbilityId.MERCILESS, AbilityId.LIMBER, AbilityId.REGENERATOR, 495, 50, 63, 152, 53, 142, 35, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MUDBRAY, 7, false, false, false, "Donkey Pokémon", PokemonType.GROUND, null, 1, 110, AbilityId.OWN_TEMPO, AbilityId.STAMINA, AbilityId.INNER_FOCUS, 385, 70, 100, 70, 45, 55, 45, 190, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MUDSDALE, 7, false, false, false, "Draft Horse Pokémon", PokemonType.GROUND, null, 2.5, 920, AbilityId.OWN_TEMPO, AbilityId.STAMINA, AbilityId.INNER_FOCUS, 500, 100, 125, 100, 55, 85, 35, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DEWPIDER, 7, false, false, false, "Water Bubble Pokémon", PokemonType.WATER, PokemonType.BUG, 0.3, 4, AbilityId.WATER_BUBBLE, AbilityId.NONE, AbilityId.WATER_ABSORB, 269, 38, 40, 52, 40, 72, 27, 200, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ARAQUANID, 7, false, false, false, "Water Bubble Pokémon", PokemonType.WATER, PokemonType.BUG, 1.8, 82, AbilityId.WATER_BUBBLE, AbilityId.NONE, AbilityId.WATER_ABSORB, 454, 68, 70, 92, 50, 132, 42, 100, 50, 159, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FOMANTIS, 7, false, false, false, "Sickle Grass Pokémon", PokemonType.GRASS, null, 0.3, 1.5, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.CONTRARY, 250, 40, 55, 35, 50, 35, 35, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LURANTIS, 7, false, false, false, "Bloom Sickle Pokémon", PokemonType.GRASS, null, 0.9, 18.5, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.CONTRARY, 480, 70, 105, 90, 80, 90, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MORELULL, 7, false, false, false, "Illuminating Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.2, 1.5, AbilityId.ILLUMINATE, AbilityId.EFFECT_SPORE, AbilityId.RAIN_DISH, 285, 40, 35, 55, 65, 75, 15, 190, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SHIINOTIC, 7, false, false, false, "Illuminating Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 1, 11.5, AbilityId.ILLUMINATE, AbilityId.EFFECT_SPORE, AbilityId.RAIN_DISH, 405, 60, 45, 80, 90, 100, 30, 75, 50, 142, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SALANDIT, 7, false, false, false, "Toxic Lizard Pokémon", PokemonType.POISON, PokemonType.FIRE, 0.6, 4.8, AbilityId.CORROSION, AbilityId.NONE, AbilityId.OBLIVIOUS, 320, 48, 44, 40, 71, 40, 77, 120, 50, 64, GrowthRate.MEDIUM_FAST, 87.5, false), + new PokemonSpecies(SpeciesId.SALAZZLE, 7, false, false, false, "Toxic Lizard Pokémon", PokemonType.POISON, PokemonType.FIRE, 1.2, 22.2, AbilityId.CORROSION, AbilityId.NONE, AbilityId.OBLIVIOUS, 480, 68, 64, 60, 111, 60, 117, 45, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(SpeciesId.STUFFUL, 7, false, false, false, "Flailing Pokémon", PokemonType.NORMAL, PokemonType.FIGHTING, 0.5, 6.8, AbilityId.FLUFFY, AbilityId.KLUTZ, AbilityId.CUTE_CHARM, 340, 70, 75, 50, 45, 50, 50, 140, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BEWEAR, 7, false, false, false, "Strong Arm Pokémon", PokemonType.NORMAL, PokemonType.FIGHTING, 2.1, 135, AbilityId.FLUFFY, AbilityId.KLUTZ, AbilityId.UNNERVE, 500, 120, 125, 80, 55, 60, 60, 70, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BOUNSWEET, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 0.3, 3.2, AbilityId.LEAF_GUARD, AbilityId.OBLIVIOUS, AbilityId.SWEET_VEIL, 210, 42, 30, 38, 30, 38, 32, 235, 50, 42, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.STEENEE, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 0.7, 8.2, AbilityId.LEAF_GUARD, AbilityId.OBLIVIOUS, AbilityId.SWEET_VEIL, 290, 52, 40, 48, 40, 48, 62, 120, 50, 102, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.TSAREENA, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 1.2, 21.4, AbilityId.LEAF_GUARD, AbilityId.QUEENLY_MAJESTY, AbilityId.SWEET_VEIL, 510, 72, 120, 98, 50, 98, 72, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.COMFEY, 7, false, false, false, "Posy Picker Pokémon", PokemonType.FAIRY, null, 0.1, 0.3, AbilityId.FLOWER_VEIL, AbilityId.TRIAGE, AbilityId.NATURAL_CURE, 485, 51, 52, 90, 82, 110, 100, 60, 50, 170, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.ORANGURU, 7, false, false, false, "Sage Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.5, 76, AbilityId.INNER_FOCUS, AbilityId.TELEPATHY, AbilityId.SYMBIOSIS, 490, 90, 60, 80, 90, 110, 60, 45, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.PASSIMIAN, 7, false, false, false, "Teamwork Pokémon", PokemonType.FIGHTING, null, 2, 82.8, AbilityId.RECEIVER, AbilityId.NONE, AbilityId.DEFIANT, 490, 100, 120, 90, 40, 60, 80, 45, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.WIMPOD, 7, false, false, false, "Turn Tail Pokémon", PokemonType.BUG, PokemonType.WATER, 0.5, 12, AbilityId.WIMP_OUT, AbilityId.NONE, AbilityId.RUN_AWAY, 230, 25, 35, 40, 20, 30, 80, 90, 50, 46, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden + new PokemonSpecies(SpeciesId.GOLISOPOD, 7, false, false, false, "Hard Scale Pokémon", PokemonType.BUG, PokemonType.WATER, 2, 108, AbilityId.EMERGENCY_EXIT, AbilityId.NONE, AbilityId.ANTICIPATION, 530, 75, 125, 140, 60, 90, 40, 45, 50, 186, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden + new PokemonSpecies(SpeciesId.SANDYGAST, 7, false, false, false, "Sand Heap Pokémon", PokemonType.GHOST, PokemonType.GROUND, 0.5, 70, AbilityId.WATER_COMPACTION, AbilityId.NONE, AbilityId.SAND_VEIL, 320, 55, 55, 80, 70, 45, 15, 140, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PALOSSAND, 7, false, false, false, "Sand Castle Pokémon", PokemonType.GHOST, PokemonType.GROUND, 1.3, 250, AbilityId.WATER_COMPACTION, AbilityId.NONE, AbilityId.SAND_VEIL, 480, 85, 75, 110, 100, 75, 35, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PYUKUMUKU, 7, false, false, false, "Sea Cucumber Pokémon", PokemonType.WATER, null, 0.3, 1.2, AbilityId.INNARDS_OUT, AbilityId.NONE, AbilityId.UNAWARE, 410, 55, 60, 130, 30, 130, 5, 60, 50, 144, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.TYPE_NULL, 7, true, false, false, "Synthetic Pokémon", PokemonType.NORMAL, null, 1.9, 120.5, AbilityId.BATTLE_ARMOR, AbilityId.NONE, AbilityId.NONE, 534, 95, 95, 95, 95, 95, 59, 3, 0, 107, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SILVALLY, 7, true, false, false, "Synthetic Pokémon", PokemonType.NORMAL, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, GrowthRate.SLOW, null, false, false, + new PokemonForm("Type: Normal", "normal", PokemonType.NORMAL, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, false, "", true), + new PokemonForm("Type: Fighting", "fighting", PokemonType.FIGHTING, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Flying", "flying", PokemonType.FLYING, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Poison", "poison", PokemonType.POISON, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ground", "ground", PokemonType.GROUND, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Rock", "rock", PokemonType.ROCK, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Bug", "bug", PokemonType.BUG, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ghost", "ghost", PokemonType.GHOST, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Steel", "steel", PokemonType.STEEL, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Fire", "fire", PokemonType.FIRE, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Water", "water", PokemonType.WATER, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Grass", "grass", PokemonType.GRASS, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Electric", "electric", PokemonType.ELECTRIC, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Psychic", "psychic", PokemonType.PSYCHIC, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Ice", "ice", PokemonType.ICE, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Dragon", "dragon", PokemonType.DRAGON, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Dark", "dark", PokemonType.DARK, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), + new PokemonForm("Type: Fairy", "fairy", PokemonType.FAIRY, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285) + ), + new PokemonSpecies(SpeciesId.MINIOR, 7, false, false, false, "Meteor Pokémon", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, GrowthRate.MEDIUM_SLOW, null, false, false, + new PokemonForm("Red Meteor Form", "red-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), + new PokemonForm("Orange Meteor Form", "orange-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), + new PokemonForm("Yellow Meteor Form", "yellow-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), + new PokemonForm("Green Meteor Form", "green-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), + new PokemonForm("Blue Meteor Form", "blue-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), + new PokemonForm("Indigo Meteor Form", "indigo-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), + new PokemonForm("Violet Meteor Form", "violet-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), + new PokemonForm("Red Core Form", "red", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Orange Core Form", "orange", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Yellow Core Form", "yellow", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Green Core Form", "green", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Blue Core Form", "blue", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Indigo Core Form", "indigo", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), + new PokemonForm("Violet Core Form", "violet", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true) + ), + new PokemonSpecies(SpeciesId.KOMALA, 7, false, false, false, "Drowsing Pokémon", PokemonType.NORMAL, null, 0.4, 19.9, AbilityId.COMATOSE, AbilityId.NONE, AbilityId.NONE, 480, 65, 115, 65, 75, 95, 65, 45, 70, 168, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", PokemonType.FIRE, PokemonType.DRAGON, 2, 212, AbilityId.SHELL_ARMOR, AbilityId.NONE, AbilityId.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 0.3, 3.3, AbilityId.IRON_BARBS, AbilityId.LIGHTNING_ROD, AbilityId.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MIMIKYU, 7, false, false, false, "Disguise Pokémon", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, AbilityId.DISGUISE, AbilityId.NONE, AbilityId.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Disguised Form", "disguised", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, AbilityId.DISGUISE, AbilityId.NONE, AbilityId.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, null, true), + new PokemonForm("Busted Form", "busted", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, AbilityId.DISGUISE, AbilityId.NONE, AbilityId.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167) + ), + new PokemonSpecies(SpeciesId.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 0.9, 19, AbilityId.DAZZLING, AbilityId.STRONG_JAW, AbilityId.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DRAMPA, 7, false, false, false, "Placid Pokémon", PokemonType.NORMAL, PokemonType.DRAGON, 3, 185, AbilityId.BERSERK, AbilityId.SAP_SIPPER, AbilityId.CLOUD_NINE, 485, 78, 60, 85, 135, 91, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DHELMISE, 7, false, false, false, "Sea Creeper Pokémon", PokemonType.GHOST, PokemonType.GRASS, 3.9, 210, AbilityId.STEELWORKER, AbilityId.NONE, AbilityId.NONE, 517, 70, 131, 100, 86, 90, 40, 25, 50, 181, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.JANGMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, null, 0.6, 29.7, AbilityId.BULLETPROOF, AbilityId.SOUNDPROOF, AbilityId.OVERCOAT, 300, 45, 55, 65, 45, 45, 45, 45, 50, 60, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.HAKAMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, PokemonType.FIGHTING, 1.2, 47, AbilityId.BULLETPROOF, AbilityId.SOUNDPROOF, AbilityId.OVERCOAT, 420, 55, 75, 90, 65, 70, 65, 45, 50, 147, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.KOMMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, PokemonType.FIGHTING, 1.6, 78.2, AbilityId.BULLETPROOF, AbilityId.SOUNDPROOF, AbilityId.OVERCOAT, 600, 75, 110, 125, 100, 105, 85, 45, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.TAPU_KOKO, 7, true, false, false, "Land Spirit Pokémon", PokemonType.ELECTRIC, PokemonType.FAIRY, 1.8, 20.5, AbilityId.ELECTRIC_SURGE, AbilityId.NONE, AbilityId.TELEPATHY, 570, 70, 115, 85, 95, 75, 130, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.TAPU_LELE, 7, true, false, false, "Land Spirit Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.2, 18.6, AbilityId.PSYCHIC_SURGE, AbilityId.NONE, AbilityId.TELEPATHY, 570, 70, 85, 75, 130, 115, 95, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.TAPU_BULU, 7, true, false, false, "Land Spirit Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 1.9, 45.5, AbilityId.GRASSY_SURGE, AbilityId.NONE, AbilityId.TELEPATHY, 570, 70, 130, 115, 85, 95, 75, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.TAPU_FINI, 7, true, false, false, "Land Spirit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.3, 21.2, AbilityId.MISTY_SURGE, AbilityId.NONE, AbilityId.TELEPATHY, 570, 70, 75, 115, 95, 130, 85, 3, 50, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.COSMOG, 7, true, false, false, "Nebula Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.1, AbilityId.UNAWARE, AbilityId.NONE, AbilityId.NONE, 200, 43, 29, 31, 29, 31, 37, 3, 0, 40, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.COSMOEM, 7, true, false, false, "Protostar Pokémon", PokemonType.PSYCHIC, null, 0.1, 999.9, AbilityId.STURDY, AbilityId.NONE, AbilityId.NONE, 400, 43, 29, 131, 29, 131, 37, 3, 0, 140, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SOLGALEO, 7, false, true, false, "Sunne Pokémon", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, AbilityId.FULL_METAL_BODY, AbilityId.NONE, AbilityId.NONE, 680, 137, 137, 107, 113, 89, 97, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.LUNALA, 7, false, true, false, "Moone Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, AbilityId.SHADOW_SHIELD, AbilityId.NONE, AbilityId.NONE, 680, 137, 113, 89, 137, 107, 97, 3, 0, 340, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.NIHILEGO, 7, true, false, false, "Parasite Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.2, 55.5, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 109, 53, 47, 127, 131, 103, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.BUZZWOLE, 7, true, false, false, "Swollen Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 2.4, 333.6, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 107, 139, 139, 53, 53, 79, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.PHEROMOSA, 7, true, false, false, "Lissome Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.8, 25, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 71, 137, 37, 137, 37, 151, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.XURKITREE, 7, true, false, false, "Glowing Pokémon", PokemonType.ELECTRIC, null, 3.8, 100, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 83, 89, 71, 173, 71, 83, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.CELESTEELA, 7, true, false, false, "Launch Pokémon", PokemonType.STEEL, PokemonType.FLYING, 9.2, 999.9, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 97, 101, 103, 107, 101, 61, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.KARTANA, 7, true, false, false, "Drawn Sword Pokémon", PokemonType.GRASS, PokemonType.STEEL, 0.3, 0.1, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 59, 181, 131, 59, 31, 109, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.GUZZLORD, 7, true, false, false, "Junkivore Pokémon", PokemonType.DARK, PokemonType.DRAGON, 5.5, 888, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 223, 101, 53, 97, 53, 43, 45, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.NECROZMA, 7, false, true, false, "Prism Pokémon", PokemonType.PSYCHIC, null, 2.4, 230, AbilityId.PRISM_ARMOR, AbilityId.NONE, AbilityId.NONE, 600, 97, 107, 101, 127, 89, 79, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 2.4, 230, AbilityId.PRISM_ARMOR, AbilityId.NONE, AbilityId.NONE, 600, 97, 107, 101, 127, 89, 79, 3, 0, 300, false, null, true), + new PokemonForm("Dusk Mane", "dusk-mane", PokemonType.PSYCHIC, PokemonType.STEEL, 3.8, 460, AbilityId.PRISM_ARMOR, AbilityId.NONE, AbilityId.NONE, 680, 97, 157, 127, 113, 109, 77, 3, 0, 340), + new PokemonForm("Dawn Wings", "dawn-wings", PokemonType.PSYCHIC, PokemonType.GHOST, 4.2, 350, AbilityId.PRISM_ARMOR, AbilityId.NONE, AbilityId.NONE, 680, 97, 113, 109, 157, 127, 77, 3, 0, 340), + new PokemonForm("Ultra", "ultra", PokemonType.PSYCHIC, PokemonType.DRAGON, 7.5, 230, AbilityId.NEUROFORCE, AbilityId.NONE, AbilityId.NONE, 754, 97, 167, 97, 167, 97, 129, 3, 0, 377) + ), + new PokemonSpecies(SpeciesId.MAGEARNA, 7, false, false, true, "Artificial Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, AbilityId.SOUL_HEART, AbilityId.NONE, AbilityId.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, AbilityId.SOUL_HEART, AbilityId.NONE, AbilityId.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), + new PokemonForm("Original", "original", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, AbilityId.SOUL_HEART, AbilityId.NONE, AbilityId.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true) + ), + new PokemonSpecies(SpeciesId.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, AbilityId.TECHNICIAN, AbilityId.NONE, AbilityId.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, AbilityId.TECHNICIAN, AbilityId.NONE, AbilityId.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true), + new PokemonForm("Zenith", "zenith", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, AbilityId.TECHNICIAN, AbilityId.NONE, AbilityId.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) + ), + new PokemonSpecies(SpeciesId.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.6, 1.8, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, PokemonType.DRAGON, 3.6, 150, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.STAKATAKA, 7, true, false, false, "Rampart Pokémon", PokemonType.ROCK, PokemonType.STEEL, 5.5, 820, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 61, 131, 211, 53, 101, 13, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.BLACEPHALON, 7, true, false, false, "Fireworks Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.8, 13, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 53, 127, 53, 151, 79, 107, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ZERAORA, 7, false, false, true, "Thunderclap Pokémon", PokemonType.ELECTRIC, null, 1.5, 44.5, AbilityId.VOLT_ABSORB, AbilityId.NONE, AbilityId.NONE, 600, 88, 112, 75, 102, 80, 143, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.MELTAN, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 0.2, 8, AbilityId.MAGNET_PULL, AbilityId.NONE, AbilityId.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 2.5, 800, AbilityId.IRON_FIST, AbilityId.NONE, AbilityId.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, null, 2.5, 800, AbilityId.IRON_FIST, AbilityId.NONE, AbilityId.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, null, 25, 999.9, AbilityId.IRON_FIST, AbilityId.NONE, AbilityId.NONE, 700, 170, 158, 158, 95, 75, 44, 3, 0, 300) + ), + new PokemonSpecies(SpeciesId.GROOKEY, 8, false, false, false, "Chimp Pokémon", PokemonType.GRASS, null, 0.3, 5, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.THWACKEY, 8, false, false, false, "Beat Pokémon", PokemonType.GRASS, null, 0.7, 14, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.RILLABOOM, 8, false, false, false, "Drummer Pokémon", PokemonType.GRASS, null, 2.1, 90, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, null, 2.1, 90, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, null, 28, 999.9, AbilityId.GRASSY_SURGE, AbilityId.NONE, AbilityId.GRASSY_SURGE, 630, 125, 140, 105, 90, 85, 85, 45, 50, 265) + ), + new PokemonSpecies(SpeciesId.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.3, 4.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.RABOOT, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.6, 9, AbilityId.BLAZE, AbilityId.NONE, AbilityId.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.CINDERACE, 8, false, false, false, "Striker Pokémon", PokemonType.FIRE, null, 1.4, 33, AbilityId.BLAZE, AbilityId.NONE, AbilityId.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.FIRE, null, 1.4, 33, AbilityId.BLAZE, AbilityId.NONE, AbilityId.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, null, 27, 999.9, AbilityId.LIBERO, AbilityId.NONE, AbilityId.LIBERO, 630, 100, 141, 80, 95, 80, 134, 45, 50, 265) + ), + new PokemonSpecies(SpeciesId.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.3, 4, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.7, 11.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.INTELEON, 8, false, false, false, "Secret Agent Pokémon", PokemonType.WATER, null, 1.9, 45.2, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, null, 1.9, 45.2, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 40, 999.9, AbilityId.SNIPER, AbilityId.NONE, AbilityId.SNIPER, 630, 95, 117, 67, 147, 67, 137, 45, 50, 265) + ), + new PokemonSpecies(SpeciesId.SKWOVET, 8, false, false, false, "Cheeky Pokémon", PokemonType.NORMAL, null, 0.3, 2.5, AbilityId.CHEEK_POUCH, AbilityId.NONE, AbilityId.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GREEDENT, 8, false, false, false, "Greedy Pokémon", PokemonType.NORMAL, null, 0.6, 6, AbilityId.CHEEK_POUCH, AbilityId.NONE, AbilityId.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ROOKIDEE, 8, false, false, false, "Tiny Bird Pokémon", PokemonType.FLYING, null, 0.2, 1.8, AbilityId.KEEN_EYE, AbilityId.UNNERVE, AbilityId.BIG_PECKS, 245, 38, 47, 35, 33, 35, 57, 255, 50, 49, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, null, 0.8, 16, AbilityId.KEEN_EYE, AbilityId.UNNERVE, AbilityId.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, AbilityId.PRESSURE, AbilityId.UNNERVE, AbilityId.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, AbilityId.PRESSURE, AbilityId.UNNERVE, AbilityId.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FLYING, PokemonType.STEEL, 14, 999.9, AbilityId.MIRROR_ARMOR, AbilityId.MIRROR_ARMOR, AbilityId.MIRROR_ARMOR, 595, 118, 112, 135, 63, 90, 77, 45, 50, 248) + ), + new PokemonSpecies(SpeciesId.BLIPBUG, 8, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 8, AbilityId.SWARM, AbilityId.COMPOUND_EYES, AbilityId.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DOTTLER, 8, false, false, false, "Radome Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 19.5, AbilityId.SWARM, AbilityId.COMPOUND_EYES, AbilityId.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, AbilityId.SWARM, AbilityId.FRISK, AbilityId.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, AbilityId.SWARM, AbilityId.FRISK, AbilityId.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.PSYCHIC, 14, 999.9, AbilityId.TRACE, AbilityId.TRACE, AbilityId.TRACE, 605, 75, 50, 140, 100, 150, 90, 45, 50, 253) + ), + new PokemonSpecies(SpeciesId.NICKIT, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 0.6, 8.9, AbilityId.RUN_AWAY, AbilityId.UNBURDEN, AbilityId.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.THIEVUL, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 1.2, 19.9, AbilityId.RUN_AWAY, AbilityId.UNBURDEN, AbilityId.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.GOSSIFLEUR, 8, false, false, false, "Flowering Pokémon", PokemonType.GRASS, null, 0.4, 2.2, AbilityId.COTTON_DOWN, AbilityId.REGENERATOR, AbilityId.EFFECT_SPORE, 250, 40, 40, 60, 40, 60, 10, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ELDEGOSS, 8, false, false, false, "Cotton Bloom Pokémon", PokemonType.GRASS, null, 0.5, 2.5, AbilityId.COTTON_DOWN, AbilityId.REGENERATOR, AbilityId.EFFECT_SPORE, 460, 60, 50, 90, 80, 120, 60, 75, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WOOLOO, 8, false, false, false, "Sheep Pokémon", PokemonType.NORMAL, null, 0.6, 6, AbilityId.FLUFFY, AbilityId.RUN_AWAY, AbilityId.BULLETPROOF, 270, 42, 40, 55, 40, 45, 48, 255, 50, 122, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DUBWOOL, 8, false, false, false, "Sheep Pokémon", PokemonType.NORMAL, null, 1.3, 43, AbilityId.FLUFFY, AbilityId.STEADFAST, AbilityId.BULLETPROOF, 490, 72, 80, 100, 60, 90, 88, 127, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CHEWTLE, 8, false, false, false, "Snapping Pokémon", PokemonType.WATER, null, 0.3, 8.5, AbilityId.STRONG_JAW, AbilityId.SHELL_ARMOR, AbilityId.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DREDNAW, 8, false, false, false, "Bite Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, AbilityId.STRONG_JAW, AbilityId.SHELL_ARMOR, AbilityId.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, AbilityId.STRONG_JAW, AbilityId.SHELL_ARMOR, AbilityId.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ROCK, 24, 999.9, AbilityId.STRONG_JAW, AbilityId.STRONG_JAW, AbilityId.STRONG_JAW, 585, 115, 137, 115, 61, 83, 74, 75, 50, 170) + ), + new PokemonSpecies(SpeciesId.YAMPER, 8, false, false, false, "Puppy Pokémon", PokemonType.ELECTRIC, null, 0.3, 13.5, AbilityId.BALL_FETCH, AbilityId.NONE, AbilityId.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.BOLTUND, 8, false, false, false, "Dog Pokémon", PokemonType.ELECTRIC, null, 1, 34, AbilityId.STRONG_JAW, AbilityId.NONE, AbilityId.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.ROLYCOLY, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, null, 0.3, 12, AbilityId.STEAM_ENGINE, AbilityId.HEATPROOF, AbilityId.FLASH_FIRE, 240, 30, 40, 50, 40, 50, 30, 255, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CARKOL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 1.1, 78, AbilityId.STEAM_ENGINE, AbilityId.FLAME_BODY, AbilityId.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.COALOSSAL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, AbilityId.STEAM_ENGINE, AbilityId.FLAME_BODY, AbilityId.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, AbilityId.STEAM_ENGINE, AbilityId.FLAME_BODY, AbilityId.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ROCK, PokemonType.FIRE, 42, 999.9, AbilityId.STEAM_ENGINE, AbilityId.STEAM_ENGINE, AbilityId.STEAM_ENGINE, 610, 140, 100, 132, 95, 100, 43, 45, 50, 255) + ), + new PokemonSpecies(SpeciesId.APPLIN, 8, false, false, false, "Apple Core Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.2, 0.5, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.DRAGON, 24, 999.9, AbilityId.HUSTLE, AbilityId.HUSTLE, AbilityId.HUSTLE, 585, 100, 125, 90, 105, 70, 95, 45, 50, 170) + ), + new PokemonSpecies(SpeciesId.APPLETUN, 8, false, false, false, "Apple Nectar Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 13, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 13, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.DRAGON, 24, 999.9, AbilityId.THICK_FAT, AbilityId.THICK_FAT, AbilityId.THICK_FAT, 585, 150, 100, 95, 115, 95, 30, 45, 50, 170) + ), + new PokemonSpecies(SpeciesId.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 2.2, 7.6, AbilityId.SAND_SPIT, AbilityId.SHED_SKIN, AbilityId.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 3.8, 65.5, AbilityId.SAND_SPIT, AbilityId.SHED_SKIN, AbilityId.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.GROUND, null, 3.8, 65.5, AbilityId.SAND_SPIT, AbilityId.SHED_SKIN, AbilityId.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GROUND, null, 22, 999.9, AbilityId.SAND_SPIT, AbilityId.SAND_SPIT, AbilityId.SAND_SPIT, 610, 102, 137, 140, 70, 80, 81, 120, 50, 179) + ), + new PokemonSpecies(SpeciesId.CRAMORANT, 8, false, false, false, "Gulp Pokémon", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, AbilityId.GULP_MISSILE, AbilityId.NONE, AbilityId.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, AbilityId.GULP_MISSILE, AbilityId.NONE, AbilityId.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, false, null, true), + new PokemonForm("Gulping Form", "gulping", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, AbilityId.GULP_MISSILE, AbilityId.NONE, AbilityId.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), + new PokemonForm("Gorging Form", "gorging", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, AbilityId.GULP_MISSILE, AbilityId.NONE, AbilityId.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166) + ), + new PokemonSpecies(SpeciesId.ARROKUDA, 8, false, false, false, "Rush Pokémon", PokemonType.WATER, null, 0.5, 1, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.PROPELLER_TAIL, 280, 41, 63, 40, 40, 30, 66, 255, 50, 56, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.BARRASKEWDA, 8, false, false, false, "Skewer Pokémon", PokemonType.WATER, null, 1.3, 30, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.PROPELLER_TAIL, 490, 61, 123, 60, 60, 50, 136, 60, 50, 172, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.TOXEL, 8, false, false, false, "Baby Pokémon", PokemonType.ELECTRIC, PokemonType.POISON, 0.4, 11, AbilityId.RATTLED, AbilityId.STATIC, AbilityId.KLUTZ, 242, 40, 38, 35, 54, 35, 40, 75, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.TOXTRICITY, 8, false, false, false, "Punk Pokémon", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, AbilityId.PUNK_ROCK, AbilityId.PLUS, AbilityId.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Amped Form", "amped", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, AbilityId.PUNK_ROCK, AbilityId.PLUS, AbilityId.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "", true), + new PokemonForm("Low-Key Form", "lowkey", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, AbilityId.PUNK_ROCK, AbilityId.MINUS, AbilityId.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "lowkey", true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ELECTRIC, PokemonType.POISON, 24, 999.9, AbilityId.PUNK_ROCK, AbilityId.PUNK_ROCK, AbilityId.PUNK_ROCK, 602, 114, 105, 82, 137, 82, 82, 45, 50, 176) + ), + new PokemonSpecies(SpeciesId.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 0.7, 1, AbilityId.FLASH_FIRE, AbilityId.WHITE_SMOKE, AbilityId.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 3, 120, AbilityId.FLASH_FIRE, AbilityId.WHITE_SMOKE, AbilityId.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.BUG, 3, 120, AbilityId.FLASH_FIRE, AbilityId.WHITE_SMOKE, AbilityId.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.BUG, 75, 999.9, AbilityId.FLASH_FIRE, AbilityId.FLASH_FIRE, AbilityId.FLASH_FIRE, 625, 130, 125, 75, 94, 100, 101, 75, 50, 184) + ), + new PokemonSpecies(SpeciesId.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", PokemonType.FIGHTING, null, 0.6, 4, AbilityId.LIMBER, AbilityId.NONE, AbilityId.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", PokemonType.FIGHTING, null, 1.6, 39, AbilityId.LIMBER, AbilityId.NONE, AbilityId.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SINISTEA, 8, false, false, false, "Black Tea Pokémon", PokemonType.GHOST, null, 0.1, 0.2, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, + new PokemonForm("Phony Form", "phony", PokemonType.GHOST, null, 0.1, 0.2, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), + new PokemonForm("Antique Form", "antique", PokemonType.GHOST, null, 0.1, 0.2, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true) + ), + new PokemonSpecies(SpeciesId.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", PokemonType.GHOST, null, 0.2, 0.4, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, + new PokemonForm("Phony Form", "phony", PokemonType.GHOST, null, 0.2, 0.4, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), + new PokemonForm("Antique Form", "antique", PokemonType.GHOST, null, 0.2, 0.4, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true) + ), + new PokemonSpecies(SpeciesId.HATENNA, 8, false, false, false, "Calm Pokémon", PokemonType.PSYCHIC, null, 0.4, 3.4, AbilityId.HEALER, AbilityId.ANTICIPATION, AbilityId.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), + new PokemonSpecies(SpeciesId.HATTREM, 8, false, false, false, "Serene Pokémon", PokemonType.PSYCHIC, null, 0.6, 4.8, AbilityId.HEALER, AbilityId.ANTICIPATION, AbilityId.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), + new PokemonSpecies(SpeciesId.HATTERENE, 8, false, false, false, "Silent Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 2.1, 5.1, AbilityId.HEALER, AbilityId.ANTICIPATION, AbilityId.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, GrowthRate.SLOW, 0, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FAIRY, 2.1, 5.1, AbilityId.HEALER, AbilityId.ANTICIPATION, AbilityId.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.PSYCHIC, PokemonType.FAIRY, 26, 999.9, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, 610, 87, 100, 110, 146, 118, 49, 45, 50, 255) + ), + new PokemonSpecies(SpeciesId.IMPIDIMP, 8, false, false, false, "Wily Pokémon", PokemonType.DARK, PokemonType.FAIRY, 0.4, 5.5, AbilityId.PRANKSTER, AbilityId.FRISK, AbilityId.PICKPOCKET, 265, 45, 45, 30, 55, 40, 50, 255, 50, 53, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.MORGREM, 8, false, false, false, "Devious Pokémon", PokemonType.DARK, PokemonType.FAIRY, 0.8, 12.5, AbilityId.PRANKSTER, AbilityId.FRISK, AbilityId.PICKPOCKET, 370, 65, 60, 45, 75, 55, 70, 120, 50, 130, GrowthRate.MEDIUM_FAST, 100, false), + new PokemonSpecies(SpeciesId.GRIMMSNARL, 8, false, false, false, "Bulk Up Pokémon", PokemonType.DARK, PokemonType.FAIRY, 1.5, 61, AbilityId.PRANKSTER, AbilityId.FRISK, AbilityId.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, GrowthRate.MEDIUM_FAST, 100, false, true, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.FAIRY, 1.5, 61, AbilityId.PRANKSTER, AbilityId.FRISK, AbilityId.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.DARK, PokemonType.FAIRY, 32, 999.9, AbilityId.PRANKSTER, AbilityId.PRANKSTER, AbilityId.PRANKSTER, 610, 130, 138, 75, 110, 92, 65, 45, 50, 255) + ), + new PokemonSpecies(SpeciesId.OBSTAGOON, 8, false, false, false, "Blocking Pokémon", PokemonType.DARK, PokemonType.NORMAL, 1.6, 46, AbilityId.RECKLESS, AbilityId.GUTS, AbilityId.DEFIANT, 520, 93, 90, 101, 60, 81, 95, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PERRSERKER, 8, false, false, false, "Viking Pokémon", PokemonType.STEEL, null, 0.8, 28, AbilityId.BATTLE_ARMOR, AbilityId.TOUGH_CLAWS, AbilityId.STEELY_SPIRIT, 440, 70, 110, 100, 50, 60, 50, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CURSOLA, 8, false, false, false, "Coral Pokémon", PokemonType.GHOST, null, 1, 0.4, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.PERISH_BODY, 510, 60, 95, 50, 145, 130, 30, 30, 50, 179, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.SIRFETCHD, 8, false, false, false, "Wild Duck Pokémon", PokemonType.FIGHTING, null, 0.8, 117, AbilityId.STEADFAST, AbilityId.NONE, AbilityId.SCRAPPY, 507, 62, 135, 95, 68, 82, 65, 45, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MR_RIME, 8, false, false, false, "Comedian Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.5, 58.2, AbilityId.TANGLED_FEET, AbilityId.SCREEN_CLEANER, AbilityId.ICE_BODY, 520, 80, 85, 75, 110, 100, 70, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.RUNERIGUS, 8, false, false, false, "Grudge Pokémon", PokemonType.GROUND, PokemonType.GHOST, 1.6, 66.6, AbilityId.WANDERING_SPIRIT, AbilityId.NONE, AbilityId.NONE, 483, 58, 95, 145, 50, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.MILCERY, 8, false, false, false, "Cream Pokémon", PokemonType.FAIRY, null, 0.2, 0.3, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 270, 45, 40, 40, 50, 61, 34, 200, 50, 54, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(SpeciesId.ALCREMIE, 8, false, false, false, "Cream Pokémon", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, GrowthRate.MEDIUM_FAST, 0, false, true, + new PokemonForm("Vanilla Cream", "vanilla-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, "", true), + new PokemonForm("Ruby Cream", "ruby-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Matcha Cream", "matcha-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Mint Cream", "mint-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Lemon Cream", "lemon-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Salted Cream", "salted-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Ruby Swirl", "ruby-swirl", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Caramel Swirl", "caramel-swirl", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("Rainbow Swirl", "rainbow-swirl", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FAIRY, null, 30, 999.9, AbilityId.MISTY_SURGE, AbilityId.NONE, AbilityId.MISTY_SURGE, 595, 105, 70, 85, 130, 141, 64, 100, 50, 173) + ), + new PokemonSpecies(SpeciesId.FALINKS, 8, false, false, false, "Formation Pokémon", PokemonType.FIGHTING, null, 3, 62, AbilityId.BATTLE_ARMOR, AbilityId.NONE, AbilityId.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.PINCURCHIN, 8, false, false, false, "Sea Urchin Pokémon", PokemonType.ELECTRIC, null, 0.3, 1, AbilityId.LIGHTNING_ROD, AbilityId.NONE, AbilityId.ELECTRIC_SURGE, 435, 48, 101, 95, 91, 85, 15, 75, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SNOM, 8, false, false, false, "Worm Pokémon", PokemonType.ICE, PokemonType.BUG, 0.3, 3.8, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.ICE_SCALES, 185, 30, 25, 35, 45, 30, 20, 190, 50, 37, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FROSMOTH, 8, false, false, false, "Frost Moth Pokémon", PokemonType.ICE, PokemonType.BUG, 1.3, 42, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.ICE_SCALES, 475, 70, 65, 60, 125, 90, 65, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.STONJOURNER, 8, false, false, false, "Big Rock Pokémon", PokemonType.ROCK, null, 2.5, 520, AbilityId.POWER_SPOT, AbilityId.NONE, AbilityId.NONE, 470, 100, 125, 135, 20, 20, 70, 60, 50, 165, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.EISCUE, 8, false, false, false, "Penguin Pokémon", PokemonType.ICE, null, 1.4, 89, AbilityId.ICE_FACE, AbilityId.NONE, AbilityId.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, GrowthRate.SLOW, 50, false, false, + new PokemonForm("Ice Face", "", PokemonType.ICE, null, 1.4, 89, AbilityId.ICE_FACE, AbilityId.NONE, AbilityId.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, false, null, true), + new PokemonForm("No Ice", "no-ice", PokemonType.ICE, null, 1.4, 89, AbilityId.ICE_FACE, AbilityId.NONE, AbilityId.NONE, 470, 75, 80, 70, 65, 50, 130, 60, 50, 165) + ), + new PokemonSpecies(SpeciesId.INDEEDEE, 8, false, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, AbilityId.INNER_FOCUS, AbilityId.SYNCHRONIZE, AbilityId.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, GrowthRate.FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, AbilityId.INNER_FOCUS, AbilityId.SYNCHRONIZE, AbilityId.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, false, "", true), + new PokemonForm("Female", "female", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, AbilityId.OWN_TEMPO, AbilityId.SYNCHRONIZE, AbilityId.PSYCHIC_SURGE, 475, 70, 55, 65, 95, 105, 85, 30, 140, 166, false, null, true) + ), + new PokemonSpecies(SpeciesId.MORPEKO, 8, false, false, false, "Two-Sided Pokémon", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, AbilityId.HUNGER_SWITCH, AbilityId.NONE, AbilityId.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Full Belly Mode", "full-belly", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, AbilityId.HUNGER_SWITCH, AbilityId.NONE, AbilityId.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, false, "", true), + new PokemonForm("Hangry Mode", "hangry", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, AbilityId.HUNGER_SWITCH, AbilityId.NONE, AbilityId.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153) + ), + new PokemonSpecies(SpeciesId.CUFANT, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 1.2, 100, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 3, 650, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, null, 3, 650, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.GROUND, 23, 999.9, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.MOLD_BREAKER, 600, 177, 155, 79, 90, 79, 20, 90, 50, 175) + ), + new PokemonSpecies(SpeciesId.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 1.8, 190, AbilityId.VOLT_ABSORB, AbilityId.HUSTLE, AbilityId.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.ICE, 2.3, 150, AbilityId.VOLT_ABSORB, AbilityId.STATIC, AbilityId.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.DRACOVISH, 8, false, false, false, "Fossil Pokémon", PokemonType.WATER, PokemonType.DRAGON, 2.3, 215, AbilityId.WATER_ABSORB, AbilityId.STRONG_JAW, AbilityId.SAND_RUSH, 505, 90, 90, 100, 70, 80, 75, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ARCTOVISH, 8, false, false, false, "Fossil Pokémon", PokemonType.WATER, PokemonType.ICE, 2, 175, AbilityId.WATER_ABSORB, AbilityId.ICE_BODY, AbilityId.SLUSH_RUSH, 505, 90, 90, 100, 80, 90, 55, 45, 50, 177, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.DURALUDON, 8, false, false, false, "Alloy Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 1.8, 40, AbilityId.LIGHT_METAL, AbilityId.HEAVY_METAL, AbilityId.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false, true, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.DRAGON, 1.8, 40, AbilityId.LIGHT_METAL, AbilityId.HEAVY_METAL, AbilityId.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, false, null, true), + new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.DRAGON, 43, 999.9, AbilityId.LIGHTNING_ROD, AbilityId.LIGHTNING_ROD, AbilityId.LIGHTNING_ROD, 635, 100, 110, 120, 175, 60, 70, 45, 50, 187) + ), + new PokemonSpecies(SpeciesId.DREEPY, 8, false, false, false, "Lingering Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 0.5, 2, AbilityId.CLEAR_BODY, AbilityId.INFILTRATOR, AbilityId.CURSED_BODY, 270, 28, 60, 30, 40, 30, 82, 45, 50, 54, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 1.4, 11, AbilityId.CLEAR_BODY, AbilityId.INFILTRATOR, AbilityId.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.DRAGAPULT, 8, false, false, false, "Stealth Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 3, 50, AbilityId.CLEAR_BODY, AbilityId.INFILTRATOR, AbilityId.CURSED_BODY, 600, 88, 120, 75, 100, 75, 142, 45, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.ZACIAN, 8, false, true, false, "Warrior Pokémon", PokemonType.FAIRY, null, 2.8, 110, AbilityId.INTREPID_SWORD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, + new PokemonForm("Hero of Many Battles", "hero-of-many-battles", PokemonType.FAIRY, null, 2.8, 110, AbilityId.INTREPID_SWORD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), + new PokemonForm("Crowned", "crowned", PokemonType.FAIRY, PokemonType.STEEL, 2.8, 355, AbilityId.INTREPID_SWORD, AbilityId.NONE, AbilityId.NONE, 700, 92, 150, 115, 80, 115, 148, 10, 0, 360) + ), + new PokemonSpecies(SpeciesId.ZAMAZENTA, 8, false, true, false, "Warrior Pokémon", PokemonType.FIGHTING, null, 2.9, 210, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, + new PokemonForm("Hero of Many Battles", "hero-of-many-battles", PokemonType.FIGHTING, null, 2.9, 210, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), + new PokemonForm("Crowned", "crowned", PokemonType.FIGHTING, PokemonType.STEEL, 2.9, 785, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 360) + ), + new PokemonSpecies(SpeciesId.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", PokemonType.POISON, PokemonType.DRAGON, 20, 950, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.POISON, PokemonType.DRAGON, 20, 950, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), + new PokemonForm("E-Max", "eternamax", PokemonType.POISON, PokemonType.DRAGON, 100, 999.9, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345) + ), + new PokemonSpecies(SpeciesId.KUBFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, null, 0.6, 12, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.URSHIFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, + new PokemonForm("Single Strike Style", "single-strike", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), + new PokemonForm("Rapid Strike Style", "rapid-strike", PokemonType.FIGHTING, PokemonType.WATER, 1.9, 105, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), + new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, PokemonType.FIGHTING, PokemonType.DARK, 29, 999.9, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 650, 125, 145, 115, 83, 70, 112, 3, 50, 275), + new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, PokemonType.FIGHTING, PokemonType.WATER, 26, 999.9, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 650, 125, 145, 115, 83, 70, 112, 3, 50, 275) + ), + new PokemonSpecies(SpeciesId.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, + new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), + new PokemonForm("Dada", "dada", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true) + ), + new PokemonSpecies(SpeciesId.REGIELEKI, 8, true, false, false, "Electron Pokémon", PokemonType.ELECTRIC, null, 1.2, 145, AbilityId.TRANSISTOR, AbilityId.NONE, AbilityId.NONE, 580, 80, 100, 50, 100, 50, 200, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", PokemonType.DRAGON, null, 2.1, 200, AbilityId.DRAGONS_MAW, AbilityId.NONE, AbilityId.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.GLASTRIER, 8, true, false, false, "Wild Horse Pokémon", PokemonType.ICE, null, 2.2, 800, AbilityId.CHILLING_NEIGH, AbilityId.NONE, AbilityId.NONE, 580, 100, 145, 130, 65, 110, 30, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", PokemonType.GHOST, null, 2, 44.5, AbilityId.GRIM_NEIGH, AbilityId.NONE, AbilityId.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.CALYREX, 8, false, true, false, "King Pokémon", PokemonType.PSYCHIC, PokemonType.GRASS, 1.1, 7.7, AbilityId.UNNERVE, AbilityId.NONE, AbilityId.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true, + new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.GRASS, 1.1, 7.7, AbilityId.UNNERVE, AbilityId.NONE, AbilityId.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, false, null, true), + new PokemonForm("Ice", "ice", PokemonType.PSYCHIC, PokemonType.ICE, 2.4, 809.1, AbilityId.AS_ONE_GLASTRIER, AbilityId.NONE, AbilityId.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 340), + new PokemonForm("Shadow", "shadow", PokemonType.PSYCHIC, PokemonType.GHOST, 2.4, 53.6, AbilityId.AS_ONE_SPECTRIER, AbilityId.NONE, AbilityId.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 340) + ), + new PokemonSpecies(SpeciesId.WYRDEER, 8, false, false, false, "Big Horn Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.8, 95.1, AbilityId.INTIMIDATE, AbilityId.FRISK, AbilityId.SAP_SIPPER, 525, 103, 105, 72, 105, 75, 65, 45, 50, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.KLEAVOR, 8, false, false, false, "Axe Pokémon", PokemonType.BUG, PokemonType.ROCK, 1.8, 89, AbilityId.SWARM, AbilityId.SHEER_FORCE, AbilityId.SHARPNESS, 500, 70, 135, 95, 45, 70, 85, 15, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.URSALUNA, 8, false, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.4, 290, AbilityId.GUTS, AbilityId.BULLETPROOF, AbilityId.UNNERVE, 550, 130, 140, 105, 45, 80, 50, 20, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BASCULEGION, 8, false, false, false, "Big Fish Pokémon", PokemonType.WATER, PokemonType.GHOST, 3, 110, AbilityId.SWIFT_SWIM, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 45, 50, 265, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.WATER, PokemonType.GHOST, 3, 110, AbilityId.SWIFT_SWIM, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 45, 50, 265, false, "", true), + new PokemonForm("Female", "female", PokemonType.WATER, PokemonType.GHOST, 3, 110, AbilityId.SWIFT_SWIM, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 530, 120, 92, 65, 100, 75, 78, 45, 50, 265, false, null, true) + ), + new PokemonSpecies(SpeciesId.SNEASLER, 8, false, false, false, "Free Climb Pokémon", PokemonType.FIGHTING, PokemonType.POISON, 1.3, 43, AbilityId.PRESSURE, AbilityId.UNBURDEN, AbilityId.POISON_TOUCH, 510, 80, 130, 60, 40, 80, 120, 20, 50, 102, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.OVERQWIL, 8, false, false, false, "Pin Cluster Pokémon", PokemonType.DARK, PokemonType.POISON, 2.5, 60.5, AbilityId.POISON_POINT, AbilityId.SWIFT_SWIM, AbilityId.INTIMIDATE, 510, 85, 115, 95, 65, 65, 85, 45, 50, 179, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ENAMORUS, 8, true, false, false, "Love-Hate Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, AbilityId.CUTE_CHARM, AbilityId.NONE, AbilityId.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, GrowthRate.SLOW, 0, false, true, + new PokemonForm("Incarnate Forme", "incarnate", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, AbilityId.CUTE_CHARM, AbilityId.NONE, AbilityId.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, false, null, true), + new PokemonForm("Therian Forme", "therian", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 580, 74, 115, 110, 135, 100, 46, 3, 50, 116) + ), + new PokemonSpecies(SpeciesId.SPRIGATITO, 9, false, false, false, "Grass Cat Pokémon", PokemonType.GRASS, null, 0.4, 4.1, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.PROTEAN, 310, 40, 61, 54, 45, 45, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.FLORAGATO, 9, false, false, false, "Grass Cat Pokémon", PokemonType.GRASS, null, 0.9, 12.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.PROTEAN, 410, 61, 80, 63, 60, 63, 83, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.MEOWSCARADA, 9, false, false, false, "Magician Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.5, 31.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.PROTEAN, 530, 76, 110, 70, 81, 70, 123, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.FUECOCO, 9, false, false, false, "Fire Croc Pokémon", PokemonType.FIRE, null, 0.4, 9.8, AbilityId.BLAZE, AbilityId.NONE, AbilityId.UNAWARE, 310, 67, 45, 59, 63, 40, 36, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.CROCALOR, 9, false, false, false, "Fire Croc Pokémon", PokemonType.FIRE, null, 1, 30.7, AbilityId.BLAZE, AbilityId.NONE, AbilityId.UNAWARE, 411, 81, 55, 78, 90, 58, 49, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.SKELEDIRGE, 9, false, false, false, "Singer Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 326.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.UNAWARE, 530, 104, 75, 100, 110, 75, 66, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.QUAXLY, 9, false, false, false, "Duckling Pokémon", PokemonType.WATER, null, 0.5, 6.1, AbilityId.TORRENT, AbilityId.NONE, AbilityId.MOXIE, 310, 55, 65, 45, 50, 45, 50, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.QUAXWELL, 9, false, false, false, "Practicing Pokémon", PokemonType.WATER, null, 1.2, 21.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.MOXIE, 410, 70, 85, 65, 65, 60, 65, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.QUAQUAVAL, 9, false, false, false, "Dancer Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.8, 61.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.MOXIE, 530, 85, 120, 80, 85, 75, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.LECHONK, 9, false, false, false, "Hog Pokémon", PokemonType.NORMAL, null, 0.5, 10.2, AbilityId.AROMA_VEIL, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 254, 54, 45, 40, 35, 45, 35, 255, 50, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.OINKOLOGNE, 9, false, false, false, "Hog Pokémon", PokemonType.NORMAL, null, 1, 120, AbilityId.LINGERING_AROMA, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Male", "male", PokemonType.NORMAL, null, 1, 120, AbilityId.LINGERING_AROMA, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, false, "", true), + new PokemonForm("Female", "female", PokemonType.NORMAL, null, 1, 120, AbilityId.AROMA_VEIL, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 489, 115, 90, 70, 59, 90, 65, 100, 50, 171, false, null, true) + ), + new PokemonSpecies(SpeciesId.TAROUNTULA, 9, false, false, false, "String Ball Pokémon", PokemonType.BUG, null, 0.3, 4, AbilityId.INSOMNIA, AbilityId.NONE, AbilityId.STAKEOUT, 210, 35, 41, 45, 29, 40, 20, 255, 50, 42, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.SPIDOPS, 9, false, false, false, "Trap Pokémon", PokemonType.BUG, null, 1, 16.5, AbilityId.INSOMNIA, AbilityId.NONE, AbilityId.STAKEOUT, 404, 60, 79, 92, 52, 86, 35, 120, 50, 141, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.NYMBLE, 9, false, false, false, "Grasshopper Pokémon", PokemonType.BUG, null, 0.2, 1, AbilityId.SWARM, AbilityId.NONE, AbilityId.TINTED_LENS, 210, 33, 46, 40, 21, 25, 45, 190, 20, 42, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.LOKIX, 9, false, false, false, "Grasshopper Pokémon", PokemonType.BUG, PokemonType.DARK, 1, 17.5, AbilityId.SWARM, AbilityId.NONE, AbilityId.TINTED_LENS, 450, 71, 102, 78, 52, 55, 92, 30, 0, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PAWMI, 9, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.3, 2.5, AbilityId.STATIC, AbilityId.NATURAL_CURE, AbilityId.IRON_FIST, 240, 45, 50, 20, 40, 25, 60, 190, 50, 48, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PAWMO, 9, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, PokemonType.FIGHTING, 0.4, 6.5, AbilityId.VOLT_ABSORB, AbilityId.NATURAL_CURE, AbilityId.IRON_FIST, 350, 60, 75, 40, 50, 40, 85, 80, 50, 123, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.PAWMOT, 9, false, false, false, "Hands-On Pokémon", PokemonType.ELECTRIC, PokemonType.FIGHTING, 0.9, 41, AbilityId.VOLT_ABSORB, AbilityId.NATURAL_CURE, AbilityId.IRON_FIST, 490, 70, 115, 70, 70, 60, 105, 45, 50, 245, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TANDEMAUS, 9, false, false, false, "Couple Pokémon", PokemonType.NORMAL, null, 0.3, 1.8, AbilityId.RUN_AWAY, AbilityId.PICKUP, AbilityId.OWN_TEMPO, 305, 50, 50, 45, 40, 45, 75, 150, 50, 61, GrowthRate.FAST, null, false), + new PokemonSpecies(SpeciesId.MAUSHOLD, 9, false, false, false, "Family Pokémon", PokemonType.NORMAL, null, 0.3, 2.3, AbilityId.FRIEND_GUARD, AbilityId.CHEEK_POUCH, AbilityId.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165, GrowthRate.FAST, null, false, false, + new PokemonForm("Family of Four", "four", PokemonType.NORMAL, null, 0.3, 2.8, AbilityId.FRIEND_GUARD, AbilityId.CHEEK_POUCH, AbilityId.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), + new PokemonForm("Family of Three", "three", PokemonType.NORMAL, null, 0.3, 2.3, AbilityId.FRIEND_GUARD, AbilityId.CHEEK_POUCH, AbilityId.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165) + ), + new PokemonSpecies(SpeciesId.FIDOUGH, 9, false, false, false, "Puppy Pokémon", PokemonType.FAIRY, null, 0.3, 10.9, AbilityId.OWN_TEMPO, AbilityId.NONE, AbilityId.KLUTZ, 312, 37, 55, 70, 30, 55, 65, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.DACHSBUN, 9, false, false, false, "Dog Pokémon", PokemonType.FAIRY, null, 0.5, 14.9, AbilityId.WELL_BAKED_BODY, AbilityId.NONE, AbilityId.AROMA_VEIL, 477, 57, 80, 115, 50, 80, 95, 90, 50, 167, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SMOLIV, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 0.3, 6.5, AbilityId.EARLY_BIRD, AbilityId.NONE, AbilityId.HARVEST, 260, 41, 35, 45, 58, 51, 30, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.DOLLIV, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 0.6, 11.9, AbilityId.EARLY_BIRD, AbilityId.NONE, AbilityId.HARVEST, 354, 52, 53, 60, 78, 78, 33, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.ARBOLIVA, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 1.4, 48.2, AbilityId.SEED_SOWER, AbilityId.NONE, AbilityId.HARVEST, 510, 78, 69, 90, 125, 109, 39, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SQUAWKABILLY, 9, false, false, false, "Parrot Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, GrowthRate.ERRATIC, 50, false, false, + new PokemonForm("Green Plumage", "green-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("Blue Plumage", "blue-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("Yellow Plumage", "yellow-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), + new PokemonForm("White Plumage", "white-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true) + ), + new PokemonSpecies(SpeciesId.NACLI, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 0.4, 16, AbilityId.PURIFYING_SALT, AbilityId.STURDY, AbilityId.CLEAR_BODY, 280, 55, 55, 75, 35, 35, 25, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.NACLSTACK, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 0.6, 105, AbilityId.PURIFYING_SALT, AbilityId.STURDY, AbilityId.CLEAR_BODY, 355, 60, 60, 100, 35, 65, 35, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GARGANACL, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 2.3, 240, AbilityId.PURIFYING_SALT, AbilityId.STURDY, AbilityId.CLEAR_BODY, 500, 100, 100, 130, 45, 90, 35, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CHARCADET, 9, false, false, false, "Fire Child Pokémon", PokemonType.FIRE, null, 0.6, 10.5, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.FLAME_BODY, 255, 40, 50, 40, 50, 40, 35, 90, 50, 51, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.ARMAROUGE, 9, false, false, false, "Fire Warrior Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 85, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.WEAK_ARMOR, 525, 85, 60, 100, 125, 80, 75, 25, 20, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.CERULEDGE, 9, false, false, false, "Fire Blades Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 62, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.WEAK_ARMOR, 525, 75, 125, 80, 60, 100, 85, 25, 20, 263, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.TADBULB, 9, false, false, false, "EleTadpole Pokémon", PokemonType.ELECTRIC, null, 0.3, 0.4, AbilityId.OWN_TEMPO, AbilityId.STATIC, AbilityId.DAMP, 272, 61, 31, 41, 59, 35, 45, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BELLIBOLT, 9, false, false, false, "EleFrog Pokémon", PokemonType.ELECTRIC, null, 1.2, 113, AbilityId.ELECTROMORPHOSIS, AbilityId.STATIC, AbilityId.DAMP, 495, 109, 64, 91, 103, 83, 45, 50, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WATTREL, 9, false, false, false, "Storm Petrel Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 0.4, 3.6, AbilityId.WIND_POWER, AbilityId.VOLT_ABSORB, AbilityId.COMPETITIVE, 280, 40, 40, 35, 55, 40, 70, 180, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.KILOWATTREL, 9, false, false, false, "Frigatebird Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.4, 38.6, AbilityId.WIND_POWER, AbilityId.VOLT_ABSORB, AbilityId.COMPETITIVE, 490, 70, 70, 60, 105, 60, 125, 90, 50, 172, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.MASCHIFF, 9, false, false, false, "Rascal Pokémon", PokemonType.DARK, null, 0.5, 16, AbilityId.INTIMIDATE, AbilityId.RUN_AWAY, AbilityId.STAKEOUT, 340, 60, 78, 60, 40, 51, 51, 150, 50, 68, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.MABOSSTIFF, 9, false, false, false, "Boss Pokémon", PokemonType.DARK, null, 1.1, 61, AbilityId.INTIMIDATE, AbilityId.GUARD_DOG, AbilityId.STAKEOUT, 505, 80, 120, 90, 60, 70, 85, 75, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.SHROODLE, 9, false, false, false, "Toxic Mouse Pokémon", PokemonType.POISON, PokemonType.NORMAL, 0.2, 0.7, AbilityId.UNBURDEN, AbilityId.PICKPOCKET, AbilityId.PRANKSTER, 290, 40, 65, 35, 40, 35, 75, 190, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GRAFAIAI, 9, false, false, false, "Toxic Monkey Pokémon", PokemonType.POISON, PokemonType.NORMAL, 0.7, 27.2, AbilityId.UNBURDEN, AbilityId.POISON_TOUCH, AbilityId.PRANKSTER, 485, 63, 95, 65, 80, 72, 110, 90, 50, 170, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.BRAMBLIN, 9, false, false, false, "Tumbleweed Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.6, 0.6, AbilityId.WIND_RIDER, AbilityId.NONE, AbilityId.INFILTRATOR, 275, 40, 65, 30, 45, 35, 60, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BRAMBLEGHAST, 9, false, false, false, "Tumbleweed Pokémon", PokemonType.GRASS, PokemonType.GHOST, 1.2, 6, AbilityId.WIND_RIDER, AbilityId.NONE, AbilityId.INFILTRATOR, 480, 55, 115, 70, 80, 70, 90, 45, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.TOEDSCOOL, 9, false, false, false, "Woodear Pokémon", PokemonType.GROUND, PokemonType.GRASS, 0.9, 33, AbilityId.MYCELIUM_MIGHT, AbilityId.NONE, AbilityId.NONE, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.TOEDSCRUEL, 9, false, false, false, "Woodear Pokémon", PokemonType.GROUND, PokemonType.GRASS, 1.9, 58, AbilityId.MYCELIUM_MIGHT, AbilityId.NONE, AbilityId.NONE, 515, 80, 70, 65, 80, 120, 100, 90, 50, 180, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.KLAWF, 9, false, false, false, "Ambush Pokémon", PokemonType.ROCK, null, 1.3, 79, AbilityId.ANGER_SHELL, AbilityId.SHELL_ARMOR, AbilityId.REGENERATOR, 450, 70, 100, 115, 35, 55, 75, 120, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CAPSAKID, 9, false, false, false, "Spicy Pepper Pokémon", PokemonType.GRASS, null, 0.3, 3, AbilityId.CHLOROPHYLL, AbilityId.INSOMNIA, AbilityId.KLUTZ, 304, 50, 62, 40, 62, 40, 50, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.SCOVILLAIN, 9, false, false, false, "Spicy Pepper Pokémon", PokemonType.GRASS, PokemonType.FIRE, 0.9, 15, AbilityId.CHLOROPHYLL, AbilityId.INSOMNIA, AbilityId.MOODY, 486, 65, 108, 65, 108, 65, 75, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.RELLOR, 9, false, false, false, "Rolling Pokémon", PokemonType.BUG, null, 0.2, 1, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.SHED_SKIN, 270, 41, 50, 60, 31, 58, 30, 190, 50, 54, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.RABSCA, 9, false, false, false, "Rolling Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.3, 3.5, AbilityId.SYNCHRONIZE, AbilityId.NONE, AbilityId.TELEPATHY, 470, 75, 50, 85, 115, 100, 45, 45, 50, 165, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.FLITTLE, 9, false, false, false, "Frill Pokémon", PokemonType.PSYCHIC, null, 0.2, 1.5, AbilityId.ANTICIPATION, AbilityId.FRISK, AbilityId.SPEED_BOOST, 255, 30, 35, 30, 55, 30, 75, 120, 50, 51, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.ESPATHRA, 9, false, false, false, "Ostrich Pokémon", PokemonType.PSYCHIC, null, 1.9, 90, AbilityId.OPPORTUNIST, AbilityId.FRISK, AbilityId.SPEED_BOOST, 481, 95, 60, 60, 101, 60, 105, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.TINKATINK, 9, false, false, false, "Metalsmith Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.4, 8.9, AbilityId.MOLD_BREAKER, AbilityId.OWN_TEMPO, AbilityId.PICKPOCKET, 297, 50, 45, 45, 35, 64, 58, 190, 50, 59, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.TINKATUFF, 9, false, false, false, "Hammer Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.7, 59.1, AbilityId.MOLD_BREAKER, AbilityId.OWN_TEMPO, AbilityId.PICKPOCKET, 380, 65, 55, 55, 45, 82, 78, 90, 50, 133, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.TINKATON, 9, false, false, false, "Hammer Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.7, 112.8, AbilityId.MOLD_BREAKER, AbilityId.OWN_TEMPO, AbilityId.PICKPOCKET, 506, 85, 75, 77, 70, 105, 94, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), + new PokemonSpecies(SpeciesId.WIGLETT, 9, false, false, false, "Garden Eel Pokémon", PokemonType.WATER, null, 1.2, 1.8, AbilityId.GOOEY, AbilityId.RATTLED, AbilityId.SAND_VEIL, 245, 10, 55, 25, 35, 25, 95, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.WUGTRIO, 9, false, false, false, "Garden Eel Pokémon", PokemonType.WATER, null, 1.2, 5.4, AbilityId.GOOEY, AbilityId.RATTLED, AbilityId.SAND_VEIL, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BOMBIRDIER, 9, false, false, false, "Item Drop Pokémon", PokemonType.FLYING, PokemonType.DARK, 1.5, 42.9, AbilityId.BIG_PECKS, AbilityId.KEEN_EYE, AbilityId.ROCKY_PAYLOAD, 485, 70, 103, 85, 60, 85, 82, 25, 50, 243, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.FINIZEN, 9, false, false, false, "Dolphin Pokémon", PokemonType.WATER, null, 1.3, 60.2, AbilityId.WATER_VEIL, AbilityId.NONE, AbilityId.NONE, 315, 70, 45, 40, 45, 40, 75, 200, 50, 63, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.PALAFIN, 9, false, false, false, "Dolphin Pokémon", PokemonType.WATER, null, 1.3, 60.2, AbilityId.ZERO_TO_HERO, AbilityId.NONE, AbilityId.NONE, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, GrowthRate.SLOW, 50, false, true, + new PokemonForm("Zero Form", "zero", PokemonType.WATER, null, 1.3, 60.2, AbilityId.ZERO_TO_HERO, AbilityId.NONE, AbilityId.ZERO_TO_HERO, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, false, null, true), + new PokemonForm("Hero Form", "hero", PokemonType.WATER, null, 1.8, 97.4, AbilityId.ZERO_TO_HERO, AbilityId.NONE, AbilityId.ZERO_TO_HERO, 650, 100, 160, 97, 106, 87, 100, 45, 50, 160) + ), + new PokemonSpecies(SpeciesId.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1, 35, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, false, null, true), + new PokemonForm("Segin Starmobile", "segin-starmobile", PokemonType.STEEL, PokemonType.DARK, 1.8, 240, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Schedar Starmobile", "schedar-starmobile", PokemonType.STEEL, PokemonType.FIRE, 1.8, 240, AbilityId.SPEED_BOOST, AbilityId.NONE, AbilityId.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Navi Starmobile", "navi-starmobile", PokemonType.STEEL, PokemonType.POISON, 1.8, 240, AbilityId.TOXIC_DEBRIS, AbilityId.NONE, AbilityId.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", PokemonType.STEEL, PokemonType.FAIRY, 1.8, 240, AbilityId.MISTY_SURGE, AbilityId.NONE, AbilityId.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Caph Starmobile", "caph-starmobile", PokemonType.STEEL, PokemonType.FIGHTING, 1.8, 240, AbilityId.STAMINA, AbilityId.NONE, AbilityId.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true) + ), + new PokemonSpecies(SpeciesId.CYCLIZAR, 9, false, false, false, "Mount Pokémon", PokemonType.DRAGON, PokemonType.NORMAL, 1.6, 63, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", PokemonType.STEEL, null, 2.5, 310, AbilityId.EARTH_EATER, AbilityId.NONE, AbilityId.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.GLIMMET, 9, false, false, false, "Ore Pokémon", PokemonType.ROCK, PokemonType.POISON, 0.7, 8, AbilityId.TOXIC_DEBRIS, AbilityId.NONE, AbilityId.CORROSION, 350, 48, 35, 42, 105, 60, 60, 70, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GLIMMORA, 9, false, false, false, "Ore Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.5, 45, AbilityId.TOXIC_DEBRIS, AbilityId.NONE, AbilityId.CORROSION, 525, 83, 55, 90, 130, 81, 86, 25, 50, 184, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GREAVARD, 9, false, false, false, "Ghost Dog Pokémon", PokemonType.GHOST, null, 0.6, 35, AbilityId.PICKUP, AbilityId.NONE, AbilityId.FLUFFY, 290, 50, 61, 60, 30, 55, 34, 120, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.HOUNDSTONE, 9, false, false, false, "Ghost Dog Pokémon", PokemonType.GHOST, null, 2, 15, AbilityId.SAND_RUSH, AbilityId.NONE, AbilityId.FLUFFY, 488, 72, 101, 100, 50, 97, 68, 60, 50, 171, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.FLAMIGO, 9, false, false, false, "Synchronize Pokémon", PokemonType.FLYING, PokemonType.FIGHTING, 1.6, 37, AbilityId.SCRAPPY, AbilityId.TANGLED_FEET, AbilityId.COSTAR, 500, 82, 115, 74, 75, 64, 90, 100, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CETODDLE, 9, false, false, false, "Terra Whale Pokémon", PokemonType.ICE, null, 1.2, 45, AbilityId.THICK_FAT, AbilityId.SNOW_CLOAK, AbilityId.SHEER_FORCE, 334, 108, 68, 45, 30, 40, 43, 150, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.CETITAN, 9, false, false, false, "Terra Whale Pokémon", PokemonType.ICE, null, 4.5, 700, AbilityId.THICK_FAT, AbilityId.SLUSH_RUSH, AbilityId.SHEER_FORCE, 521, 170, 113, 65, 45, 55, 73, 50, 50, 182, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.VELUZA, 9, false, false, false, "Jettison Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 2.5, 90, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.SHARPNESS, 478, 90, 102, 73, 78, 65, 70, 100, 50, 167, GrowthRate.FAST, 50, false), + new PokemonSpecies(SpeciesId.DONDOZO, 9, false, false, false, "Big Catfish Pokémon", PokemonType.WATER, null, 12, 220, AbilityId.UNAWARE, AbilityId.OBLIVIOUS, AbilityId.WATER_VEIL, 530, 150, 100, 115, 65, 65, 35, 25, 50, 265, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.TATSUGIRI, 9, false, false, false, "Mimicry Pokémon", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, AbilityId.COMMANDER, AbilityId.NONE, AbilityId.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, GrowthRate.MEDIUM_SLOW, 50, false, false, + new PokemonForm("Curly Form", "curly", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, AbilityId.COMMANDER, AbilityId.NONE, AbilityId.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), + new PokemonForm("Droopy Form", "droopy", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, AbilityId.COMMANDER, AbilityId.NONE, AbilityId.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), + new PokemonForm("Stretchy Form", "stretchy", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, AbilityId.COMMANDER, AbilityId.NONE, AbilityId.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true) + ), + new PokemonSpecies(SpeciesId.ANNIHILAPE, 9, false, false, false, "Rage Monkey Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 1.2, 56, AbilityId.VITAL_SPIRIT, AbilityId.INNER_FOCUS, AbilityId.DEFIANT, 535, 110, 115, 80, 50, 90, 90, 45, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.CLODSIRE, 9, false, false, false, "Spiny Fish Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.8, 223, AbilityId.POISON_POINT, AbilityId.WATER_ABSORB, AbilityId.UNAWARE, 430, 130, 75, 60, 45, 100, 20, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.FARIGIRAF, 9, false, false, false, "Long Neck Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 3.2, 160, AbilityId.CUD_CHEW, AbilityId.ARMOR_TAIL, AbilityId.SAP_SIPPER, 520, 120, 90, 70, 110, 70, 60, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.DUDUNSPARCE, 9, false, false, false, "Land Snake Pokémon", PokemonType.NORMAL, null, 3.6, 39.2, AbilityId.SERENE_GRACE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false, false, + new PokemonForm("Two-Segment Form", "two-segment", PokemonType.NORMAL, null, 3.6, 39.2, AbilityId.SERENE_GRACE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, false, ""), + new PokemonForm("Three-Segment Form", "three-segment", PokemonType.NORMAL, null, 4.5, 47.4, AbilityId.SERENE_GRACE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182) + ), + new PokemonSpecies(SpeciesId.KINGAMBIT, 9, false, false, false, "Big Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 2, 120, AbilityId.DEFIANT, AbilityId.SUPREME_OVERLORD, AbilityId.PRESSURE, 550, 100, 135, 120, 60, 85, 50, 25, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GREAT_TUSK, 9, false, false, false, "Paradox Pokémon", PokemonType.GROUND, PokemonType.FIGHTING, 2.2, 320, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 115, 131, 131, 53, 53, 87, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SCREAM_TAIL, 9, false, false, false, "Paradox Pokémon", PokemonType.FAIRY, PokemonType.PSYCHIC, 1.2, 8, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 115, 65, 99, 65, 115, 111, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.BRUTE_BONNET, 9, false, false, false, "Paradox Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.2, 21, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 111, 127, 99, 79, 99, 55, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.FLUTTER_MANE, 9, false, false, false, "Paradox Pokémon", PokemonType.GHOST, PokemonType.FAIRY, 1.4, 4, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 55, 55, 55, 135, 135, 135, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SLITHER_WING, 9, false, false, false, "Paradox Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 3.2, 92, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 85, 135, 79, 85, 105, 81, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.SANDY_SHOCKS, 9, false, false, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.GROUND, 2.3, 60, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 85, 81, 97, 121, 85, 101, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_TREADS, 9, false, false, false, "Paradox Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.9, 240, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 90, 112, 120, 72, 70, 106, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_BUNDLE, 9, false, false, false, "Paradox Pokémon", PokemonType.ICE, PokemonType.WATER, 0.6, 11, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 56, 80, 114, 124, 60, 136, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_HANDS, 9, false, false, false, "Paradox Pokémon", PokemonType.FIGHTING, PokemonType.ELECTRIC, 1.8, 380.7, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 154, 140, 108, 50, 68, 50, 50, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_JUGULIS, 9, false, false, false, "Paradox Pokémon", PokemonType.DARK, PokemonType.FLYING, 1.3, 111, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 94, 80, 86, 122, 80, 108, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_MOTH, 9, false, false, false, "Paradox Pokémon", PokemonType.FIRE, PokemonType.POISON, 1.2, 36, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 80, 70, 60, 140, 110, 110, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_THORNS, 9, false, false, false, "Paradox Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1.6, 303, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 100, 134, 110, 70, 84, 72, 30, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.FRIGIBAX, 9, false, false, false, "Ice Fin Pokémon", PokemonType.DRAGON, PokemonType.ICE, 0.5, 17, AbilityId.THERMAL_EXCHANGE, AbilityId.NONE, AbilityId.ICE_BODY, 320, 65, 75, 45, 35, 45, 55, 45, 50, 64, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.ARCTIBAX, 9, false, false, false, "Ice Fin Pokémon", PokemonType.DRAGON, PokemonType.ICE, 0.8, 30, AbilityId.THERMAL_EXCHANGE, AbilityId.NONE, AbilityId.ICE_BODY, 423, 90, 95, 66, 45, 65, 62, 25, 50, 148, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.BAXCALIBUR, 9, false, false, false, "Ice Dragon Pokémon", PokemonType.DRAGON, PokemonType.ICE, 2.1, 210, AbilityId.THERMAL_EXCHANGE, AbilityId.NONE, AbilityId.ICE_BODY, 600, 115, 145, 92, 75, 86, 87, 10, 50, 300, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.GIMMIGHOUL, 9, false, false, false, "Coin Chest Pokémon", PokemonType.GHOST, null, 0.3, 5, AbilityId.RATTLED, AbilityId.NONE, AbilityId.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, GrowthRate.SLOW, null, false, false, + new PokemonForm("Chest Form", "chest", PokemonType.GHOST, null, 0.3, 5, AbilityId.RATTLED, AbilityId.NONE, AbilityId.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, false, "", true), + new PokemonForm("Roaming Form", "roaming", PokemonType.GHOST, null, 0.1, 1, AbilityId.RUN_AWAY, AbilityId.NONE, AbilityId.NONE, 300, 45, 30, 25, 75, 45, 80, 45, 50, 60, false, null, true) + ), + new PokemonSpecies(SpeciesId.GHOLDENGO, 9, false, false, false, "Coin Entity Pokémon", PokemonType.STEEL, PokemonType.GHOST, 1.2, 30, AbilityId.GOOD_AS_GOLD, AbilityId.NONE, AbilityId.NONE, 550, 87, 60, 95, 133, 91, 84, 45, 50, 275, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.WO_CHIEN, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.5, 74.2, AbilityId.TABLETS_OF_RUIN, AbilityId.NONE, AbilityId.NONE, 570, 85, 85, 100, 95, 135, 70, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.CHIEN_PAO, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.ICE, 1.9, 152.2, AbilityId.SWORD_OF_RUIN, AbilityId.NONE, AbilityId.NONE, 570, 80, 120, 80, 90, 65, 135, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.TING_LU, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.GROUND, 2.7, 699.7, AbilityId.VESSEL_OF_RUIN, AbilityId.NONE, AbilityId.NONE, 570, 155, 110, 125, 55, 80, 45, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.CHI_YU, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.FIRE, 0.4, 4.9, AbilityId.BEADS_OF_RUIN, AbilityId.NONE, AbilityId.NONE, 570, 55, 80, 80, 135, 120, 100, 6, 0, 285, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ROARING_MOON, 9, false, false, false, "Paradox Pokémon", PokemonType.DRAGON, PokemonType.DARK, 2, 380, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 590, 105, 139, 71, 55, 101, 119, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_VALIANT, 9, false, false, false, "Paradox Pokémon", PokemonType.FAIRY, PokemonType.FIGHTING, 1.4, 35, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 590, 74, 130, 90, 120, 60, 116, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.KORAIDON, 9, false, true, false, "Paradox Pokémon", PokemonType.FIGHTING, PokemonType.DRAGON, 2.5, 303, AbilityId.ORICHALCUM_PULSE, AbilityId.NONE, AbilityId.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, + new PokemonForm("Apex Build", "apex-build", PokemonType.FIGHTING, PokemonType.DRAGON, 2.5, 303, AbilityId.ORICHALCUM_PULSE, AbilityId.NONE, AbilityId.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true) + ), + new PokemonSpecies(SpeciesId.MIRAIDON, 9, false, true, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 3.5, 240, AbilityId.HADRON_ENGINE, AbilityId.NONE, AbilityId.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, + new PokemonForm("Ultimate Mode", "ultimate-mode", PokemonType.ELECTRIC, PokemonType.DRAGON, 3.5, 240, AbilityId.HADRON_ENGINE, AbilityId.NONE, AbilityId.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true) + ), + new PokemonSpecies(SpeciesId.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", PokemonType.WATER, PokemonType.DRAGON, 3.5, 280, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 590, 99, 83, 91, 125, 83, 109, 10, 0, 295, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Gouging Fire and Raging Bolt + new PokemonSpecies(SpeciesId.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 1.5, 125, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 590, 90, 130, 88, 70, 108, 104, 10, 0, 295, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Iron Boulder and Iron Crown + new PokemonSpecies(SpeciesId.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 4.4, AbilityId.SUPERSWEET_SYRUP, AbilityId.GLUTTONY, AbilityId.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.SLOW, null, false, false, + new PokemonForm("Counterfeit Form", "counterfeit", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), + new PokemonForm("Artisan Form", "artisan", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "counterfeit", true) + ), + new PokemonSpecies(SpeciesId.SINISTCHA, 9, false, false, false, "Matcha Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, GrowthRate.SLOW, null, false, false, + new PokemonForm("Unremarkable Form", "unremarkable", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, false, null, true), + new PokemonForm("Masterpiece Form", "masterpiece", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, false, "unremarkable", true) + ), + new PokemonSpecies(SpeciesId.OKIDOGI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 1.8, 92.2, AbilityId.TOXIC_CHAIN, AbilityId.NONE, AbilityId.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(SpeciesId.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1, 12.2, AbilityId.TOXIC_CHAIN, AbilityId.NONE, AbilityId.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(SpeciesId.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.FAIRY, 1.4, 30.1, AbilityId.TOXIC_CHAIN, AbilityId.NONE, AbilityId.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), + new PokemonSpecies(SpeciesId.OGERPON, 9, true, false, false, "Mask Pokémon", PokemonType.GRASS, null, 1.2, 39.8, AbilityId.DEFIANT, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false, + new PokemonForm("Teal Mask", "teal-mask", PokemonType.GRASS, null, 1.2, 39.8, AbilityId.DEFIANT, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, false, null, true), + new PokemonForm("Wellspring Mask", "wellspring-mask", PokemonType.GRASS, PokemonType.WATER, 1.2, 39.8, AbilityId.WATER_ABSORB, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Hearthflame Mask", "hearthflame-mask", PokemonType.GRASS, PokemonType.FIRE, 1.2, 39.8, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Cornerstone Mask", "cornerstone-mask", PokemonType.GRASS, PokemonType.ROCK, 1.2, 39.8, AbilityId.STURDY, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Teal Mask Terastallized", "teal-mask-tera", PokemonType.GRASS, null, 1.2, 39.8, AbilityId.EMBODY_ASPECT_TEAL, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Wellspring Mask Terastallized", "wellspring-mask-tera", PokemonType.GRASS, PokemonType.WATER, 1.2, 39.8, AbilityId.EMBODY_ASPECT_WELLSPRING, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Hearthflame Mask Terastallized", "hearthflame-mask-tera", PokemonType.GRASS, PokemonType.FIRE, 1.2, 39.8, AbilityId.EMBODY_ASPECT_HEARTHFLAME, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), + new PokemonForm("Cornerstone Mask Terastallized", "cornerstone-mask-tera", PokemonType.GRASS, PokemonType.ROCK, 1.2, 39.8, AbilityId.EMBODY_ASPECT_CORNERSTONE, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275) + ), + new PokemonSpecies(SpeciesId.ARCHALUDON, 9, false, false, false, "Alloy Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 2, 60, AbilityId.STAMINA, AbilityId.STURDY, AbilityId.STALWART, 600, 90, 105, 130, 125, 65, 85, 10, 50, 300, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HYDRAPPLE, 9, false, false, false, "Apple Hydra Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 1.8, 93, AbilityId.SUPERSWEET_SYRUP, AbilityId.REGENERATOR, AbilityId.STICKY_HOLD, 540, 106, 80, 110, 120, 80, 44, 10, 50, 270, GrowthRate.ERRATIC, 50, false), + new PokemonSpecies(SpeciesId.GOUGING_FIRE, 9, false, false, false, "Paradox Pokémon", PokemonType.FIRE, PokemonType.DRAGON, 3.5, 590, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 590, 105, 115, 121, 65, 93, 91, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.RAGING_BOLT, 9, false, false, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 5.2, 480, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 590, 125, 73, 91, 137, 89, 75, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_BOULDER, 9, false, false, false, "Paradox Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1.5, 162.5, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 590, 90, 120, 80, 68, 108, 124, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.IRON_CROWN, 9, false, false, false, "Paradox Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 156, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 590, 90, 72, 100, 122, 108, 98, 10, 0, 295, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.TERAPAGOS, 9, false, true, false, "Tera Pokémon", PokemonType.NORMAL, null, 0.2, 6.5, AbilityId.TERA_SHIFT, AbilityId.NONE, AbilityId.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, GrowthRate.SLOW, 50, false, false, + new PokemonForm("Normal Form", "", PokemonType.NORMAL, null, 0.2, 6.5, AbilityId.TERA_SHIFT, AbilityId.NONE, AbilityId.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, false, null, true), + new PokemonForm("Terastal Form", "terastal", PokemonType.NORMAL, null, 0.3, 16, AbilityId.TERA_SHELL, AbilityId.NONE, AbilityId.NONE, 600, 95, 95, 110, 105, 110, 85, 5, 50, 120), + new PokemonForm("Stellar Form", "stellar", PokemonType.NORMAL, null, 1.7, 77, AbilityId.TERAFORM_ZERO, AbilityId.NONE, AbilityId.NONE, 700, 160, 105, 110, 130, 110, 85, 5, 50, 140) + ), + new PokemonSpecies(SpeciesId.PECHARUNT, 9, false, false, true, "Subjugation Pokémon", PokemonType.POISON, PokemonType.GHOST, 0.3, 0.3, AbilityId.POISON_PUPPETEER, AbilityId.NONE, AbilityId.NONE, 600, 88, 88, 160, 88, 88, 88, 3, 0, 300, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.ALOLA_RATTATA, 7, false, false, false, "Mouse Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.3, 3.8, AbilityId.GLUTTONY, AbilityId.HUSTLE, AbilityId.THICK_FAT, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_RATICATE, 7, false, false, false, "Mouse Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.7, 25.5, AbilityId.GLUTTONY, AbilityId.HUSTLE, AbilityId.THICK_FAT, 413, 75, 71, 70, 40, 80, 77, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_RAICHU, 7, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, PokemonType.PSYCHIC, 0.7, 21, AbilityId.SURGE_SURFER, AbilityId.NONE, AbilityId.NONE, 485, 60, 85, 50, 95, 85, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_SANDSHREW, 7, false, false, false, "Mouse Pokémon", PokemonType.ICE, PokemonType.STEEL, 0.7, 40, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.SLUSH_RUSH, 300, 50, 75, 90, 10, 35, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_SANDSLASH, 7, false, false, false, "Mouse Pokémon", PokemonType.ICE, PokemonType.STEEL, 1.2, 55, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.SLUSH_RUSH, 450, 75, 100, 120, 25, 65, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_VULPIX, 7, false, false, false, "Fox Pokémon", PokemonType.ICE, null, 0.6, 9.9, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.SNOW_WARNING, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(SpeciesId.ALOLA_NINETALES, 7, false, false, false, "Fox Pokémon", PokemonType.ICE, PokemonType.FAIRY, 1.1, 19.9, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.SNOW_WARNING, 505, 73, 67, 75, 81, 100, 109, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), + new PokemonSpecies(SpeciesId.ALOLA_DIGLETT, 7, false, false, false, "Mole Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.2, 1, AbilityId.SAND_VEIL, AbilityId.TANGLING_HAIR, AbilityId.SAND_FORCE, 265, 10, 55, 30, 35, 45, 90, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_DUGTRIO, 7, false, false, false, "Mole Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 66.6, AbilityId.SAND_VEIL, AbilityId.TANGLING_HAIR, AbilityId.SAND_FORCE, 425, 35, 100, 60, 50, 70, 110, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_MEOWTH, 7, false, false, false, "Scratch Cat Pokémon", PokemonType.DARK, null, 0.4, 4.2, AbilityId.PICKUP, AbilityId.TECHNICIAN, AbilityId.RATTLED, 290, 40, 35, 35, 50, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_PERSIAN, 7, false, false, false, "Classy Cat Pokémon", PokemonType.DARK, null, 1.1, 33, AbilityId.FUR_COAT, AbilityId.TECHNICIAN, AbilityId.RATTLED, 440, 65, 60, 60, 75, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_GEODUDE, 7, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 0.4, 20.3, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.GALVANIZE, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_GRAVELER, 7, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1, 110, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.GALVANIZE, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_GOLEM, 7, false, false, false, "Megaton Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1.7, 316, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.GALVANIZE, 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_GRIMER, 7, false, false, false, "Sludge Pokémon", PokemonType.POISON, PokemonType.DARK, 0.7, 42, AbilityId.POISON_TOUCH, AbilityId.GLUTTONY, AbilityId.POWER_OF_ALCHEMY, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_MUK, 7, false, false, false, "Sludge Pokémon", PokemonType.POISON, PokemonType.DARK, 1, 52, AbilityId.POISON_TOUCH, AbilityId.GLUTTONY, AbilityId.POWER_OF_ALCHEMY, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_EXEGGUTOR, 7, false, false, false, "Coconut Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 10.9, 415.6, AbilityId.FRISK, AbilityId.NONE, AbilityId.HARVEST, 530, 95, 105, 85, 125, 75, 45, 45, 50, 186, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.ALOLA_MAROWAK, 7, false, false, false, "Bone Keeper Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1, 34, AbilityId.CURSED_BODY, AbilityId.LIGHTNING_ROD, AbilityId.ROCK_HEAD, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.ETERNAL_FLOETTE, 6, true, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 551, 74, 65, 67, 125, 128, 92, 120, 70, 243, GrowthRate.MEDIUM_FAST, 0, false), //Marked as Sub-Legend, for casing purposes + new PokemonSpecies(SpeciesId.GALAR_MEOWTH, 8, false, false, false, "Scratch Cat Pokémon", PokemonType.STEEL, null, 0.4, 7.5, AbilityId.PICKUP, AbilityId.TOUGH_CLAWS, AbilityId.UNNERVE, 290, 50, 65, 55, 40, 40, 40, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_PONYTA, 8, false, false, false, "Fire Horse Pokémon", PokemonType.PSYCHIC, null, 0.8, 24, AbilityId.RUN_AWAY, AbilityId.PASTEL_VEIL, AbilityId.ANTICIPATION, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_RAPIDASH, 8, false, false, false, "Fire Horse Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.7, 80, AbilityId.RUN_AWAY, AbilityId.PASTEL_VEIL, AbilityId.ANTICIPATION, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_SLOWPOKE, 8, false, false, false, "Dopey Pokémon", PokemonType.PSYCHIC, null, 1.2, 36, AbilityId.GLUTTONY, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_SLOWBRO, 8, false, false, false, "Hermit Crab Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1.6, 70.5, AbilityId.QUICK_DRAW, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 100, 95, 100, 70, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_FARFETCHD, 8, false, false, false, "Wild Duck Pokémon", PokemonType.FIGHTING, null, 0.8, 42, AbilityId.STEADFAST, AbilityId.NONE, AbilityId.SCRAPPY, 377, 52, 95, 55, 58, 62, 55, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_WEEZING, 8, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, PokemonType.FAIRY, 3, 16, AbilityId.LEVITATE, AbilityId.NEUTRALIZING_GAS, AbilityId.MISTY_SURGE, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_MR_MIME, 8, false, false, false, "Barrier Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.4, 56.8, AbilityId.VITAL_SPIRIT, AbilityId.SCREEN_CLEANER, AbilityId.ICE_BODY, 460, 50, 65, 65, 90, 90, 100, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_ARTICUNO, 8, true, false, false, "Freeze Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.7, 50.9, AbilityId.COMPETITIVE, AbilityId.NONE, AbilityId.NONE, 580, 90, 85, 85, 125, 100, 95, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.GALAR_ZAPDOS, 8, true, false, false, "Electric Pokémon", PokemonType.FIGHTING, PokemonType.FLYING, 1.6, 58.2, AbilityId.DEFIANT, AbilityId.NONE, AbilityId.NONE, 580, 90, 125, 90, 85, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.GALAR_MOLTRES, 8, true, false, false, "Flame Pokémon", PokemonType.DARK, PokemonType.FLYING, 2, 66, AbilityId.BERSERK, AbilityId.NONE, AbilityId.NONE, 580, 90, 85, 90, 100, 125, 90, 3, 35, 290, GrowthRate.SLOW, null, false), + new PokemonSpecies(SpeciesId.GALAR_SLOWKING, 8, false, false, false, "Royal Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1.8, 79.5, AbilityId.CURIOUS_MEDICINE, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 65, 80, 110, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_CORSOLA, 8, false, false, false, "Coral Pokémon", PokemonType.GHOST, null, 0.6, 0.5, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 410, 60, 55, 100, 65, 100, 30, 60, 50, 144, GrowthRate.FAST, 25, false), + new PokemonSpecies(SpeciesId.GALAR_ZIGZAGOON, 8, false, false, false, "Tiny Raccoon Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.4, 17.5, AbilityId.PICKUP, AbilityId.GLUTTONY, AbilityId.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_LINOONE, 8, false, false, false, "Rushing Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.5, 32.5, AbilityId.PICKUP, AbilityId.GLUTTONY, AbilityId.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_DARUMAKA, 8, false, false, false, "Zen Charm Pokémon", PokemonType.ICE, null, 0.7, 40, AbilityId.HUSTLE, AbilityId.NONE, AbilityId.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), + new PokemonSpecies(SpeciesId.GALAR_DARMANITAN, 8, false, false, false, "Blazing Pokémon", PokemonType.ICE, null, 1.7, 120, AbilityId.GORILLA_TACTICS, AbilityId.NONE, AbilityId.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, + new PokemonForm("Standard Mode", "", PokemonType.ICE, null, 1.7, 120, AbilityId.GORILLA_TACTICS, AbilityId.NONE, AbilityId.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), + new PokemonForm("Zen Mode", "zen", PokemonType.ICE, PokemonType.FIRE, 1.7, 120, AbilityId.GORILLA_TACTICS, AbilityId.NONE, AbilityId.ZEN_MODE, 540, 105, 160, 55, 30, 55, 135, 60, 50, 189) + ), + new PokemonSpecies(SpeciesId.GALAR_YAMASK, 8, false, false, false, "Spirit Pokémon", PokemonType.GROUND, PokemonType.GHOST, 0.5, 1.5, AbilityId.WANDERING_SPIRIT, AbilityId.NONE, AbilityId.NONE, 303, 38, 55, 85, 30, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.GALAR_STUNFISK, 8, false, false, false, "Trap Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 20.5, AbilityId.MIMICRY, AbilityId.NONE, AbilityId.NONE, 471, 109, 81, 99, 66, 84, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HISUI_GROWLITHE, 8, false, false, false, "Puppy Pokémon", PokemonType.FIRE, PokemonType.ROCK, 0.8, 22.7, AbilityId.INTIMIDATE, AbilityId.FLASH_FIRE, AbilityId.ROCK_HEAD, 350, 60, 75, 45, 65, 50, 55, 190, 50, 70, GrowthRate.SLOW, 75, false), + new PokemonSpecies(SpeciesId.HISUI_ARCANINE, 8, false, false, false, "Legendary Pokémon", PokemonType.FIRE, PokemonType.ROCK, 2, 168, AbilityId.INTIMIDATE, AbilityId.FLASH_FIRE, AbilityId.ROCK_HEAD, 555, 95, 115, 80, 95, 80, 90, 85, 50, 194, GrowthRate.SLOW, 75, false), + new PokemonSpecies(SpeciesId.HISUI_VOLTORB, 8, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, PokemonType.GRASS, 0.5, 13, AbilityId.SOUNDPROOF, AbilityId.STATIC, AbilityId.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 80, 66, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.HISUI_ELECTRODE, 8, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, PokemonType.GRASS, 1.2, 81, AbilityId.SOUNDPROOF, AbilityId.STATIC, AbilityId.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), + new PokemonSpecies(SpeciesId.HISUI_TYPHLOSION, 8, false, false, false, "Volcano Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 69.8, AbilityId.BLAZE, AbilityId.NONE, AbilityId.FRISK, 534, 73, 84, 78, 119, 85, 95, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.HISUI_QWILFISH, 8, false, false, false, "Balloon Pokémon", PokemonType.DARK, PokemonType.POISON, 0.5, 3.9, AbilityId.POISON_POINT, AbilityId.SWIFT_SWIM, AbilityId.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HISUI_SNEASEL, 8, false, false, false, "Sharp Claw Pokémon", PokemonType.FIGHTING, PokemonType.POISON, 0.9, 27, AbilityId.INNER_FOCUS, AbilityId.KEEN_EYE, AbilityId.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), + new PokemonSpecies(SpeciesId.HISUI_SAMUROTT, 8, false, false, false, "Formidable Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 58.2, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHARPNESS, 528, 90, 108, 80, 100, 65, 85, 45, 80, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.HISUI_LILLIGANT, 8, false, false, false, "Flowering Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.2, 19.2, AbilityId.CHLOROPHYLL, AbilityId.HUSTLE, AbilityId.LEAF_GUARD, 480, 70, 105, 75, 50, 75, 105, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), + new PokemonSpecies(SpeciesId.HISUI_ZORUA, 8, false, false, false, "Tricky Fox Pokémon", PokemonType.NORMAL, PokemonType.GHOST, 0.7, 12.5, AbilityId.ILLUSION, AbilityId.NONE, AbilityId.NONE, 330, 35, 60, 40, 85, 40, 70, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.HISUI_ZOROARK, 8, false, false, false, "Illusion Fox Pokémon", PokemonType.NORMAL, PokemonType.GHOST, 1.6, 83, AbilityId.ILLUSION, AbilityId.NONE, AbilityId.NONE, 510, 55, 100, 60, 125, 60, 110, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.HISUI_BRAVIARY, 8, false, false, false, "Valiant Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.7, 43.4, AbilityId.KEEN_EYE, AbilityId.SHEER_FORCE, AbilityId.TINTED_LENS, 510, 110, 83, 70, 112, 70, 65, 60, 50, 179, GrowthRate.SLOW, 100, false), + new PokemonSpecies(SpeciesId.HISUI_SLIGGOO, 8, false, false, false, "Soft Tissue Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 0.7, 68.5, AbilityId.SAP_SIPPER, AbilityId.SHELL_ARMOR, AbilityId.GOOEY, 452, 58, 75, 83, 83, 113, 40, 45, 35, 158, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.HISUI_GOODRA, 8, false, false, false, "Dragon Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 1.7, 334.1, AbilityId.SAP_SIPPER, AbilityId.SHELL_ARMOR, AbilityId.GOOEY, 600, 80, 100, 100, 110, 150, 60, 45, 35, 270, GrowthRate.SLOW, 50, false), + new PokemonSpecies(SpeciesId.HISUI_AVALUGG, 8, false, false, false, "Iceberg Pokémon", PokemonType.ICE, PokemonType.ROCK, 1.4, 262.4, AbilityId.STRONG_JAW, AbilityId.ICE_BODY, AbilityId.STURDY, 514, 95, 127, 184, 34, 36, 38, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.HISUI_DECIDUEYE, 8, false, false, false, "Arrow Quill Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.6, 37, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.SCRAPPY, 530, 88, 112, 80, 95, 95, 60, 45, 50, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), + new PokemonSpecies(SpeciesId.PALDEA_TAUROS, 9, false, false, false, "Wild Bull Pokémon", PokemonType.FIGHTING, null, 1.4, 115, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, GrowthRate.SLOW, 100, false, false, + new PokemonForm("Combat Breed", "combat", PokemonType.FIGHTING, null, 1.4, 115, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, "", true), + new PokemonForm("Blaze Breed", "blaze", PokemonType.FIGHTING, PokemonType.FIRE, 1.4, 85, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), + new PokemonForm("Aqua Breed", "aqua", PokemonType.FIGHTING, PokemonType.WATER, 1.4, 110, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true) + ), + new PokemonSpecies(SpeciesId.PALDEA_WOOPER, 9, false, false, false, "Water Fish Pokémon", PokemonType.POISON, PokemonType.GROUND, 0.4, 11, AbilityId.POISON_POINT, AbilityId.WATER_ABSORB, AbilityId.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(SpeciesId.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.7, 333, AbilityId.MINDS_EYE, AbilityId.NONE, AbilityId.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 278, GrowthRate.MEDIUM_FAST, 50, false) + ); +} diff --git a/src/data/challenge.ts b/src/data/challenge.ts index fd6528bb3bc..1a1a3774f8f 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -6,7 +6,6 @@ import { pokemonEvolutions } from "#balance/pokemon-evolutions"; import { speciesStarterCosts } from "#balance/starters"; import { pokemonFormChanges } from "#data/pokemon-forms"; import type { PokemonSpecies } from "#data/pokemon-species"; -import { getPokemonSpeciesForm } from "#data/pokemon-species"; import { BattleType } from "#enums/battle-type"; import { ChallengeType } from "#enums/challenge-type"; import { Challenges } from "#enums/challenges"; @@ -26,7 +25,7 @@ import { PokemonMove } from "#moves/pokemon-move"; import type { DexAttrProps, GameData } from "#system/game-data"; import { BooleanHolder, isBetween, type NumberHolder, randSeedItem } from "#utils/common"; import { deepCopy } from "#utils/data"; -import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; import { toCamelCase, toSnakeCase } from "#utils/strings"; import i18next from "i18next"; diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index 9a6f560933a..b5fb0aa8c07 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -2,7 +2,7 @@ import { pokerogueApi } from "#api/pokerogue-api"; import { globalScene } from "#app/global-scene"; import { speciesStarterCosts } from "#balance/starters"; import type { PokemonSpeciesForm } from "#data/pokemon-species"; -import { getPokemonSpeciesForm, PokemonSpecies } from "#data/pokemon-species"; +import { PokemonSpecies } from "#data/pokemon-species"; import { BiomeId } from "#enums/biome-id"; import { PartyMemberStrength } from "#enums/party-member-strength"; import type { SpeciesId } from "#enums/species-id"; @@ -10,7 +10,7 @@ import { PlayerPokemon } from "#field/pokemon"; import type { Starter } from "#ui/starter-select-ui-handler"; import { randSeedGauss, randSeedInt, randSeedItem } from "#utils/common"; import { getEnumValues } from "#utils/enums"; -import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; export interface DailyRunConfig { seed: number; diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index dfaa6425ef1..7bfe02d9086 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -12,14 +12,13 @@ import { pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves, } from "#balance/pokemon-level-moves"; -import { POKERUS_STARTER_COUNT, speciesStarterCosts } from "#balance/starters"; -import { allSpecies } from "#data/data-lists"; -import { GrowthRate } from "#data/exp"; +import { speciesStarterCosts } from "#balance/starters"; +import type { GrowthRate } from "#data/exp"; import { Gender } from "#data/gender"; import { AbilityId } from "#enums/ability-id"; import { DexAttr } from "#enums/dex-attr"; import { PartyMemberStrength } from "#enums/party-member-strength"; -import { PokemonType } from "#enums/pokemon-type"; +import type { PokemonType } from "#enums/pokemon-type"; import { SpeciesFormKey } from "#enums/species-form-key"; import { SpeciesId } from "#enums/species-id"; import type { Stat } from "#enums/stat"; @@ -29,7 +28,7 @@ import type { Variant, VariantSet } from "#sprites/variant"; import { populateVariantColorCache, variantColorCache, variantData } from "#sprites/variant"; import type { StarterMoveset } from "#system/game-data"; import type { Localizable } from "#types/locales"; -import { isNullOrUndefined, randSeedFloat, randSeedGauss, randSeedInt, randSeedItem } from "#utils/common"; +import { isNullOrUndefined, randSeedFloat, randSeedGauss, randSeedInt } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import { toCamelCase, toPascalCase } from "#utils/strings"; import { argbFromRgba, QuantizerCelebi, rgbaFromArgb } from "@material/material-color-utilities"; @@ -74,84 +73,6 @@ export const normalForm: SpeciesId[] = [ SpeciesId.CALYREX, ]; -export function getPokemonSpeciesForm(species: SpeciesId, formIndex: number): PokemonSpeciesForm { - const retSpecies: PokemonSpecies = - species >= 2000 - ? allSpecies.find(s => s.speciesId === species)! // TODO: is the bang correct? - : allSpecies[species - 1]; - if (formIndex < retSpecies.forms?.length) { - return retSpecies.forms[formIndex]; - } - return retSpecies; -} - -// TODO: Clean this up and seriously review alternate means of fusion naming -export function getFusedSpeciesName(speciesAName: string, speciesBName: string): string { - const fragAPattern = /([a-z]{2}.*?[aeiou(?:y$)\-']+)(.*?)$/i; - const fragBPattern = /([a-z]{2}.*?[aeiou(?:y$)\-'])(.*?)$/i; - - const [speciesAPrefixMatch, speciesBPrefixMatch] = [speciesAName, speciesBName].map(n => /^(?:[^ ]+) /.exec(n)); - const [speciesAPrefix, speciesBPrefix] = [speciesAPrefixMatch, speciesBPrefixMatch].map(m => (m ? m[0] : "")); - - if (speciesAPrefix) { - speciesAName = speciesAName.slice(speciesAPrefix.length); - } - if (speciesBPrefix) { - speciesBName = speciesBName.slice(speciesBPrefix.length); - } - - const [speciesASuffixMatch, speciesBSuffixMatch] = [speciesAName, speciesBName].map(n => / (?:[^ ]+)$/.exec(n)); - const [speciesASuffix, speciesBSuffix] = [speciesASuffixMatch, speciesBSuffixMatch].map(m => (m ? m[0] : "")); - - if (speciesASuffix) { - speciesAName = speciesAName.slice(0, -speciesASuffix.length); - } - if (speciesBSuffix) { - speciesBName = speciesBName.slice(0, -speciesBSuffix.length); - } - - const splitNameA = speciesAName.split(/ /g); - const splitNameB = speciesBName.split(/ /g); - - const fragAMatch = fragAPattern.exec(speciesAName); - const fragBMatch = fragBPattern.exec(speciesBName); - - let fragA: string; - let fragB: string; - - fragA = splitNameA.length === 1 ? (fragAMatch ? fragAMatch[1] : speciesAName) : splitNameA[splitNameA.length - 1]; - - if (splitNameB.length === 1) { - if (fragBMatch) { - const lastCharA = fragA.slice(fragA.length - 1); - const prevCharB = fragBMatch[1].slice(fragBMatch.length - 1); - fragB = (/[-']/.test(prevCharB) ? prevCharB : "") + fragBMatch[2] || prevCharB; - if (lastCharA === fragB[0]) { - if (/[aiu]/.test(lastCharA)) { - fragB = fragB.slice(1); - } else { - const newCharMatch = new RegExp(`[^${lastCharA}]`).exec(fragB); - if (newCharMatch?.index !== undefined && newCharMatch.index > 0) { - fragB = fragB.slice(newCharMatch.index); - } - } - } - } else { - fragB = speciesBName; - } - } else { - fragB = splitNameB[splitNameB.length - 1]; - } - - if (splitNameA.length > 1) { - fragA = `${splitNameA.slice(0, splitNameA.length - 1).join(" ")} ${fragA}`; - } - - fragB = `${fragB.slice(0, 1).toLowerCase()}${fragB.slice(1)}`; - - return `${speciesAPrefix || speciesBPrefix}${fragA}${fragB}${speciesBSuffix || speciesASuffix}`; -} - export type PokemonSpeciesFilter = (species: PokemonSpecies) => boolean; export abstract class PokemonSpeciesForm { @@ -1400,1804 +1321,3 @@ export class PokemonForm extends PokemonSpeciesForm { return this.formSpriteKey !== null ? this.formSpriteKey : this.formKey; } } - -/** - * Method to get the daily list of starters with Pokerus. - * @returns A list of starters with Pokerus - */ -export function getPokerusStarters(): PokemonSpecies[] { - const pokerusStarters: PokemonSpecies[] = []; - const date = new Date(); - date.setUTCHours(0, 0, 0, 0); - globalScene.executeWithSeedOffset( - () => { - while (pokerusStarters.length < POKERUS_STARTER_COUNT) { - const randomSpeciesId = Number.parseInt(randSeedItem(Object.keys(speciesStarterCosts)), 10); - const species = getPokemonSpecies(randomSpeciesId); - if (!pokerusStarters.includes(species)) { - pokerusStarters.push(species); - } - } - }, - 0, - date.getTime().toString(), - ); - return pokerusStarters; -} - -// biome-ignore format: manually formatted -export function initSpecies() { - allSpecies.push( - new PokemonSpecies(SpeciesId.BULBASAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 6.9, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 318, 45, 49, 49, 65, 65, 45, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.IVYSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 13, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 405, 60, 62, 63, 80, 80, 60, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.VENUSAUR, 1, false, false, false, "Seed Pokémon", PokemonType.GRASS, PokemonType.POISON, 2, 100, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, GrowthRate.MEDIUM_SLOW, 87.5, true, true, - new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.POISON, 2, 100, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CHLOROPHYLL, 525, 80, 82, 83, 100, 100, 80, 45, 50, 263, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.POISON, 2.4, 155.5, AbilityId.THICK_FAT, AbilityId.THICK_FAT, AbilityId.THICK_FAT, 625, 80, 100, 123, 122, 120, 80, 45, 50, 263, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.POISON, 24, 999.9, AbilityId.EFFECT_SPORE, AbilityId.NONE, AbilityId.EFFECT_SPORE, 625, 120, 122, 90, 108, 105, 80, 45, 50, 263, true), - ), - new PokemonSpecies(SpeciesId.CHARMANDER, 1, false, false, false, "Lizard Pokémon", PokemonType.FIRE, null, 0.6, 8.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SOLAR_POWER, 309, 39, 52, 43, 60, 50, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.CHARMELEON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 1.1, 19, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SOLAR_POWER, 405, 58, 64, 58, 80, 65, 80, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.CHARIZARD, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FLYING, 1.7, 90.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.FLYING, 1.7, 90.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SOLAR_POWER, 534, 78, 84, 78, 109, 85, 100, 45, 50, 267, false, null, true), - new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, PokemonType.FIRE, PokemonType.DRAGON, 1.7, 110.5, AbilityId.TOUGH_CLAWS, AbilityId.NONE, AbilityId.TOUGH_CLAWS, 634, 78, 130, 111, 130, 85, 100, 45, 50, 267), - new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.FIRE, PokemonType.FLYING, 1.7, 100.5, AbilityId.DROUGHT, AbilityId.NONE, AbilityId.DROUGHT, 634, 78, 104, 78, 159, 115, 100, 45, 50, 267), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.FLYING, 28, 999.9, AbilityId.BERSERK, AbilityId.NONE, AbilityId.BERSERK, 634, 118, 99, 88, 134, 95, 100, 45, 50, 267), - ), - new PokemonSpecies(SpeciesId.SQUIRTLE, 1, false, false, false, "Tiny Turtle Pokémon", PokemonType.WATER, null, 0.5, 9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.RAIN_DISH, 314, 44, 48, 65, 50, 64, 43, 45, 50, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.WARTORTLE, 1, false, false, false, "Turtle Pokémon", PokemonType.WATER, null, 1, 22.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.RAIN_DISH, 405, 59, 63, 80, 65, 80, 58, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.BLASTOISE, 1, false, false, false, "Shellfish Pokémon", PokemonType.WATER, null, 1.6, 85.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, null, 1.6, 85.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.RAIN_DISH, 530, 79, 83, 100, 85, 105, 78, 45, 50, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, null, 1.6, 101.1, AbilityId.MEGA_LAUNCHER, AbilityId.NONE, AbilityId.MEGA_LAUNCHER, 630, 79, 103, 120, 135, 115, 78, 45, 50, 265), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.STEEL, 25, 999.9, AbilityId.SHELL_ARMOR, AbilityId.NONE, AbilityId.SHELL_ARMOR, 630, 119, 108, 125, 105, 110, 63, 45, 50, 265), - ), - new PokemonSpecies(SpeciesId.CATERPIE, 1, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 2.9, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.RUN_AWAY, 195, 45, 30, 35, 20, 20, 45, 255, 50, 39, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.METAPOD, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 9.9, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.FLYING, 1.1, 32, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.FLYING, 17, 999.9, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.COMPOUND_EYES, 495, 80, 40, 75, 120, 95, 85, 45, 50, 198, true), - ), - new PokemonSpecies(SpeciesId.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", PokemonType.BUG, PokemonType.POISON, 0.3, 3.2, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.KAKUNA, 1, false, false, false, "Cocoon Pokémon", PokemonType.BUG, PokemonType.POISON, 0.6, 10, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BEEDRILL, 1, false, false, false, "Poison Bee Pokémon", PokemonType.BUG, PokemonType.POISON, 1, 29.5, AbilityId.SWARM, AbilityId.NONE, AbilityId.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.POISON, 1, 29.5, AbilityId.SWARM, AbilityId.NONE, AbilityId.SNIPER, 395, 65, 90, 40, 45, 80, 75, 45, 70, 198, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.POISON, 1.4, 40.5, AbilityId.ADAPTABILITY, AbilityId.NONE, AbilityId.ADAPTABILITY, 495, 65, 150, 40, 15, 80, 145, 45, 70, 198), - ), - new PokemonSpecies(SpeciesId.PIDGEY, 1, false, false, false, "Tiny Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.8, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 251, 40, 45, 40, 35, 35, 56, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.PIDGEOTTO, 1, false, false, false, "Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.1, 30, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 349, 63, 60, 55, 50, 50, 71, 120, 70, 122, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.PIDGEOT, 1, false, false, false, "Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 39.5, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 39.5, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 479, 83, 80, 75, 70, 70, 101, 45, 70, 240, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FLYING, 2.2, 50.5, AbilityId.NO_GUARD, AbilityId.NO_GUARD, AbilityId.NO_GUARD, 579, 83, 80, 80, 135, 80, 121, 45, 70, 240), - ), - new PokemonSpecies(SpeciesId.RATTATA, 1, false, false, false, "Mouse Pokémon", PokemonType.NORMAL, null, 0.3, 3.5, AbilityId.RUN_AWAY, AbilityId.GUTS, AbilityId.HUSTLE, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.RATICATE, 1, false, false, false, "Mouse Pokémon", PokemonType.NORMAL, null, 0.7, 18.5, AbilityId.RUN_AWAY, AbilityId.GUTS, AbilityId.HUSTLE, 413, 55, 81, 60, 50, 70, 97, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.SPEAROW, 1, false, false, false, "Tiny Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2, AbilityId.KEEN_EYE, AbilityId.NONE, AbilityId.SNIPER, 262, 40, 60, 30, 31, 31, 70, 255, 70, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FEAROW, 1, false, false, false, "Beak Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 38, AbilityId.KEEN_EYE, AbilityId.NONE, AbilityId.SNIPER, 442, 65, 90, 65, 61, 61, 100, 90, 70, 155, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.EKANS, 1, false, false, false, "Snake Pokémon", PokemonType.POISON, null, 2, 6.9, AbilityId.INTIMIDATE, AbilityId.SHED_SKIN, AbilityId.UNNERVE, 288, 35, 60, 44, 40, 54, 55, 255, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ARBOK, 1, false, false, false, "Cobra Pokémon", PokemonType.POISON, null, 3.5, 65, AbilityId.INTIMIDATE, AbilityId.SHED_SKIN, AbilityId.UNNERVE, 448, 60, 95, 69, 65, 79, 80, 90, 70, 157, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PIKACHU, 1, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 320, 35, 55, 40, 50, 50, 90, 190, 50, 112, true, null, true), - new PokemonForm("Partner", "partner", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), - new PokemonForm("Cosplay", "cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Cool Cosplay", "cool-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Beauty Cosplay", "beauty-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Cute Cosplay", "cute-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Smart Cosplay", "smart-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("Tough Cosplay", "tough-cosplay", PokemonType.ELECTRIC, null, 0.4, 6, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 430, 45, 80, 50, 75, 60, 120, 190, 50, 112, true, null, true), //Custom - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ELECTRIC, null, 21, 999.9, AbilityId.LIGHTNING_ROD, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 530, 125, 95, 60, 90, 70, 90, 190, 50, 112), //+100 BST from Partner Form - ), - new PokemonSpecies(SpeciesId.RAICHU, 1, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.8, 30, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 485, 60, 90, 55, 90, 80, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.SANDSHREW, 1, false, false, false, "Mouse Pokémon", PokemonType.GROUND, null, 0.6, 12, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.SAND_RUSH, 300, 50, 75, 85, 20, 30, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SANDSLASH, 1, false, false, false, "Mouse Pokémon", PokemonType.GROUND, null, 1, 29.5, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.SAND_RUSH, 450, 75, 100, 110, 45, 55, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.NIDORAN_F, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.4, 7, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.HUSTLE, 275, 55, 47, 52, 40, 40, 41, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.NIDORINA, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.8, 20, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.HUSTLE, 365, 70, 62, 67, 55, 55, 56, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.NIDOQUEEN, 1, false, false, false, "Drill Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.3, 60, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.SHEER_FORCE, 505, 90, 92, 87, 75, 85, 76, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.NIDORAN_M, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.5, 9, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.HUSTLE, 273, 46, 57, 40, 40, 40, 50, 235, 50, 55, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(SpeciesId.NIDORINO, 1, false, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.9, 19.5, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.HUSTLE, 365, 61, 72, 57, 55, 55, 65, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(SpeciesId.NIDOKING, 1, false, false, false, "Drill Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.4, 62, AbilityId.POISON_POINT, AbilityId.RIVALRY, AbilityId.SHEER_FORCE, 505, 81, 102, 77, 85, 75, 85, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 100, false), - new PokemonSpecies(SpeciesId.CLEFAIRY, 1, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 0.6, 7.5, AbilityId.CUTE_CHARM, AbilityId.MAGIC_GUARD, AbilityId.FRIEND_GUARD, 323, 70, 45, 48, 60, 65, 35, 150, 140, 113, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.CLEFABLE, 1, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 1.3, 40, AbilityId.CUTE_CHARM, AbilityId.MAGIC_GUARD, AbilityId.UNAWARE, 483, 95, 70, 73, 95, 90, 60, 25, 140, 242, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.VULPIX, 1, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 0.6, 9.9, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.DROUGHT, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(SpeciesId.NINETALES, 1, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 1.1, 19.9, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.DROUGHT, 505, 73, 76, 75, 81, 100, 100, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(SpeciesId.JIGGLYPUFF, 1, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.5, 5.5, AbilityId.CUTE_CHARM, AbilityId.COMPETITIVE, AbilityId.FRIEND_GUARD, 270, 115, 45, 20, 45, 25, 20, 170, 50, 95, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.WIGGLYTUFF, 1, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 1, 12, AbilityId.CUTE_CHARM, AbilityId.COMPETITIVE, AbilityId.FRISK, 435, 140, 70, 45, 85, 50, 45, 50, 50, 218, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.ZUBAT, 1, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 0.8, 7.5, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.INFILTRATOR, 245, 40, 45, 35, 30, 40, 55, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.GOLBAT, 1, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 1.6, 55, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.INFILTRATOR, 455, 75, 80, 70, 65, 75, 90, 90, 50, 159, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.ODDISH, 1, false, false, false, "Weed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.5, 5.4, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.RUN_AWAY, 320, 45, 50, 55, 75, 65, 30, 255, 50, 64, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GLOOM, 1, false, false, false, "Weed Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.8, 8.6, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.STENCH, 395, 60, 65, 70, 85, 75, 40, 120, 50, 138, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.VILEPLUME, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 1.2, 18.6, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.EFFECT_SPORE, 490, 75, 80, 85, 110, 90, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.PARAS, 1, false, false, false, "Mushroom Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.3, 5.4, AbilityId.EFFECT_SPORE, AbilityId.DRY_SKIN, AbilityId.DAMP, 285, 35, 70, 55, 45, 55, 25, 190, 70, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PARASECT, 1, false, false, false, "Mushroom Pokémon", PokemonType.BUG, PokemonType.GRASS, 1, 29.5, AbilityId.EFFECT_SPORE, AbilityId.DRY_SKIN, AbilityId.DAMP, 405, 60, 95, 80, 60, 80, 30, 75, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.VENONAT, 1, false, false, false, "Insect Pokémon", PokemonType.BUG, PokemonType.POISON, 1, 30, AbilityId.COMPOUND_EYES, AbilityId.TINTED_LENS, AbilityId.RUN_AWAY, 305, 60, 55, 50, 40, 55, 45, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.VENOMOTH, 1, false, false, false, "Poison Moth Pokémon", PokemonType.BUG, PokemonType.POISON, 1.5, 12.5, AbilityId.SHIELD_DUST, AbilityId.TINTED_LENS, AbilityId.WONDER_SKIN, 450, 70, 65, 60, 90, 75, 90, 75, 70, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DIGLETT, 1, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.2, 0.8, AbilityId.SAND_VEIL, AbilityId.ARENA_TRAP, AbilityId.SAND_FORCE, 265, 10, 55, 25, 35, 45, 95, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DUGTRIO, 1, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.7, 33.3, AbilityId.SAND_VEIL, AbilityId.ARENA_TRAP, AbilityId.SAND_FORCE, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MEOWTH, 1, false, false, false, "Scratch Cat Pokémon", PokemonType.NORMAL, null, 0.4, 4.2, AbilityId.PICKUP, AbilityId.TECHNICIAN, AbilityId.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.4, 4.2, AbilityId.PICKUP, AbilityId.TECHNICIAN, AbilityId.UNNERVE, 290, 40, 45, 35, 40, 40, 90, 255, 50, 58, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 33, 999.9, AbilityId.TECHNICIAN, AbilityId.TECHNICIAN, AbilityId.TECHNICIAN, 540, 115, 110, 65, 65, 70, 115, 255, 50, 58), //+100 BST from Persian - ), - new PokemonSpecies(SpeciesId.PERSIAN, 1, false, false, false, "Classy Cat Pokémon", PokemonType.NORMAL, null, 1, 32, AbilityId.LIMBER, AbilityId.TECHNICIAN, AbilityId.UNNERVE, 440, 65, 70, 60, 65, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PSYDUCK, 1, false, false, false, "Duck Pokémon", PokemonType.WATER, null, 0.8, 19.6, AbilityId.DAMP, AbilityId.CLOUD_NINE, AbilityId.SWIFT_SWIM, 320, 50, 52, 48, 65, 50, 55, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GOLDUCK, 1, false, false, false, "Duck Pokémon", PokemonType.WATER, null, 1.7, 76.6, AbilityId.DAMP, AbilityId.CLOUD_NINE, AbilityId.SWIFT_SWIM, 500, 80, 82, 78, 95, 80, 85, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MANKEY, 1, false, false, false, "Pig Monkey Pokémon", PokemonType.FIGHTING, null, 0.5, 28, AbilityId.VITAL_SPIRIT, AbilityId.ANGER_POINT, AbilityId.DEFIANT, 305, 40, 80, 35, 35, 45, 70, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PRIMEAPE, 1, false, false, false, "Pig Monkey Pokémon", PokemonType.FIGHTING, null, 1, 32, AbilityId.VITAL_SPIRIT, AbilityId.ANGER_POINT, AbilityId.DEFIANT, 455, 65, 105, 60, 60, 70, 95, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GROWLITHE, 1, false, false, false, "Puppy Pokémon", PokemonType.FIRE, null, 0.7, 19, AbilityId.INTIMIDATE, AbilityId.FLASH_FIRE, AbilityId.JUSTIFIED, 350, 55, 70, 45, 70, 50, 60, 190, 50, 70, GrowthRate.SLOW, 75, false), - new PokemonSpecies(SpeciesId.ARCANINE, 1, false, false, false, "Legendary Pokémon", PokemonType.FIRE, null, 1.9, 155, AbilityId.INTIMIDATE, AbilityId.FLASH_FIRE, AbilityId.JUSTIFIED, 555, 90, 110, 80, 100, 80, 95, 75, 50, 194, GrowthRate.SLOW, 75, false), - new PokemonSpecies(SpeciesId.POLIWAG, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 0.6, 12.4, AbilityId.WATER_ABSORB, AbilityId.DAMP, AbilityId.SWIFT_SWIM, 300, 40, 50, 40, 40, 40, 90, 255, 50, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.POLIWHIRL, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 1, 20, AbilityId.WATER_ABSORB, AbilityId.DAMP, AbilityId.SWIFT_SWIM, 385, 65, 65, 65, 50, 50, 90, 120, 50, 135, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.POLIWRATH, 1, false, false, false, "Tadpole Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.3, 54, AbilityId.WATER_ABSORB, AbilityId.DAMP, AbilityId.SWIFT_SWIM, 510, 90, 95, 95, 70, 90, 70, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.ABRA, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 0.9, 19.5, AbilityId.SYNCHRONIZE, AbilityId.INNER_FOCUS, AbilityId.MAGIC_GUARD, 310, 25, 20, 15, 105, 55, 90, 200, 50, 62, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(SpeciesId.KADABRA, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 1.3, 56.5, AbilityId.SYNCHRONIZE, AbilityId.INNER_FOCUS, AbilityId.MAGIC_GUARD, 400, 40, 35, 30, 120, 70, 105, 100, 50, 140, GrowthRate.MEDIUM_SLOW, 75, true), - new PokemonSpecies(SpeciesId.ALAKAZAM, 1, false, false, false, "Psi Pokémon", PokemonType.PSYCHIC, null, 1.5, 48, AbilityId.SYNCHRONIZE, AbilityId.INNER_FOCUS, AbilityId.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, GrowthRate.MEDIUM_SLOW, 75, true, true, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 1.5, 48, AbilityId.SYNCHRONIZE, AbilityId.INNER_FOCUS, AbilityId.MAGIC_GUARD, 500, 55, 50, 45, 135, 95, 120, 50, 50, 250, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, null, 1.2, 48, AbilityId.TRACE, AbilityId.TRACE, AbilityId.TRACE, 600, 55, 50, 65, 175, 105, 150, 50, 50, 250, true), - ), - new PokemonSpecies(SpeciesId.MACHOP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 0.8, 19.5, AbilityId.GUTS, AbilityId.NO_GUARD, AbilityId.STEADFAST, 305, 70, 80, 50, 35, 35, 35, 180, 50, 61, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(SpeciesId.MACHOKE, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.5, 70.5, AbilityId.GUTS, AbilityId.NO_GUARD, AbilityId.STEADFAST, 405, 80, 100, 70, 50, 60, 45, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(SpeciesId.MACHAMP, 1, false, false, false, "Superpower Pokémon", PokemonType.FIGHTING, null, 1.6, 130, AbilityId.GUTS, AbilityId.NO_GUARD, AbilityId.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false, true, - new PokemonForm("Normal", "", PokemonType.FIGHTING, null, 1.6, 130, AbilityId.GUTS, AbilityId.NO_GUARD, AbilityId.STEADFAST, 505, 90, 130, 80, 65, 85, 55, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIGHTING, null, 25, 999.9, AbilityId.GUTS, AbilityId.GUTS, AbilityId.GUTS, 605, 120, 170, 85, 75, 90, 65, 45, 50, 253), - ), - new PokemonSpecies(SpeciesId.BELLSPROUT, 1, false, false, false, "Flower Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.7, 4, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.GLUTTONY, 300, 50, 75, 35, 70, 30, 40, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.WEEPINBELL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1, 6.4, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.GLUTTONY, 390, 65, 90, 50, 85, 45, 55, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.VICTREEBEL, 1, false, false, false, "Flycatcher Pokémon", PokemonType.GRASS, PokemonType.POISON, 1.7, 15.5, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.GLUTTONY, 490, 80, 105, 65, 100, 70, 70, 45, 70, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.TENTACOOL, 1, false, false, false, "Jellyfish Pokémon", PokemonType.WATER, PokemonType.POISON, 0.9, 45.5, AbilityId.CLEAR_BODY, AbilityId.LIQUID_OOZE, AbilityId.RAIN_DISH, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.TENTACRUEL, 1, false, false, false, "Jellyfish Pokémon", PokemonType.WATER, PokemonType.POISON, 1.6, 55, AbilityId.CLEAR_BODY, AbilityId.LIQUID_OOZE, AbilityId.RAIN_DISH, 515, 80, 70, 65, 80, 120, 100, 60, 50, 180, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.GEODUDE, 1, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.GROUND, 0.4, 20, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SAND_VEIL, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GRAVELER, 1, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1, 105, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SAND_VEIL, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GOLEM, 1, false, false, false, "Megaton Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1.4, 300, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SAND_VEIL, 495, 80, 120, 130, 55, 65, 45, 45, 70, 248, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.PONYTA, 1, false, false, false, "Fire Horse Pokémon", PokemonType.FIRE, null, 1, 30, AbilityId.RUN_AWAY, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.RAPIDASH, 1, false, false, false, "Fire Horse Pokémon", PokemonType.FIRE, null, 1.7, 95, AbilityId.RUN_AWAY, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SLOWPOKE, 1, false, false, false, "Dopey Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.2, 36, AbilityId.OBLIVIOUS, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SLOWBRO, 1, false, false, false, "Hermit Crab Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.6, 78.5, AbilityId.OBLIVIOUS, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.PSYCHIC, 1.6, 78.5, AbilityId.OBLIVIOUS, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 75, 110, 100, 80, 30, 75, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.PSYCHIC, 2, 120, AbilityId.SHELL_ARMOR, AbilityId.SHELL_ARMOR, AbilityId.SHELL_ARMOR, 590, 95, 75, 180, 130, 80, 30, 75, 50, 172), - ), - new PokemonSpecies(SpeciesId.MAGNEMITE, 1, false, false, false, "Magnet Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 0.3, 6, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.ANALYTIC, 325, 25, 35, 70, 95, 55, 45, 190, 50, 65, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.MAGNETON, 1, false, false, false, "Magnet Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 1, 60, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.ANALYTIC, 465, 50, 60, 95, 120, 70, 70, 60, 50, 163, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.FARFETCHD, 1, false, false, false, "Wild Duck Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.8, 15, AbilityId.KEEN_EYE, AbilityId.INNER_FOCUS, AbilityId.DEFIANT, 377, 52, 90, 55, 58, 62, 60, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DODUO, 1, false, false, false, "Twin Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.4, 39.2, AbilityId.RUN_AWAY, AbilityId.EARLY_BIRD, AbilityId.TANGLED_FEET, 310, 35, 85, 45, 35, 35, 75, 190, 70, 62, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.DODRIO, 1, false, false, false, "Triple Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.8, 85.2, AbilityId.RUN_AWAY, AbilityId.EARLY_BIRD, AbilityId.TANGLED_FEET, 470, 60, 110, 70, 60, 60, 110, 45, 70, 165, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.SEEL, 1, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, null, 1.1, 90, AbilityId.THICK_FAT, AbilityId.HYDRATION, AbilityId.ICE_BODY, 325, 65, 45, 55, 45, 70, 45, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DEWGONG, 1, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, PokemonType.ICE, 1.7, 120, AbilityId.THICK_FAT, AbilityId.HYDRATION, AbilityId.ICE_BODY, 475, 90, 70, 80, 70, 95, 70, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GRIMER, 1, false, false, false, "Sludge Pokémon", PokemonType.POISON, null, 0.9, 30, AbilityId.STENCH, AbilityId.STICKY_HOLD, AbilityId.POISON_TOUCH, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MUK, 1, false, false, false, "Sludge Pokémon", PokemonType.POISON, null, 1.2, 30, AbilityId.STENCH, AbilityId.STICKY_HOLD, AbilityId.POISON_TOUCH, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SHELLDER, 1, false, false, false, "Bivalve Pokémon", PokemonType.WATER, null, 0.3, 4, AbilityId.SHELL_ARMOR, AbilityId.SKILL_LINK, AbilityId.OVERCOAT, 305, 30, 65, 100, 45, 25, 40, 190, 50, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.CLOYSTER, 1, false, false, false, "Bivalve Pokémon", PokemonType.WATER, PokemonType.ICE, 1.5, 132.5, AbilityId.SHELL_ARMOR, AbilityId.SKILL_LINK, AbilityId.OVERCOAT, 525, 50, 95, 180, 85, 45, 70, 60, 50, 184, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.GASTLY, 1, false, false, false, "Gas Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.3, 0.1, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 310, 30, 35, 30, 100, 35, 80, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.HAUNTER, 1, false, false, false, "Gas Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.6, 0.1, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 405, 45, 50, 45, 115, 55, 95, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GENGAR, 1, false, false, false, "Shadow Pokémon", PokemonType.GHOST, PokemonType.POISON, 1.5, 40.5, AbilityId.CURSED_BODY, AbilityId.NONE, AbilityId.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.GHOST, PokemonType.POISON, 1.5, 40.5, AbilityId.CURSED_BODY, AbilityId.NONE, AbilityId.NONE, 500, 60, 65, 60, 130, 75, 110, 45, 50, 250, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GHOST, PokemonType.POISON, 1.4, 40.5, AbilityId.SHADOW_TAG, AbilityId.NONE, AbilityId.NONE, 600, 60, 65, 80, 170, 95, 130, 45, 50, 250), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GHOST, PokemonType.POISON, 20, 999.9, AbilityId.CURSED_BODY, AbilityId.NONE, AbilityId.NONE, 600, 140, 65, 70, 140, 85, 100, 45, 50, 250), - ), - new PokemonSpecies(SpeciesId.ONIX, 1, false, false, false, "Rock Snake Pokémon", PokemonType.ROCK, PokemonType.GROUND, 8.8, 210, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.WEAK_ARMOR, 385, 35, 45, 160, 30, 45, 70, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DROWZEE, 1, false, false, false, "Hypnosis Pokémon", PokemonType.PSYCHIC, null, 1, 32.4, AbilityId.INSOMNIA, AbilityId.FOREWARN, AbilityId.INNER_FOCUS, 328, 60, 48, 45, 43, 90, 42, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HYPNO, 1, false, false, false, "Hypnosis Pokémon", PokemonType.PSYCHIC, null, 1.6, 75.6, AbilityId.INSOMNIA, AbilityId.FOREWARN, AbilityId.INNER_FOCUS, 483, 85, 73, 70, 73, 115, 67, 75, 70, 169, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.KRABBY, 1, false, false, false, "River Crab Pokémon", PokemonType.WATER, null, 0.4, 6.5, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.SHEER_FORCE, 325, 30, 105, 90, 25, 25, 50, 225, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.KINGLER, 1, false, false, false, "Pincer Pokémon", PokemonType.WATER, null, 1.3, 60, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, null, 1.3, 60, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.SHEER_FORCE, 475, 55, 130, 115, 50, 50, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 19, 999.9, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, 575, 92, 145, 140, 60, 65, 73, 60, 50, 166), - ), - new PokemonSpecies(SpeciesId.VOLTORB, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 0.5, 10.4, AbilityId.SOUNDPROOF, AbilityId.STATIC, AbilityId.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 70, 66, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.ELECTRODE, 1, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, null, 1.2, 66.6, AbilityId.SOUNDPROOF, AbilityId.STATIC, AbilityId.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.EXEGGCUTE, 1, false, false, false, "Egg Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 0.4, 2.5, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.HARVEST, 325, 60, 40, 80, 60, 45, 40, 90, 50, 65, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.EXEGGUTOR, 1, false, false, false, "Coconut Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 2, 120, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.HARVEST, 530, 95, 95, 85, 125, 75, 55, 45, 50, 186, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.CUBONE, 1, false, false, false, "Lonely Pokémon", PokemonType.GROUND, null, 0.4, 6.5, AbilityId.ROCK_HEAD, AbilityId.LIGHTNING_ROD, AbilityId.BATTLE_ARMOR, 320, 50, 50, 95, 40, 50, 35, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MAROWAK, 1, false, false, false, "Bone Keeper Pokémon", PokemonType.GROUND, null, 1, 45, AbilityId.ROCK_HEAD, AbilityId.LIGHTNING_ROD, AbilityId.BATTLE_ARMOR, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HITMONLEE, 1, false, false, false, "Kicking Pokémon", PokemonType.FIGHTING, null, 1.5, 49.8, AbilityId.LIMBER, AbilityId.RECKLESS, AbilityId.UNBURDEN, 455, 50, 120, 53, 35, 110, 87, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.HITMONCHAN, 1, false, false, false, "Punching Pokémon", PokemonType.FIGHTING, null, 1.4, 50.2, AbilityId.KEEN_EYE, AbilityId.IRON_FIST, AbilityId.INNER_FOCUS, 455, 50, 105, 79, 35, 110, 76, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.LICKITUNG, 1, false, false, false, "Licking Pokémon", PokemonType.NORMAL, null, 1.2, 65.5, AbilityId.OWN_TEMPO, AbilityId.OBLIVIOUS, AbilityId.CLOUD_NINE, 385, 90, 55, 75, 60, 75, 30, 45, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.KOFFING, 1, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, null, 0.6, 1, AbilityId.LEVITATE, AbilityId.NEUTRALIZING_GAS, AbilityId.STENCH, 340, 40, 65, 95, 60, 45, 35, 190, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WEEZING, 1, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, null, 1.2, 9.5, AbilityId.LEVITATE, AbilityId.NEUTRALIZING_GAS, AbilityId.STENCH, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.RHYHORN, 1, false, false, false, "Spikes Pokémon", PokemonType.GROUND, PokemonType.ROCK, 1, 115, AbilityId.LIGHTNING_ROD, AbilityId.ROCK_HEAD, AbilityId.RECKLESS, 345, 80, 85, 95, 30, 30, 25, 120, 50, 69, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.RHYDON, 1, false, false, false, "Drill Pokémon", PokemonType.GROUND, PokemonType.ROCK, 1.9, 120, AbilityId.LIGHTNING_ROD, AbilityId.ROCK_HEAD, AbilityId.RECKLESS, 485, 105, 130, 120, 45, 45, 40, 60, 50, 170, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.CHANSEY, 1, false, false, false, "Egg Pokémon", PokemonType.NORMAL, null, 1.1, 34.6, AbilityId.NATURAL_CURE, AbilityId.SERENE_GRACE, AbilityId.HEALER, 450, 250, 5, 5, 35, 105, 50, 30, 140, 395, GrowthRate.FAST, 0, false), - new PokemonSpecies(SpeciesId.TANGELA, 1, false, false, false, "Vine Pokémon", PokemonType.GRASS, null, 1, 35, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.REGENERATOR, 435, 65, 55, 115, 100, 40, 60, 45, 50, 87, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.KANGASKHAN, 1, false, false, false, "Parent Pokémon", PokemonType.NORMAL, null, 2.2, 80, AbilityId.EARLY_BIRD, AbilityId.SCRAPPY, AbilityId.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, GrowthRate.MEDIUM_FAST, 0, false, true, - new PokemonForm("Normal", "", PokemonType.NORMAL, null, 2.2, 80, AbilityId.EARLY_BIRD, AbilityId.SCRAPPY, AbilityId.INNER_FOCUS, 490, 105, 95, 80, 40, 80, 90, 45, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, null, 2.2, 100, AbilityId.PARENTAL_BOND, AbilityId.PARENTAL_BOND, AbilityId.PARENTAL_BOND, 590, 105, 125, 100, 60, 100, 100, 45, 50, 172), - ), - new PokemonSpecies(SpeciesId.HORSEA, 1, false, false, false, "Dragon Pokémon", PokemonType.WATER, null, 0.4, 8, AbilityId.SWIFT_SWIM, AbilityId.SNIPER, AbilityId.DAMP, 295, 30, 40, 70, 70, 25, 60, 225, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SEADRA, 1, false, false, false, "Dragon Pokémon", PokemonType.WATER, null, 1.2, 25, AbilityId.POISON_POINT, AbilityId.SNIPER, AbilityId.DAMP, 440, 55, 65, 95, 95, 45, 85, 75, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GOLDEEN, 1, false, false, false, "Goldfish Pokémon", PokemonType.WATER, null, 0.6, 15, AbilityId.SWIFT_SWIM, AbilityId.WATER_VEIL, AbilityId.LIGHTNING_ROD, 320, 45, 67, 60, 35, 50, 63, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.SEAKING, 1, false, false, false, "Goldfish Pokémon", PokemonType.WATER, null, 1.3, 39, AbilityId.SWIFT_SWIM, AbilityId.WATER_VEIL, AbilityId.LIGHTNING_ROD, 450, 80, 92, 65, 65, 80, 68, 60, 50, 158, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.STARYU, 1, false, false, false, "Star Shape Pokémon", PokemonType.WATER, null, 0.8, 34.5, AbilityId.ILLUMINATE, AbilityId.NATURAL_CURE, AbilityId.ANALYTIC, 340, 30, 45, 55, 70, 55, 85, 225, 50, 68, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.STARMIE, 1, false, false, false, "Mysterious Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 1.1, 80, AbilityId.ILLUMINATE, AbilityId.NATURAL_CURE, AbilityId.ANALYTIC, 520, 60, 75, 85, 100, 85, 115, 60, 50, 182, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.MR_MIME, 1, false, false, false, "Barrier Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.3, 54.5, AbilityId.SOUNDPROOF, AbilityId.FILTER, AbilityId.TECHNICIAN, 460, 40, 45, 65, 100, 120, 90, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SCYTHER, 1, false, false, false, "Mantis Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.5, 56, AbilityId.SWARM, AbilityId.TECHNICIAN, AbilityId.STEADFAST, 500, 70, 110, 80, 55, 80, 105, 45, 50, 100, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.JYNX, 1, false, false, false, "Human Shape Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.4, 40.6, AbilityId.OBLIVIOUS, AbilityId.FOREWARN, AbilityId.DRY_SKIN, 455, 65, 50, 35, 115, 95, 95, 45, 50, 159, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(SpeciesId.ELECTABUZZ, 1, false, false, false, "Electric Pokémon", PokemonType.ELECTRIC, null, 1.1, 30, AbilityId.STATIC, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 490, 65, 83, 57, 95, 85, 105, 45, 50, 172, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(SpeciesId.MAGMAR, 1, false, false, false, "Spitfire Pokémon", PokemonType.FIRE, null, 1.3, 44.5, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 495, 65, 95, 57, 100, 85, 93, 45, 50, 173, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(SpeciesId.PINSIR, 1, false, false, false, "Stag Beetle Pokémon", PokemonType.BUG, null, 1.5, 55, AbilityId.HYPER_CUTTER, AbilityId.MOLD_BREAKER, AbilityId.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.BUG, null, 1.5, 55, AbilityId.HYPER_CUTTER, AbilityId.MOLD_BREAKER, AbilityId.MOXIE, 500, 65, 125, 100, 55, 70, 85, 45, 50, 175, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.FLYING, 1.7, 59, AbilityId.AERILATE, AbilityId.AERILATE, AbilityId.AERILATE, 600, 65, 155, 120, 65, 90, 105, 45, 50, 175), - ), - new PokemonSpecies(SpeciesId.TAUROS, 1, false, false, false, "Wild Bull Pokémon", PokemonType.NORMAL, null, 1.4, 88.4, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.SHEER_FORCE, 490, 75, 100, 95, 40, 70, 110, 45, 50, 172, GrowthRate.SLOW, 100, false), - new PokemonSpecies(SpeciesId.MAGIKARP, 1, false, false, false, "Fish Pokémon", PokemonType.WATER, null, 0.9, 10, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.RATTLED, 200, 20, 10, 55, 15, 20, 80, 255, 50, 40, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.GYARADOS, 1, false, false, false, "Atrocious Pokémon", PokemonType.WATER, PokemonType.FLYING, 6.5, 235, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.FLYING, 6.5, 235, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.MOXIE, 540, 95, 125, 79, 60, 100, 81, 45, 50, 189, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.DARK, 6.5, 305, AbilityId.MOLD_BREAKER, AbilityId.MOLD_BREAKER, AbilityId.MOLD_BREAKER, 640, 95, 155, 109, 70, 130, 81, 45, 50, 189, true), - ), - new PokemonSpecies(SpeciesId.LAPRAS, 1, false, false, false, "Transport Pokémon", PokemonType.WATER, PokemonType.ICE, 2.5, 220, AbilityId.WATER_ABSORB, AbilityId.SHELL_ARMOR, AbilityId.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ICE, 2.5, 220, AbilityId.WATER_ABSORB, AbilityId.SHELL_ARMOR, AbilityId.HYDRATION, 535, 130, 85, 80, 85, 95, 60, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ICE, 24, 999.9, AbilityId.SHIELD_DUST, AbilityId.SHIELD_DUST, AbilityId.SHIELD_DUST, 635, 170, 97, 85, 107, 111, 65, 45, 50, 187), - ), - new PokemonSpecies(SpeciesId.DITTO, 1, false, false, false, "Transform Pokémon", PokemonType.NORMAL, null, 0.3, 4, AbilityId.LIMBER, AbilityId.NONE, AbilityId.IMPOSTER, 288, 48, 48, 48, 48, 48, 48, 35, 50, 101, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.EEVEE, 1, false, false, false, "Evolution Pokémon", PokemonType.NORMAL, null, 0.3, 6.5, AbilityId.RUN_AWAY, AbilityId.ADAPTABILITY, AbilityId.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, GrowthRate.MEDIUM_FAST, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.NORMAL, null, 0.3, 6.5, AbilityId.RUN_AWAY, AbilityId.ADAPTABILITY, AbilityId.ANTICIPATION, 325, 55, 55, 50, 45, 65, 55, 45, 50, 65, false, null, true), - new PokemonForm("Partner", "partner", PokemonType.NORMAL, null, 0.3, 6.5, AbilityId.RUN_AWAY, AbilityId.ADAPTABILITY, AbilityId.ANTICIPATION, 435, 65, 75, 70, 65, 85, 75, 45, 50, 65, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 18, 999.9, AbilityId.PROTEAN, AbilityId.PROTEAN, AbilityId.PROTEAN, 535, 110, 95, 70, 90, 85, 85, 45, 50, 65), //+100 BST from Partner Form - ), - new PokemonSpecies(SpeciesId.VAPOREON, 1, false, false, false, "Bubble Jet Pokémon", PokemonType.WATER, null, 1, 29, AbilityId.WATER_ABSORB, AbilityId.NONE, AbilityId.HYDRATION, 525, 130, 65, 60, 110, 95, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.JOLTEON, 1, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.8, 24.5, AbilityId.VOLT_ABSORB, AbilityId.NONE, AbilityId.QUICK_FEET, 525, 65, 65, 60, 110, 95, 130, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.FLAREON, 1, false, false, false, "Flame Pokémon", PokemonType.FIRE, null, 0.9, 25, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.GUTS, 525, 65, 130, 60, 95, 110, 65, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.PORYGON, 1, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.8, 36.5, AbilityId.TRACE, AbilityId.DOWNLOAD, AbilityId.ANALYTIC, 395, 65, 60, 70, 85, 75, 40, 45, 50, 79, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.OMANYTE, 1, false, false, false, "Spiral Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.4, 7.5, AbilityId.SWIFT_SWIM, AbilityId.SHELL_ARMOR, AbilityId.WEAK_ARMOR, 355, 35, 40, 100, 90, 55, 35, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.OMASTAR, 1, false, false, false, "Spiral Pokémon", PokemonType.ROCK, PokemonType.WATER, 1, 35, AbilityId.SWIFT_SWIM, AbilityId.SHELL_ARMOR, AbilityId.WEAK_ARMOR, 495, 70, 60, 125, 115, 70, 55, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.KABUTO, 1, false, false, false, "Shellfish Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.5, 11.5, AbilityId.SWIFT_SWIM, AbilityId.BATTLE_ARMOR, AbilityId.WEAK_ARMOR, 355, 30, 80, 90, 55, 45, 55, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.KABUTOPS, 1, false, false, false, "Shellfish Pokémon", PokemonType.ROCK, PokemonType.WATER, 1.3, 40.5, AbilityId.SWIFT_SWIM, AbilityId.BATTLE_ARMOR, AbilityId.WEAK_ARMOR, 495, 60, 115, 105, 65, 70, 80, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.AERODACTYL, 1, false, false, false, "Fossil Pokémon", PokemonType.ROCK, PokemonType.FLYING, 1.8, 59, AbilityId.ROCK_HEAD, AbilityId.PRESSURE, AbilityId.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FLYING, 1.8, 59, AbilityId.ROCK_HEAD, AbilityId.PRESSURE, AbilityId.UNNERVE, 515, 80, 105, 65, 60, 75, 130, 45, 50, 180, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.FLYING, 2.1, 79, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, 615, 80, 135, 85, 70, 95, 150, 45, 50, 180), - ), - new PokemonSpecies(SpeciesId.SNORLAX, 1, false, false, false, "Sleeping Pokémon", PokemonType.NORMAL, null, 2.1, 460, AbilityId.IMMUNITY, AbilityId.THICK_FAT, AbilityId.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.NORMAL, null, 2.1, 460, AbilityId.IMMUNITY, AbilityId.THICK_FAT, AbilityId.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.NORMAL, null, 35, 999.9, AbilityId.HARVEST, AbilityId.HARVEST, AbilityId.HARVEST, 640, 210, 135, 70, 90, 115, 20, 25, 50, 189), - ), - new PokemonSpecies(SpeciesId.ARTICUNO, 1, true, false, false, "Freeze Pokémon", PokemonType.ICE, PokemonType.FLYING, 1.7, 55.4, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ZAPDOS, 1, true, false, false, "Electric Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.6, 52.6, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.MOLTRES, 1, true, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FLYING, 2, 60, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.FLAME_BODY, 580, 90, 100, 90, 125, 85, 90, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.DRATINI, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 1.8, 3.3, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.MARVEL_SCALE, 300, 41, 64, 45, 50, 50, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.DRAGONAIR, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 4, 16.5, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.MARVEL_SCALE, 420, 61, 84, 65, 70, 70, 70, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.DRAGONITE, 1, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 2.2, 210, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.MULTISCALE, 600, 91, 134, 95, 100, 100, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.MEWTWO, 1, false, true, false, "Genetic Pokémon", PokemonType.PSYCHIC, null, 2, 122, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 2, 122, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.UNNERVE, 680, 106, 110, 90, 154, 90, 130, 3, 0, 340, false, null, true), - new PokemonForm("Mega X", SpeciesFormKey.MEGA_X, PokemonType.PSYCHIC, PokemonType.FIGHTING, 2.3, 127, AbilityId.STEADFAST, AbilityId.NONE, AbilityId.STEADFAST, 780, 106, 190, 100, 154, 100, 130, 3, 0, 340), - new PokemonForm("Mega Y", SpeciesFormKey.MEGA_Y, PokemonType.PSYCHIC, null, 1.5, 33, AbilityId.INSOMNIA, AbilityId.NONE, AbilityId.INSOMNIA, 780, 106, 150, 70, 194, 120, 140, 3, 0, 340), - ), - new PokemonSpecies(SpeciesId.MEW, 1, false, false, true, "New Species Pokémon", PokemonType.PSYCHIC, null, 0.4, 4, AbilityId.SYNCHRONIZE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(SpeciesId.CHIKORITA, 2, false, false, false, "Leaf Pokémon", PokemonType.GRASS, null, 0.9, 6.4, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LEAF_GUARD, 318, 45, 49, 65, 49, 65, 45, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.BAYLEEF, 2, false, false, false, "Leaf Pokémon", PokemonType.GRASS, null, 1.2, 15.8, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LEAF_GUARD, 405, 60, 62, 80, 63, 80, 60, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.MEGANIUM, 2, false, false, false, "Herb Pokémon", PokemonType.GRASS, null, 1.8, 100.5, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LEAF_GUARD, 525, 80, 82, 100, 83, 100, 80, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(SpeciesId.CYNDAQUIL, 2, false, false, false, "Fire Mouse Pokémon", PokemonType.FIRE, null, 0.5, 7.9, AbilityId.BLAZE, AbilityId.NONE, AbilityId.FLASH_FIRE, 309, 39, 52, 43, 60, 50, 65, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.QUILAVA, 2, false, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 0.9, 19, AbilityId.BLAZE, AbilityId.NONE, AbilityId.FLASH_FIRE, 405, 58, 64, 58, 80, 65, 80, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.TYPHLOSION, 2, false, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 1.7, 79.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.FLASH_FIRE, 534, 78, 84, 78, 109, 85, 100, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.TOTODILE, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 0.6, 9.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHEER_FORCE, 314, 50, 65, 64, 44, 48, 43, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.CROCONAW, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 1.1, 25, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHEER_FORCE, 405, 65, 80, 80, 59, 63, 58, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.FERALIGATR, 2, false, false, false, "Big Jaw Pokémon", PokemonType.WATER, null, 2.3, 88.8, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHEER_FORCE, 530, 85, 105, 100, 79, 83, 78, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.SENTRET, 2, false, false, false, "Scout Pokémon", PokemonType.NORMAL, null, 0.8, 6, AbilityId.RUN_AWAY, AbilityId.KEEN_EYE, AbilityId.FRISK, 215, 35, 46, 34, 35, 45, 20, 255, 70, 43, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FURRET, 2, false, false, false, "Long Body Pokémon", PokemonType.NORMAL, null, 1.8, 32.5, AbilityId.RUN_AWAY, AbilityId.KEEN_EYE, AbilityId.FRISK, 415, 85, 76, 64, 45, 55, 90, 90, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HOOTHOOT, 2, false, false, false, "Owl Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.7, 21.2, AbilityId.INSOMNIA, AbilityId.KEEN_EYE, AbilityId.TINTED_LENS, 262, 60, 30, 30, 36, 56, 50, 255, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.NOCTOWL, 2, false, false, false, "Owl Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.6, 40.8, AbilityId.INSOMNIA, AbilityId.KEEN_EYE, AbilityId.TINTED_LENS, 452, 100, 50, 50, 86, 96, 70, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LEDYBA, 2, false, false, false, "Five Star Pokémon", PokemonType.BUG, PokemonType.FLYING, 1, 10.8, AbilityId.SWARM, AbilityId.EARLY_BIRD, AbilityId.RATTLED, 265, 40, 20, 30, 40, 80, 55, 255, 70, 53, GrowthRate.FAST, 50, true), - new PokemonSpecies(SpeciesId.LEDIAN, 2, false, false, false, "Five Star Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.4, 35.6, AbilityId.SWARM, AbilityId.EARLY_BIRD, AbilityId.IRON_FIST, 390, 55, 35, 50, 55, 110, 85, 90, 70, 137, GrowthRate.FAST, 50, true), - new PokemonSpecies(SpeciesId.SPINARAK, 2, false, false, false, "String Spit Pokémon", PokemonType.BUG, PokemonType.POISON, 0.5, 8.5, AbilityId.SWARM, AbilityId.INSOMNIA, AbilityId.SNIPER, 250, 40, 60, 40, 40, 40, 30, 255, 70, 50, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.ARIADOS, 2, false, false, false, "Long Leg Pokémon", PokemonType.BUG, PokemonType.POISON, 1.1, 33.5, AbilityId.SWARM, AbilityId.INSOMNIA, AbilityId.SNIPER, 400, 70, 90, 70, 60, 70, 40, 90, 70, 140, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.CROBAT, 2, false, false, false, "Bat Pokémon", PokemonType.POISON, PokemonType.FLYING, 1.8, 75, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.INFILTRATOR, 535, 85, 90, 80, 70, 80, 130, 90, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CHINCHOU, 2, false, false, false, "Angler Pokémon", PokemonType.WATER, PokemonType.ELECTRIC, 0.5, 12, AbilityId.VOLT_ABSORB, AbilityId.ILLUMINATE, AbilityId.WATER_ABSORB, 330, 75, 38, 38, 56, 56, 67, 190, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.LANTURN, 2, false, false, false, "Light Pokémon", PokemonType.WATER, PokemonType.ELECTRIC, 1.2, 22.5, AbilityId.VOLT_ABSORB, AbilityId.ILLUMINATE, AbilityId.WATER_ABSORB, 460, 125, 58, 58, 76, 76, 67, 75, 50, 161, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.PICHU, 2, false, false, false, "Tiny Mouse Pokémon", PokemonType.ELECTRIC, null, 0.3, 2, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.4, 2, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), - new PokemonForm("Spiky-Eared", "spiky", PokemonType.ELECTRIC, null, 1.4, 2, AbilityId.STATIC, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 205, 20, 40, 15, 35, 35, 60, 190, 70, 41, false, null, true), - ), - new PokemonSpecies(SpeciesId.CLEFFA, 2, false, false, false, "Star Shape Pokémon", PokemonType.FAIRY, null, 0.3, 3, AbilityId.CUTE_CHARM, AbilityId.MAGIC_GUARD, AbilityId.FRIEND_GUARD, 218, 50, 25, 28, 45, 55, 15, 150, 140, 44, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.IGGLYBUFF, 2, false, false, false, "Balloon Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.3, 1, AbilityId.CUTE_CHARM, AbilityId.COMPETITIVE, AbilityId.FRIEND_GUARD, 210, 90, 30, 15, 40, 20, 15, 170, 50, 42, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.TOGEPI, 2, false, false, false, "Spike Ball Pokémon", PokemonType.FAIRY, null, 0.3, 1.5, AbilityId.HUSTLE, AbilityId.SERENE_GRACE, AbilityId.SUPER_LUCK, 245, 35, 20, 65, 40, 65, 20, 190, 50, 49, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(SpeciesId.TOGETIC, 2, false, false, false, "Happiness Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 0.6, 3.2, AbilityId.HUSTLE, AbilityId.SERENE_GRACE, AbilityId.SUPER_LUCK, 405, 55, 40, 85, 80, 105, 40, 75, 50, 142, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(SpeciesId.NATU, 2, false, false, false, "Tiny Bird Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.2, 2, AbilityId.SYNCHRONIZE, AbilityId.EARLY_BIRD, AbilityId.MAGIC_BOUNCE, 320, 40, 50, 45, 70, 45, 70, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.XATU, 2, false, false, false, "Mystic Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.5, 15, AbilityId.SYNCHRONIZE, AbilityId.EARLY_BIRD, AbilityId.MAGIC_BOUNCE, 470, 65, 75, 70, 95, 70, 95, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.MAREEP, 2, false, false, false, "Wool Pokémon", PokemonType.ELECTRIC, null, 0.6, 7.8, AbilityId.STATIC, AbilityId.NONE, AbilityId.PLUS, 280, 55, 40, 40, 65, 45, 35, 235, 70, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.FLAAFFY, 2, false, false, false, "Wool Pokémon", PokemonType.ELECTRIC, null, 0.8, 13.3, AbilityId.STATIC, AbilityId.NONE, AbilityId.PLUS, 365, 70, 55, 55, 80, 60, 45, 120, 70, 128, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.AMPHAROS, 2, false, false, false, "Light Pokémon", PokemonType.ELECTRIC, null, 1.4, 61.5, AbilityId.STATIC, AbilityId.NONE, AbilityId.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.4, 61.5, AbilityId.STATIC, AbilityId.NONE, AbilityId.PLUS, 510, 90, 75, 85, 115, 90, 55, 45, 70, 255, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ELECTRIC, PokemonType.DRAGON, 1.4, 61.5, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.MOLD_BREAKER, 610, 90, 95, 105, 165, 110, 45, 45, 70, 255), - ), - new PokemonSpecies(SpeciesId.BELLOSSOM, 2, false, false, false, "Flower Pokémon", PokemonType.GRASS, null, 0.4, 5.8, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.HEALER, 490, 75, 80, 95, 90, 100, 50, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.MARILL, 2, false, false, false, "Aqua Mouse Pokémon", PokemonType.WATER, PokemonType.FAIRY, 0.4, 8.5, AbilityId.THICK_FAT, AbilityId.HUGE_POWER, AbilityId.SAP_SIPPER, 250, 70, 20, 50, 20, 50, 40, 190, 50, 88, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.AZUMARILL, 2, false, false, false, "Aqua Rabbit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 0.8, 28.5, AbilityId.THICK_FAT, AbilityId.HUGE_POWER, AbilityId.SAP_SIPPER, 420, 100, 50, 80, 60, 80, 50, 75, 50, 210, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.SUDOWOODO, 2, false, false, false, "Imitation Pokémon", PokemonType.ROCK, null, 1.2, 38, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.RATTLED, 410, 70, 100, 115, 30, 65, 30, 65, 50, 144, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.POLITOED, 2, false, false, false, "Frog Pokémon", PokemonType.WATER, null, 1.1, 33.9, AbilityId.WATER_ABSORB, AbilityId.DAMP, AbilityId.DRIZZLE, 500, 90, 75, 75, 90, 100, 70, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.HOPPIP, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.4, 0.5, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.INFILTRATOR, 250, 35, 35, 40, 35, 55, 50, 255, 70, 50, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SKIPLOOM, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.6, 1, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.INFILTRATOR, 340, 55, 45, 50, 45, 65, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.JUMPLUFF, 2, false, false, false, "Cottonweed Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.8, 3, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.INFILTRATOR, 460, 75, 55, 70, 55, 95, 110, 45, 70, 230, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.AIPOM, 2, false, false, false, "Long Tail Pokémon", PokemonType.NORMAL, null, 0.8, 11.5, AbilityId.RUN_AWAY, AbilityId.PICKUP, AbilityId.SKILL_LINK, 360, 55, 70, 55, 40, 55, 85, 45, 70, 72, GrowthRate.FAST, 50, true), - new PokemonSpecies(SpeciesId.SUNKERN, 2, false, false, false, "Seed Pokémon", PokemonType.GRASS, null, 0.3, 1.8, AbilityId.CHLOROPHYLL, AbilityId.SOLAR_POWER, AbilityId.EARLY_BIRD, 180, 30, 30, 30, 30, 30, 30, 235, 70, 36, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SUNFLORA, 2, false, false, false, "Sun Pokémon", PokemonType.GRASS, null, 0.8, 8.5, AbilityId.CHLOROPHYLL, AbilityId.SOLAR_POWER, AbilityId.EARLY_BIRD, 425, 75, 75, 55, 105, 85, 30, 120, 70, 149, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.YANMA, 2, false, false, false, "Clear Wing Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 38, AbilityId.SPEED_BOOST, AbilityId.COMPOUND_EYES, AbilityId.FRISK, 390, 65, 65, 45, 75, 45, 95, 75, 70, 78, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WOOPER, 2, false, false, false, "Water Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.4, 8.5, AbilityId.DAMP, AbilityId.WATER_ABSORB, AbilityId.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.QUAGSIRE, 2, false, false, false, "Water Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.4, 75, AbilityId.DAMP, AbilityId.WATER_ABSORB, AbilityId.UNAWARE, 430, 95, 85, 85, 65, 65, 35, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.ESPEON, 2, false, false, false, "Sun Pokémon", PokemonType.PSYCHIC, null, 0.9, 26.5, AbilityId.SYNCHRONIZE, AbilityId.NONE, AbilityId.MAGIC_BOUNCE, 525, 65, 65, 60, 130, 95, 110, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.UMBREON, 2, false, false, false, "Moonlight Pokémon", PokemonType.DARK, null, 1, 27, AbilityId.SYNCHRONIZE, AbilityId.NONE, AbilityId.INNER_FOCUS, 525, 95, 65, 110, 60, 130, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.MURKROW, 2, false, false, false, "Darkness Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.5, 2.1, AbilityId.INSOMNIA, AbilityId.SUPER_LUCK, AbilityId.PRANKSTER, 405, 60, 85, 42, 85, 42, 91, 30, 35, 81, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.SLOWKING, 2, false, false, false, "Royal Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 2, 79.5, AbilityId.OBLIVIOUS, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 75, 80, 100, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MISDREAVUS, 2, false, false, false, "Screech Pokémon", PokemonType.GHOST, null, 0.7, 1, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 435, 60, 60, 60, 85, 85, 85, 45, 35, 87, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.UNOWN, 2, false, false, false, "Symbol Pokémon", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("A", "a", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("B", "b", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("C", "c", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("D", "d", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("E", "e", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("F", "f", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("G", "g", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("H", "h", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("I", "i", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("J", "j", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("K", "k", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("L", "l", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("M", "m", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("N", "n", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("O", "o", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("P", "p", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Q", "q", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("R", "r", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("S", "s", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("T", "t", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("U", "u", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("V", "v", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("W", "w", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("X", "x", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Y", "y", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("Z", "z", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("!", "exclamation", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - new PokemonForm("?", "question", PokemonType.PSYCHIC, null, 0.5, 5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 336, 48, 72, 48, 72, 48, 48, 225, 70, 118, false, null, true), - ), - new PokemonSpecies(SpeciesId.WOBBUFFET, 2, false, false, false, "Patient Pokémon", PokemonType.PSYCHIC, null, 1.3, 28.5, AbilityId.SHADOW_TAG, AbilityId.NONE, AbilityId.TELEPATHY, 405, 190, 33, 58, 33, 58, 33, 45, 50, 142, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.GIRAFARIG, 2, false, false, false, "Long Neck Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.5, 41.5, AbilityId.INNER_FOCUS, AbilityId.EARLY_BIRD, AbilityId.SAP_SIPPER, 455, 70, 80, 65, 90, 65, 85, 60, 70, 159, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.PINECO, 2, false, false, false, "Bagworm Pokémon", PokemonType.BUG, null, 0.6, 7.2, AbilityId.STURDY, AbilityId.NONE, AbilityId.OVERCOAT, 290, 50, 65, 90, 35, 35, 15, 190, 70, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FORRETRESS, 2, false, false, false, "Bagworm Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.2, 125.8, AbilityId.STURDY, AbilityId.NONE, AbilityId.OVERCOAT, 465, 75, 90, 140, 60, 60, 40, 75, 70, 163, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DUNSPARCE, 2, false, false, false, "Land Snake Pokémon", PokemonType.NORMAL, null, 1.5, 14, AbilityId.SERENE_GRACE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 415, 100, 70, 70, 65, 65, 45, 190, 50, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GLIGAR, 2, false, false, false, "Fly Scorpion Pokémon", PokemonType.GROUND, PokemonType.FLYING, 1.1, 64.8, AbilityId.HYPER_CUTTER, AbilityId.SAND_VEIL, AbilityId.IMMUNITY, 430, 65, 75, 105, 35, 65, 85, 60, 70, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.STEELIX, 2, false, false, false, "Iron Snake Pokémon", PokemonType.STEEL, PokemonType.GROUND, 9.2, 400, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.GROUND, 9.2, 400, AbilityId.ROCK_HEAD, AbilityId.STURDY, AbilityId.SHEER_FORCE, 510, 75, 85, 200, 55, 65, 30, 25, 50, 179, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.GROUND, 10.5, 740, AbilityId.SAND_FORCE, AbilityId.SAND_FORCE, AbilityId.SAND_FORCE, 610, 75, 125, 230, 55, 95, 30, 25, 50, 179, true), - ), - new PokemonSpecies(SpeciesId.SNUBBULL, 2, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 0.6, 7.8, AbilityId.INTIMIDATE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 300, 60, 80, 50, 40, 40, 30, 190, 70, 60, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.GRANBULL, 2, false, false, false, "Fairy Pokémon", PokemonType.FAIRY, null, 1.4, 48.7, AbilityId.INTIMIDATE, AbilityId.QUICK_FEET, AbilityId.RATTLED, 450, 90, 120, 75, 60, 60, 45, 75, 70, 158, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.QWILFISH, 2, false, false, false, "Balloon Pokémon", PokemonType.WATER, PokemonType.POISON, 0.5, 3.9, AbilityId.POISON_POINT, AbilityId.SWIFT_SWIM, AbilityId.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SCIZOR, 2, false, false, false, "Pincer Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.8, 118, AbilityId.SWARM, AbilityId.TECHNICIAN, AbilityId.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.STEEL, 1.8, 118, AbilityId.SWARM, AbilityId.TECHNICIAN, AbilityId.LIGHT_METAL, 500, 70, 130, 100, 55, 80, 65, 25, 50, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.STEEL, 2, 125, AbilityId.TECHNICIAN, AbilityId.TECHNICIAN, AbilityId.TECHNICIAN, 600, 70, 150, 140, 65, 100, 75, 25, 50, 175, true), - ), - new PokemonSpecies(SpeciesId.SHUCKLE, 2, false, false, false, "Mold Pokémon", PokemonType.BUG, PokemonType.ROCK, 0.6, 20.5, AbilityId.STURDY, AbilityId.GLUTTONY, AbilityId.CONTRARY, 505, 20, 10, 230, 10, 230, 5, 190, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.HERACROSS, 2, false, false, false, "Single Horn Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.5, 54, AbilityId.SWARM, AbilityId.GUTS, AbilityId.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.FIGHTING, 1.5, 54, AbilityId.SWARM, AbilityId.GUTS, AbilityId.MOXIE, 500, 80, 125, 75, 40, 95, 85, 45, 50, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.BUG, PokemonType.FIGHTING, 1.7, 62.5, AbilityId.SKILL_LINK, AbilityId.SKILL_LINK, AbilityId.SKILL_LINK, 600, 80, 185, 115, 40, 105, 75, 45, 50, 175, true), - ), - new PokemonSpecies(SpeciesId.SNEASEL, 2, false, false, false, "Sharp Claw Pokémon", PokemonType.DARK, PokemonType.ICE, 0.9, 28, AbilityId.INNER_FOCUS, AbilityId.KEEN_EYE, AbilityId.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.TEDDIURSA, 2, false, false, false, "Little Bear Pokémon", PokemonType.NORMAL, null, 0.6, 8.8, AbilityId.PICKUP, AbilityId.QUICK_FEET, AbilityId.HONEY_GATHER, 330, 60, 80, 50, 50, 50, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.URSARING, 2, false, false, false, "Hibernator Pokémon", PokemonType.NORMAL, null, 1.8, 125.8, AbilityId.GUTS, AbilityId.QUICK_FEET, AbilityId.UNNERVE, 500, 90, 130, 75, 75, 75, 55, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.SLUGMA, 2, false, false, false, "Lava Pokémon", PokemonType.FIRE, null, 0.7, 35, AbilityId.MAGMA_ARMOR, AbilityId.FLAME_BODY, AbilityId.WEAK_ARMOR, 250, 40, 40, 40, 70, 40, 20, 190, 70, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MAGCARGO, 2, false, false, false, "Lava Pokémon", PokemonType.FIRE, PokemonType.ROCK, 0.8, 55, AbilityId.MAGMA_ARMOR, AbilityId.FLAME_BODY, AbilityId.WEAK_ARMOR, 430, 60, 50, 120, 90, 80, 30, 75, 70, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SWINUB, 2, false, false, false, "Pig Pokémon", PokemonType.ICE, PokemonType.GROUND, 0.4, 6.5, AbilityId.OBLIVIOUS, AbilityId.SNOW_CLOAK, AbilityId.THICK_FAT, 250, 50, 50, 40, 30, 30, 50, 225, 50, 50, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.PILOSWINE, 2, false, false, false, "Swine Pokémon", PokemonType.ICE, PokemonType.GROUND, 1.1, 55.8, AbilityId.OBLIVIOUS, AbilityId.SNOW_CLOAK, AbilityId.THICK_FAT, 450, 100, 100, 80, 60, 60, 50, 75, 50, 158, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.CORSOLA, 2, false, false, false, "Coral Pokémon", PokemonType.WATER, PokemonType.ROCK, 0.6, 5, AbilityId.HUSTLE, AbilityId.NATURAL_CURE, AbilityId.REGENERATOR, 410, 65, 55, 95, 65, 95, 35, 60, 50, 144, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.REMORAID, 2, false, false, false, "Jet Pokémon", PokemonType.WATER, null, 0.6, 12, AbilityId.HUSTLE, AbilityId.SNIPER, AbilityId.MOODY, 300, 35, 65, 35, 65, 35, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.OCTILLERY, 2, false, false, false, "Jet Pokémon", PokemonType.WATER, null, 0.9, 28.5, AbilityId.SUCTION_CUPS, AbilityId.SNIPER, AbilityId.MOODY, 480, 75, 105, 75, 105, 75, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.DELIBIRD, 2, false, false, false, "Delivery Pokémon", PokemonType.ICE, PokemonType.FLYING, 0.9, 16, AbilityId.VITAL_SPIRIT, AbilityId.HUSTLE, AbilityId.INSOMNIA, 330, 45, 55, 45, 65, 45, 75, 45, 50, 116, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.MANTINE, 2, false, false, false, "Kite Pokémon", PokemonType.WATER, PokemonType.FLYING, 2.1, 220, AbilityId.SWIFT_SWIM, AbilityId.WATER_ABSORB, AbilityId.WATER_VEIL, 485, 85, 40, 70, 80, 140, 70, 25, 50, 170, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.SKARMORY, 2, false, false, false, "Armor Bird Pokémon", PokemonType.STEEL, PokemonType.FLYING, 1.7, 50.5, AbilityId.KEEN_EYE, AbilityId.STURDY, AbilityId.WEAK_ARMOR, 465, 65, 80, 140, 40, 70, 70, 25, 50, 163, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.HOUNDOUR, 2, false, false, false, "Dark Pokémon", PokemonType.DARK, PokemonType.FIRE, 0.6, 10.8, AbilityId.EARLY_BIRD, AbilityId.FLASH_FIRE, AbilityId.UNNERVE, 330, 45, 60, 30, 80, 50, 65, 120, 35, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.HOUNDOOM, 2, false, false, false, "Dark Pokémon", PokemonType.DARK, PokemonType.FIRE, 1.4, 35, AbilityId.EARLY_BIRD, AbilityId.FLASH_FIRE, AbilityId.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.FIRE, 1.4, 35, AbilityId.EARLY_BIRD, AbilityId.FLASH_FIRE, AbilityId.UNNERVE, 500, 75, 90, 50, 110, 80, 95, 45, 35, 175, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, PokemonType.FIRE, 1.9, 49.5, AbilityId.SOLAR_POWER, AbilityId.SOLAR_POWER, AbilityId.SOLAR_POWER, 600, 75, 90, 90, 140, 90, 115, 45, 35, 175, true), - ), - new PokemonSpecies(SpeciesId.KINGDRA, 2, false, false, false, "Dragon Pokémon", PokemonType.WATER, PokemonType.DRAGON, 1.8, 152, AbilityId.SWIFT_SWIM, AbilityId.SNIPER, AbilityId.DAMP, 540, 75, 95, 95, 95, 95, 85, 45, 50, 270, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PHANPY, 2, false, false, false, "Long Nose Pokémon", PokemonType.GROUND, null, 0.5, 33.5, AbilityId.PICKUP, AbilityId.NONE, AbilityId.SAND_VEIL, 330, 90, 60, 60, 40, 40, 40, 120, 70, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DONPHAN, 2, false, false, false, "Armor Pokémon", PokemonType.GROUND, null, 1.1, 120, AbilityId.STURDY, AbilityId.NONE, AbilityId.SAND_VEIL, 500, 90, 120, 120, 60, 60, 50, 60, 70, 175, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.PORYGON2, 2, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.6, 32.5, AbilityId.TRACE, AbilityId.DOWNLOAD, AbilityId.ANALYTIC, 515, 85, 80, 90, 105, 95, 60, 45, 50, 180, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.STANTLER, 2, false, false, false, "Big Horn Pokémon", PokemonType.NORMAL, null, 1.4, 71.2, AbilityId.INTIMIDATE, AbilityId.FRISK, AbilityId.SAP_SIPPER, 465, 73, 95, 62, 85, 65, 85, 45, 70, 163, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.SMEARGLE, 2, false, false, false, "Painter Pokémon", PokemonType.NORMAL, null, 1.2, 58, AbilityId.OWN_TEMPO, AbilityId.TECHNICIAN, AbilityId.MOODY, 250, 55, 20, 35, 20, 45, 75, 45, 70, 88, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.TYROGUE, 2, false, false, false, "Scuffle Pokémon", PokemonType.FIGHTING, null, 0.7, 21, AbilityId.GUTS, AbilityId.STEADFAST, AbilityId.VITAL_SPIRIT, 210, 35, 35, 35, 35, 35, 35, 75, 50, 42, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.HITMONTOP, 2, false, false, false, "Handstand Pokémon", PokemonType.FIGHTING, null, 1.4, 48, AbilityId.INTIMIDATE, AbilityId.TECHNICIAN, AbilityId.STEADFAST, 455, 50, 95, 95, 35, 110, 70, 45, 50, 159, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.SMOOCHUM, 2, false, false, false, "Kiss Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 0.4, 6, AbilityId.OBLIVIOUS, AbilityId.FOREWARN, AbilityId.HYDRATION, 305, 45, 30, 15, 85, 65, 65, 45, 50, 61, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(SpeciesId.ELEKID, 2, false, false, false, "Electric Pokémon", PokemonType.ELECTRIC, null, 0.6, 23.5, AbilityId.STATIC, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 360, 45, 63, 37, 65, 55, 95, 45, 50, 72, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(SpeciesId.MAGBY, 2, false, false, false, "Live Coal Pokémon", PokemonType.FIRE, null, 0.7, 21.4, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 365, 45, 75, 37, 70, 55, 83, 45, 50, 73, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(SpeciesId.MILTANK, 2, false, false, false, "Milk Cow Pokémon", PokemonType.NORMAL, null, 1.2, 75.5, AbilityId.THICK_FAT, AbilityId.SCRAPPY, AbilityId.SAP_SIPPER, 490, 95, 80, 105, 40, 70, 100, 45, 50, 172, GrowthRate.SLOW, 0, false), - new PokemonSpecies(SpeciesId.BLISSEY, 2, false, false, false, "Happiness Pokémon", PokemonType.NORMAL, null, 1.5, 46.8, AbilityId.NATURAL_CURE, AbilityId.SERENE_GRACE, AbilityId.HEALER, 540, 255, 10, 10, 75, 135, 55, 30, 140, 608, GrowthRate.FAST, 0, false), - new PokemonSpecies(SpeciesId.RAIKOU, 2, true, false, false, "Thunder Pokémon", PokemonType.ELECTRIC, null, 1.9, 178, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.INNER_FOCUS, 580, 90, 85, 75, 115, 100, 115, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ENTEI, 2, true, false, false, "Volcano Pokémon", PokemonType.FIRE, null, 2.1, 198, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.INNER_FOCUS, 580, 115, 115, 85, 90, 75, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SUICUNE, 2, true, false, false, "Aurora Pokémon", PokemonType.WATER, null, 2, 187, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.INNER_FOCUS, 580, 100, 75, 115, 90, 115, 85, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.LARVITAR, 2, false, false, false, "Rock Skin Pokémon", PokemonType.ROCK, PokemonType.GROUND, 0.6, 72, AbilityId.GUTS, AbilityId.NONE, AbilityId.SAND_VEIL, 300, 50, 64, 50, 45, 50, 41, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.PUPITAR, 2, false, false, false, "Hard Shell Pokémon", PokemonType.ROCK, PokemonType.GROUND, 1.2, 152, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 410, 70, 84, 70, 65, 70, 51, 45, 35, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.TYRANITAR, 2, false, false, false, "Armor Pokémon", PokemonType.ROCK, PokemonType.DARK, 2, 202, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.DARK, 2, 202, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.UNNERVE, 600, 100, 134, 110, 95, 100, 61, 45, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.DARK, 2.5, 255, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.SAND_STREAM, 700, 100, 164, 150, 95, 120, 71, 45, 35, 300), - ), - new PokemonSpecies(SpeciesId.LUGIA, 2, false, true, false, "Diving Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 5.2, 216, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.MULTISCALE, 680, 106, 90, 130, 90, 154, 110, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.HO_OH, 2, false, true, false, "Rainbow Pokémon", PokemonType.FIRE, PokemonType.FLYING, 3.8, 199, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.REGENERATOR, 680, 106, 130, 90, 110, 154, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.CELEBI, 2, false, false, true, "Time Travel Pokémon", PokemonType.PSYCHIC, PokemonType.GRASS, 0.6, 5, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(SpeciesId.TREECKO, 3, false, false, false, "Wood Gecko Pokémon", PokemonType.GRASS, null, 0.5, 5, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.UNBURDEN, 310, 40, 45, 35, 65, 55, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.GROVYLE, 3, false, false, false, "Wood Gecko Pokémon", PokemonType.GRASS, null, 0.9, 21.6, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.UNBURDEN, 405, 50, 65, 45, 85, 65, 95, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.SCEPTILE, 3, false, false, false, "Forest Pokémon", PokemonType.GRASS, null, 1.7, 52.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.GRASS, null, 1.7, 52.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.UNBURDEN, 530, 70, 85, 65, 105, 85, 120, 45, 50, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.DRAGON, 1.9, 55.2, AbilityId.LIGHTNING_ROD, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 630, 70, 110, 75, 145, 85, 145, 45, 50, 265), - ), - new PokemonSpecies(SpeciesId.TORCHIC, 3, false, false, false, "Chick Pokémon", PokemonType.FIRE, null, 0.4, 2.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SPEED_BOOST, 310, 45, 60, 40, 70, 50, 45, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(SpeciesId.COMBUSKEN, 3, false, false, false, "Young Fowl Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 0.9, 19.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SPEED_BOOST, 405, 60, 85, 60, 85, 60, 55, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(SpeciesId.BLAZIKEN, 3, false, false, false, "Blaze Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, true, true, - new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, AbilityId.BLAZE, AbilityId.NONE, AbilityId.SPEED_BOOST, 530, 80, 120, 70, 110, 70, 80, 45, 50, 265, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIRE, PokemonType.FIGHTING, 1.9, 52, AbilityId.SPEED_BOOST, AbilityId.NONE, AbilityId.SPEED_BOOST, 630, 80, 160, 80, 130, 80, 100, 45, 50, 265, true), - ), - new PokemonSpecies(SpeciesId.MUDKIP, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, null, 0.4, 7.6, AbilityId.TORRENT, AbilityId.NONE, AbilityId.DAMP, 310, 50, 70, 50, 50, 50, 40, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.MARSHTOMP, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.7, 28, AbilityId.TORRENT, AbilityId.NONE, AbilityId.DAMP, 405, 70, 85, 70, 60, 70, 50, 45, 50, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.SWAMPERT, 3, false, false, false, "Mud Fish Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.5, 81.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.GROUND, 1.5, 81.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.DAMP, 535, 100, 110, 90, 85, 90, 60, 45, 50, 268, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.GROUND, 1.9, 102, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.SWIFT_SWIM, 635, 100, 150, 110, 95, 110, 70, 45, 50, 268), - ), - new PokemonSpecies(SpeciesId.POOCHYENA, 3, false, false, false, "Bite Pokémon", PokemonType.DARK, null, 0.5, 13.6, AbilityId.RUN_AWAY, AbilityId.QUICK_FEET, AbilityId.RATTLED, 220, 35, 55, 35, 30, 30, 35, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MIGHTYENA, 3, false, false, false, "Bite Pokémon", PokemonType.DARK, null, 1, 37, AbilityId.INTIMIDATE, AbilityId.QUICK_FEET, AbilityId.MOXIE, 420, 70, 90, 70, 60, 60, 70, 127, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ZIGZAGOON, 3, false, false, false, "Tiny Raccoon Pokémon", PokemonType.NORMAL, null, 0.4, 17.5, AbilityId.PICKUP, AbilityId.GLUTTONY, AbilityId.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LINOONE, 3, false, false, false, "Rushing Pokémon", PokemonType.NORMAL, null, 0.5, 32.5, AbilityId.PICKUP, AbilityId.GLUTTONY, AbilityId.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WURMPLE, 3, false, false, false, "Worm Pokémon", PokemonType.BUG, null, 0.3, 3.6, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.RUN_AWAY, 195, 45, 45, 35, 20, 30, 20, 255, 70, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SILCOON, 3, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.6, 10, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BEAUTIFLY, 3, false, false, false, "Butterfly Pokémon", PokemonType.BUG, PokemonType.FLYING, 1, 28.4, AbilityId.SWARM, AbilityId.NONE, AbilityId.RIVALRY, 395, 60, 70, 50, 100, 50, 65, 45, 70, 198, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.CASCOON, 3, false, false, false, "Cocoon Pokémon", PokemonType.BUG, null, 0.7, 11.5, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.SHED_SKIN, 205, 50, 35, 55, 25, 25, 15, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DUSTOX, 3, false, false, false, "Poison Moth Pokémon", PokemonType.BUG, PokemonType.POISON, 1.2, 31.6, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.COMPOUND_EYES, 385, 60, 50, 70, 50, 90, 65, 45, 70, 193, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.LOTAD, 3, false, false, false, "Water Weed Pokémon", PokemonType.WATER, PokemonType.GRASS, 0.5, 2.6, AbilityId.SWIFT_SWIM, AbilityId.RAIN_DISH, AbilityId.OWN_TEMPO, 220, 40, 30, 30, 40, 50, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.LOMBRE, 3, false, false, false, "Jolly Pokémon", PokemonType.WATER, PokemonType.GRASS, 1.2, 32.5, AbilityId.SWIFT_SWIM, AbilityId.RAIN_DISH, AbilityId.OWN_TEMPO, 340, 60, 50, 50, 60, 70, 50, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.LUDICOLO, 3, false, false, false, "Carefree Pokémon", PokemonType.WATER, PokemonType.GRASS, 1.5, 55, AbilityId.SWIFT_SWIM, AbilityId.RAIN_DISH, AbilityId.OWN_TEMPO, 480, 80, 70, 70, 90, 100, 70, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.SEEDOT, 3, false, false, false, "Acorn Pokémon", PokemonType.GRASS, null, 0.5, 4, AbilityId.CHLOROPHYLL, AbilityId.EARLY_BIRD, AbilityId.PICKPOCKET, 220, 40, 40, 50, 30, 30, 30, 255, 50, 44, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.NUZLEAF, 3, false, false, false, "Wily Pokémon", PokemonType.GRASS, PokemonType.DARK, 1, 28, AbilityId.CHLOROPHYLL, AbilityId.EARLY_BIRD, AbilityId.PICKPOCKET, 340, 70, 70, 40, 60, 40, 60, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.SHIFTRY, 3, false, false, false, "Wicked Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.3, 59.6, AbilityId.CHLOROPHYLL, AbilityId.WIND_RIDER, AbilityId.PICKPOCKET, 480, 90, 100, 60, 90, 60, 80, 45, 50, 240, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.TAILLOW, 3, false, false, false, "Tiny Swallow Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2.3, AbilityId.GUTS, AbilityId.NONE, AbilityId.SCRAPPY, 270, 40, 55, 30, 30, 30, 85, 200, 70, 54, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SWELLOW, 3, false, false, false, "Swallow Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.7, 19.8, AbilityId.GUTS, AbilityId.NONE, AbilityId.SCRAPPY, 455, 60, 85, 60, 75, 50, 125, 45, 70, 159, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.WINGULL, 3, false, false, false, "Seagull Pokémon", PokemonType.WATER, PokemonType.FLYING, 0.6, 9.5, AbilityId.KEEN_EYE, AbilityId.HYDRATION, AbilityId.RAIN_DISH, 270, 40, 30, 30, 55, 30, 85, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PELIPPER, 3, false, false, false, "Water Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 1.2, 28, AbilityId.KEEN_EYE, AbilityId.DRIZZLE, AbilityId.RAIN_DISH, 440, 60, 50, 100, 95, 70, 65, 45, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.RALTS, 3, false, false, false, "Feeling Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.4, 6.6, AbilityId.SYNCHRONIZE, AbilityId.TRACE, AbilityId.TELEPATHY, 198, 28, 25, 25, 45, 35, 40, 235, 35, 40, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.KIRLIA, 3, false, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.8, 20.2, AbilityId.SYNCHRONIZE, AbilityId.TRACE, AbilityId.TELEPATHY, 278, 38, 35, 35, 65, 55, 50, 120, 35, 97, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.GARDEVOIR, 3, false, false, false, "Embrace Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, AbilityId.SYNCHRONIZE, AbilityId.TRACE, AbilityId.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, AbilityId.SYNCHRONIZE, AbilityId.TRACE, AbilityId.TELEPATHY, 518, 68, 65, 65, 125, 115, 80, 45, 35, 259, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, PokemonType.FAIRY, 1.6, 48.4, AbilityId.PIXILATE, AbilityId.PIXILATE, AbilityId.PIXILATE, 618, 68, 85, 65, 165, 135, 100, 45, 35, 259), - ), - new PokemonSpecies(SpeciesId.SURSKIT, 3, false, false, false, "Pond Skater Pokémon", PokemonType.BUG, PokemonType.WATER, 0.5, 1.7, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.RAIN_DISH, 269, 40, 30, 32, 50, 52, 65, 200, 70, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MASQUERAIN, 3, false, false, false, "Eyeball Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.8, 3.6, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.UNNERVE, 454, 70, 60, 62, 100, 82, 80, 75, 70, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SHROOMISH, 3, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, null, 0.4, 4.5, AbilityId.EFFECT_SPORE, AbilityId.POISON_HEAL, AbilityId.QUICK_FEET, 295, 60, 40, 60, 40, 60, 35, 255, 70, 59, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.BRELOOM, 3, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.2, 39.2, AbilityId.EFFECT_SPORE, AbilityId.POISON_HEAL, AbilityId.TECHNICIAN, 460, 60, 130, 80, 60, 60, 70, 90, 70, 161, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.SLAKOTH, 3, false, false, false, "Slacker Pokémon", PokemonType.NORMAL, null, 0.8, 24, AbilityId.TRUANT, AbilityId.NONE, AbilityId.STALL, 280, 60, 60, 60, 35, 35, 30, 255, 70, 56, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(SpeciesId.VIGOROTH, 3, false, false, false, "Wild Monkey Pokémon", PokemonType.NORMAL, null, 1.4, 46.5, AbilityId.VITAL_SPIRIT, AbilityId.NONE, AbilityId.INSOMNIA, 440, 80, 80, 80, 55, 55, 90, 120, 70, 154, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(SpeciesId.SLAKING, 3, false, false, false, "Lazy Pokémon", PokemonType.NORMAL, null, 2, 130.5, AbilityId.TRUANT, AbilityId.NONE, AbilityId.STALL, 670, 150, 160, 100, 95, 65, 100, 45, 70, 285, GrowthRate.SLOW, 50, false), //Custom Hidden - new PokemonSpecies(SpeciesId.NINCADA, 3, false, false, false, "Trainee Pokémon", PokemonType.BUG, PokemonType.GROUND, 0.5, 5.5, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.RUN_AWAY, 266, 31, 45, 90, 30, 30, 40, 255, 50, 53, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.NINJASK, 3, false, false, false, "Ninja Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.8, 12, AbilityId.SPEED_BOOST, AbilityId.NONE, AbilityId.INFILTRATOR, 456, 61, 90, 45, 50, 50, 160, 120, 50, 160, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.SHEDINJA, 3, false, false, false, "Shed Pokémon", PokemonType.BUG, PokemonType.GHOST, 0.8, 1.2, AbilityId.WONDER_GUARD, AbilityId.NONE, AbilityId.NONE, 236, 1, 90, 45, 30, 30, 40, 45, 50, 83, GrowthRate.ERRATIC, null, false), - new PokemonSpecies(SpeciesId.WHISMUR, 3, false, false, false, "Whisper Pokémon", PokemonType.NORMAL, null, 0.6, 16.3, AbilityId.SOUNDPROOF, AbilityId.NONE, AbilityId.RATTLED, 240, 64, 51, 23, 51, 23, 28, 190, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.LOUDRED, 3, false, false, false, "Big Voice Pokémon", PokemonType.NORMAL, null, 1, 40.5, AbilityId.SOUNDPROOF, AbilityId.NONE, AbilityId.SCRAPPY, 360, 84, 71, 43, 71, 43, 48, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.EXPLOUD, 3, false, false, false, "Loud Noise Pokémon", PokemonType.NORMAL, null, 1.5, 84, AbilityId.SOUNDPROOF, AbilityId.NONE, AbilityId.SCRAPPY, 490, 104, 91, 63, 91, 73, 68, 45, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.MAKUHITA, 3, false, false, false, "Guts Pokémon", PokemonType.FIGHTING, null, 1, 86.4, AbilityId.THICK_FAT, AbilityId.GUTS, AbilityId.SHEER_FORCE, 237, 72, 60, 30, 20, 30, 25, 180, 70, 47, GrowthRate.FLUCTUATING, 75, false), - new PokemonSpecies(SpeciesId.HARIYAMA, 3, false, false, false, "Arm Thrust Pokémon", PokemonType.FIGHTING, null, 2.3, 253.8, AbilityId.THICK_FAT, AbilityId.GUTS, AbilityId.SHEER_FORCE, 474, 144, 120, 60, 40, 60, 50, 200, 70, 166, GrowthRate.FLUCTUATING, 75, false), - new PokemonSpecies(SpeciesId.AZURILL, 3, false, false, false, "Polka Dot Pokémon", PokemonType.NORMAL, PokemonType.FAIRY, 0.2, 2, AbilityId.THICK_FAT, AbilityId.HUGE_POWER, AbilityId.SAP_SIPPER, 190, 50, 20, 40, 20, 40, 20, 150, 50, 38, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.NOSEPASS, 3, false, false, false, "Compass Pokémon", PokemonType.ROCK, null, 1, 97, AbilityId.STURDY, AbilityId.MAGNET_PULL, AbilityId.SAND_FORCE, 375, 30, 45, 135, 45, 90, 30, 255, 70, 75, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SKITTY, 3, false, false, false, "Kitten Pokémon", PokemonType.NORMAL, null, 0.6, 11, AbilityId.CUTE_CHARM, AbilityId.NORMALIZE, AbilityId.WONDER_SKIN, 260, 50, 45, 45, 35, 35, 50, 255, 70, 52, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.DELCATTY, 3, false, false, false, "Prim Pokémon", PokemonType.NORMAL, null, 1.1, 32.6, AbilityId.CUTE_CHARM, AbilityId.NORMALIZE, AbilityId.WONDER_SKIN, 400, 70, 65, 65, 55, 55, 90, 60, 70, 140, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.SABLEYE, 3, false, false, false, "Darkness Pokémon", PokemonType.DARK, PokemonType.GHOST, 0.5, 11, AbilityId.KEEN_EYE, AbilityId.STALL, AbilityId.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.GHOST, 0.5, 11, AbilityId.KEEN_EYE, AbilityId.STALL, AbilityId.PRANKSTER, 380, 50, 75, 75, 65, 65, 50, 45, 35, 133, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, PokemonType.GHOST, 0.5, 161, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, 480, 50, 85, 125, 85, 115, 20, 45, 35, 133), - ), - new PokemonSpecies(SpeciesId.MAWILE, 3, false, false, false, "Deceiver Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 0.6, 11.5, AbilityId.HYPER_CUTTER, AbilityId.INTIMIDATE, AbilityId.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.FAIRY, 0.6, 11.5, AbilityId.HYPER_CUTTER, AbilityId.INTIMIDATE, AbilityId.SHEER_FORCE, 380, 50, 85, 85, 55, 55, 50, 45, 50, 133, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.FAIRY, 1, 23.5, AbilityId.HUGE_POWER, AbilityId.HUGE_POWER, AbilityId.HUGE_POWER, 480, 50, 105, 125, 55, 95, 50, 45, 50, 133), - ), - new PokemonSpecies(SpeciesId.ARON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 0.4, 60, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.HEAVY_METAL, 330, 50, 70, 100, 40, 40, 30, 180, 35, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.LAIRON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 0.9, 120, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.HEAVY_METAL, 430, 60, 90, 140, 50, 50, 40, 90, 35, 151, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.AGGRON, 3, false, false, false, "Iron Armor Pokémon", PokemonType.STEEL, PokemonType.ROCK, 2.1, 360, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.ROCK, 2.1, 360, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.HEAVY_METAL, 530, 70, 110, 180, 60, 60, 50, 45, 35, 265, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, null, 2.2, 395, AbilityId.FILTER, AbilityId.FILTER, AbilityId.FILTER, 630, 70, 140, 230, 60, 80, 50, 45, 35, 265), - ), - new PokemonSpecies(SpeciesId.MEDITITE, 3, false, false, false, "Meditate Pokémon", PokemonType.FIGHTING, PokemonType.PSYCHIC, 0.6, 11.2, AbilityId.PURE_POWER, AbilityId.NONE, AbilityId.TELEPATHY, 280, 30, 40, 55, 40, 55, 60, 180, 70, 56, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.MEDICHAM, 3, false, false, false, "Meditate Pokémon", PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, AbilityId.PURE_POWER, AbilityId.NONE, AbilityId.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, AbilityId.PURE_POWER, AbilityId.NONE, AbilityId.TELEPATHY, 410, 60, 60, 75, 60, 75, 80, 90, 70, 144, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIGHTING, PokemonType.PSYCHIC, 1.3, 31.5, AbilityId.PURE_POWER, AbilityId.NONE, AbilityId.PURE_POWER, 510, 60, 100, 85, 80, 85, 100, 90, 70, 144, true), - ), - new PokemonSpecies(SpeciesId.ELECTRIKE, 3, false, false, false, "Lightning Pokémon", PokemonType.ELECTRIC, null, 0.6, 15.2, AbilityId.STATIC, AbilityId.LIGHTNING_ROD, AbilityId.MINUS, 295, 40, 45, 40, 65, 40, 65, 120, 50, 59, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.MANECTRIC, 3, false, false, false, "Discharge Pokémon", PokemonType.ELECTRIC, null, 1.5, 40.2, AbilityId.STATIC, AbilityId.LIGHTNING_ROD, AbilityId.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.ELECTRIC, null, 1.5, 40.2, AbilityId.STATIC, AbilityId.LIGHTNING_ROD, AbilityId.MINUS, 475, 70, 75, 60, 105, 60, 105, 45, 50, 166, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ELECTRIC, null, 1.8, 44, AbilityId.INTIMIDATE, AbilityId.INTIMIDATE, AbilityId.INTIMIDATE, 575, 70, 75, 80, 135, 80, 135, 45, 50, 166), - ), - new PokemonSpecies(SpeciesId.PLUSLE, 3, false, false, false, "Cheering Pokémon", PokemonType.ELECTRIC, null, 0.4, 4.2, AbilityId.PLUS, AbilityId.NONE, AbilityId.LIGHTNING_ROD, 405, 60, 50, 40, 85, 75, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MINUN, 3, false, false, false, "Cheering Pokémon", PokemonType.ELECTRIC, null, 0.4, 4.2, AbilityId.MINUS, AbilityId.NONE, AbilityId.VOLT_ABSORB, 405, 60, 40, 50, 75, 85, 95, 200, 70, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.VOLBEAT, 3, false, false, false, "Firefly Pokémon", PokemonType.BUG, null, 0.7, 17.7, AbilityId.ILLUMINATE, AbilityId.SWARM, AbilityId.PRANKSTER, 430, 65, 73, 75, 47, 85, 85, 150, 70, 151, GrowthRate.ERRATIC, 100, false), - new PokemonSpecies(SpeciesId.ILLUMISE, 3, false, false, false, "Firefly Pokémon", PokemonType.BUG, null, 0.6, 17.7, AbilityId.OBLIVIOUS, AbilityId.TINTED_LENS, AbilityId.PRANKSTER, 430, 65, 47, 75, 73, 85, 85, 150, 70, 151, GrowthRate.FLUCTUATING, 0, false), - new PokemonSpecies(SpeciesId.ROSELIA, 3, false, false, false, "Thorn Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.3, 2, AbilityId.NATURAL_CURE, AbilityId.POISON_POINT, AbilityId.LEAF_GUARD, 400, 50, 60, 45, 100, 80, 65, 150, 50, 140, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.GULPIN, 3, false, false, false, "Stomach Pokémon", PokemonType.POISON, null, 0.4, 10.3, AbilityId.LIQUID_OOZE, AbilityId.STICKY_HOLD, AbilityId.GLUTTONY, 302, 70, 43, 53, 43, 53, 40, 225, 70, 60, GrowthRate.FLUCTUATING, 50, true), - new PokemonSpecies(SpeciesId.SWALOT, 3, false, false, false, "Poison Bag Pokémon", PokemonType.POISON, null, 1.7, 80, AbilityId.LIQUID_OOZE, AbilityId.STICKY_HOLD, AbilityId.GLUTTONY, 467, 100, 73, 83, 73, 83, 55, 75, 70, 163, GrowthRate.FLUCTUATING, 50, true), - new PokemonSpecies(SpeciesId.CARVANHA, 3, false, false, false, "Savage Pokémon", PokemonType.WATER, PokemonType.DARK, 0.8, 20.8, AbilityId.ROUGH_SKIN, AbilityId.NONE, AbilityId.SPEED_BOOST, 305, 45, 90, 20, 65, 20, 65, 225, 35, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.SHARPEDO, 3, false, false, false, "Brutal Pokémon", PokemonType.WATER, PokemonType.DARK, 1.8, 88.8, AbilityId.ROUGH_SKIN, AbilityId.NONE, AbilityId.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DARK, 1.8, 88.8, AbilityId.ROUGH_SKIN, AbilityId.NONE, AbilityId.SPEED_BOOST, 460, 70, 120, 40, 95, 40, 95, 60, 35, 161, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.WATER, PokemonType.DARK, 2.5, 130.3, AbilityId.STRONG_JAW, AbilityId.NONE, AbilityId.STRONG_JAW, 560, 70, 140, 70, 110, 65, 105, 60, 35, 161), - ), - new PokemonSpecies(SpeciesId.WAILMER, 3, false, false, false, "Ball Whale Pokémon", PokemonType.WATER, null, 2, 130, AbilityId.WATER_VEIL, AbilityId.OBLIVIOUS, AbilityId.PRESSURE, 400, 130, 70, 35, 70, 35, 60, 125, 50, 80, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.WAILORD, 3, false, false, false, "Float Whale Pokémon", PokemonType.WATER, null, 14.5, 398, AbilityId.WATER_VEIL, AbilityId.OBLIVIOUS, AbilityId.PRESSURE, 500, 170, 90, 45, 90, 45, 60, 60, 50, 175, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.NUMEL, 3, false, false, false, "Numb Pokémon", PokemonType.FIRE, PokemonType.GROUND, 0.7, 24, AbilityId.OBLIVIOUS, AbilityId.SIMPLE, AbilityId.OWN_TEMPO, 305, 60, 60, 40, 65, 45, 35, 255, 70, 61, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.CAMERUPT, 3, false, false, false, "Eruption Pokémon", PokemonType.FIRE, PokemonType.GROUND, 1.9, 220, AbilityId.MAGMA_ARMOR, AbilityId.SOLID_ROCK, AbilityId.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, GrowthRate.MEDIUM_FAST, 50, true, true, - new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.GROUND, 1.9, 220, AbilityId.MAGMA_ARMOR, AbilityId.SOLID_ROCK, AbilityId.ANGER_POINT, 460, 70, 100, 70, 105, 75, 40, 150, 70, 161, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIRE, PokemonType.GROUND, 2.5, 320.5, AbilityId.SHEER_FORCE, AbilityId.SHEER_FORCE, AbilityId.SHEER_FORCE, 560, 70, 120, 100, 145, 105, 20, 150, 70, 161), - ), - new PokemonSpecies(SpeciesId.TORKOAL, 3, false, false, false, "Coal Pokémon", PokemonType.FIRE, null, 0.5, 80.4, AbilityId.WHITE_SMOKE, AbilityId.DROUGHT, AbilityId.SHELL_ARMOR, 470, 70, 85, 140, 85, 70, 20, 90, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SPOINK, 3, false, false, false, "Bounce Pokémon", PokemonType.PSYCHIC, null, 0.7, 30.6, AbilityId.THICK_FAT, AbilityId.OWN_TEMPO, AbilityId.GLUTTONY, 330, 60, 25, 35, 70, 80, 60, 255, 70, 66, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.GRUMPIG, 3, false, false, false, "Manipulate Pokémon", PokemonType.PSYCHIC, null, 0.9, 71.5, AbilityId.THICK_FAT, AbilityId.OWN_TEMPO, AbilityId.GLUTTONY, 470, 80, 45, 65, 90, 110, 80, 60, 70, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.SPINDA, 3, false, false, false, "Spot Panda Pokémon", PokemonType.NORMAL, null, 1.1, 5, AbilityId.OWN_TEMPO, AbilityId.TANGLED_FEET, AbilityId.CONTRARY, 360, 60, 60, 60, 60, 60, 60, 255, 70, 126, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.TRAPINCH, 3, false, false, false, "Ant Pit Pokémon", PokemonType.GROUND, null, 0.7, 15, AbilityId.HYPER_CUTTER, AbilityId.ARENA_TRAP, AbilityId.SHEER_FORCE, 290, 45, 100, 45, 45, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.VIBRAVA, 3, false, false, false, "Vibration Pokémon", PokemonType.GROUND, PokemonType.DRAGON, 1.1, 15.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 340, 50, 70, 50, 50, 50, 70, 120, 50, 119, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.FLYGON, 3, false, false, false, "Mystic Pokémon", PokemonType.GROUND, PokemonType.DRAGON, 2, 82, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 80, 100, 80, 80, 80, 100, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CACNEA, 3, false, false, false, "Cactus Pokémon", PokemonType.GRASS, null, 0.4, 51.3, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.WATER_ABSORB, 335, 50, 85, 40, 85, 40, 35, 190, 35, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CACTURNE, 3, false, false, false, "Scarecrow Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.3, 77.4, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.WATER_ABSORB, 475, 70, 115, 60, 115, 60, 55, 60, 35, 166, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.SWABLU, 3, false, false, false, "Cotton Bird Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.4, 1.2, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.CLOUD_NINE, 310, 45, 40, 60, 40, 75, 50, 255, 50, 62, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.ALTARIA, 3, false, false, false, "Humming Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 1.1, 20.6, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 1.1, 20.6, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.CLOUD_NINE, 490, 75, 70, 90, 70, 105, 80, 45, 50, 172, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FAIRY, 1.5, 20.6, AbilityId.PIXILATE, AbilityId.NONE, AbilityId.PIXILATE, 590, 75, 110, 110, 110, 105, 80, 45, 50, 172), - ), - new PokemonSpecies(SpeciesId.ZANGOOSE, 3, false, false, false, "Cat Ferret Pokémon", PokemonType.NORMAL, null, 1.3, 40.3, AbilityId.IMMUNITY, AbilityId.NONE, AbilityId.TOXIC_BOOST, 458, 73, 115, 60, 60, 60, 90, 90, 70, 160, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.SEVIPER, 3, false, false, false, "Fang Snake Pokémon", PokemonType.POISON, null, 2.7, 52.5, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.INFILTRATOR, 458, 73, 100, 60, 100, 60, 65, 90, 70, 160, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.LUNATONE, 3, false, false, false, "Meteorite Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1, 168, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 460, 90, 55, 65, 95, 85, 70, 45, 50, 161, GrowthRate.FAST, null, false), - new PokemonSpecies(SpeciesId.SOLROCK, 3, false, false, false, "Meteorite Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1.2, 154, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 460, 90, 95, 85, 55, 65, 70, 45, 50, 161, GrowthRate.FAST, null, false), - new PokemonSpecies(SpeciesId.BARBOACH, 3, false, false, false, "Whiskers Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.4, 1.9, AbilityId.OBLIVIOUS, AbilityId.ANTICIPATION, AbilityId.HYDRATION, 288, 50, 48, 43, 46, 41, 60, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WHISCASH, 3, false, false, false, "Whiskers Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.9, 23.6, AbilityId.OBLIVIOUS, AbilityId.ANTICIPATION, AbilityId.HYDRATION, 468, 110, 78, 73, 76, 71, 60, 75, 50, 164, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CORPHISH, 3, false, false, false, "Ruffian Pokémon", PokemonType.WATER, null, 0.6, 11.5, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.ADAPTABILITY, 308, 43, 80, 65, 50, 35, 35, 205, 50, 62, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.CRAWDAUNT, 3, false, false, false, "Rogue Pokémon", PokemonType.WATER, PokemonType.DARK, 1.1, 32.8, AbilityId.HYPER_CUTTER, AbilityId.SHELL_ARMOR, AbilityId.ADAPTABILITY, 468, 63, 120, 85, 90, 55, 55, 155, 50, 164, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.BALTOY, 3, false, false, false, "Clay Doll Pokémon", PokemonType.GROUND, PokemonType.PSYCHIC, 0.5, 21.5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 300, 40, 40, 55, 40, 70, 55, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.CLAYDOL, 3, false, false, false, "Clay Doll Pokémon", PokemonType.GROUND, PokemonType.PSYCHIC, 1.5, 108, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 500, 60, 70, 105, 70, 120, 75, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.LILEEP, 3, false, false, false, "Sea Lily Pokémon", PokemonType.ROCK, PokemonType.GRASS, 1, 23.8, AbilityId.SUCTION_CUPS, AbilityId.NONE, AbilityId.STORM_DRAIN, 355, 66, 41, 77, 61, 87, 23, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(SpeciesId.CRADILY, 3, false, false, false, "Barnacle Pokémon", PokemonType.ROCK, PokemonType.GRASS, 1.5, 60.4, AbilityId.SUCTION_CUPS, AbilityId.NONE, AbilityId.STORM_DRAIN, 495, 86, 81, 97, 81, 107, 43, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(SpeciesId.ANORITH, 3, false, false, false, "Old Shrimp Pokémon", PokemonType.ROCK, PokemonType.BUG, 0.7, 12.5, AbilityId.BATTLE_ARMOR, AbilityId.NONE, AbilityId.SWIFT_SWIM, 355, 45, 95, 50, 40, 50, 75, 45, 50, 71, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(SpeciesId.ARMALDO, 3, false, false, false, "Plate Pokémon", PokemonType.ROCK, PokemonType.BUG, 1.5, 68.2, AbilityId.BATTLE_ARMOR, AbilityId.NONE, AbilityId.SWIFT_SWIM, 495, 75, 125, 100, 70, 80, 45, 45, 50, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(SpeciesId.FEEBAS, 3, false, false, false, "Fish Pokémon", PokemonType.WATER, null, 0.6, 7.4, AbilityId.SWIFT_SWIM, AbilityId.OBLIVIOUS, AbilityId.ADAPTABILITY, 200, 20, 15, 20, 10, 55, 80, 255, 50, 40, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.MILOTIC, 3, false, false, false, "Tender Pokémon", PokemonType.WATER, null, 6.2, 162, AbilityId.MARVEL_SCALE, AbilityId.COMPETITIVE, AbilityId.CUTE_CHARM, 540, 95, 60, 79, 100, 125, 81, 60, 50, 189, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(SpeciesId.CASTFORM, 3, false, false, false, "Weather Pokémon", PokemonType.NORMAL, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal Form", "", PokemonType.NORMAL, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147, false, null, true), - new PokemonForm("Sunny Form", "sunny", PokemonType.FIRE, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - new PokemonForm("Rainy Form", "rainy", PokemonType.WATER, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - new PokemonForm("Snowy Form", "snowy", PokemonType.ICE, null, 0.3, 0.8, AbilityId.FORECAST, AbilityId.NONE, AbilityId.NONE, 420, 70, 70, 70, 70, 70, 70, 45, 70, 147), - ), - new PokemonSpecies(SpeciesId.KECLEON, 3, false, false, false, "Color Swap Pokémon", PokemonType.NORMAL, null, 1, 22, AbilityId.COLOR_CHANGE, AbilityId.NONE, AbilityId.PROTEAN, 440, 60, 90, 70, 60, 120, 40, 200, 70, 154, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SHUPPET, 3, false, false, false, "Puppet Pokémon", PokemonType.GHOST, null, 0.6, 2.3, AbilityId.INSOMNIA, AbilityId.FRISK, AbilityId.CURSED_BODY, 295, 44, 75, 35, 63, 33, 45, 225, 35, 59, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.BANETTE, 3, false, false, false, "Marionette Pokémon", PokemonType.GHOST, null, 1.1, 12.5, AbilityId.INSOMNIA, AbilityId.FRISK, AbilityId.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.GHOST, null, 1.1, 12.5, AbilityId.INSOMNIA, AbilityId.FRISK, AbilityId.CURSED_BODY, 455, 64, 115, 65, 83, 63, 65, 45, 35, 159, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GHOST, null, 1.2, 13, AbilityId.PRANKSTER, AbilityId.PRANKSTER, AbilityId.PRANKSTER, 555, 64, 165, 75, 93, 83, 75, 45, 35, 159), - ), - new PokemonSpecies(SpeciesId.DUSKULL, 3, false, false, false, "Requiem Pokémon", PokemonType.GHOST, null, 0.8, 15, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.FRISK, 295, 20, 40, 90, 30, 90, 25, 190, 35, 59, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.DUSCLOPS, 3, false, false, false, "Beckon Pokémon", PokemonType.GHOST, null, 1.6, 30.6, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.FRISK, 455, 40, 70, 130, 60, 130, 25, 90, 35, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.TROPIUS, 3, false, false, false, "Fruit Pokémon", PokemonType.GRASS, PokemonType.FLYING, 2, 100, AbilityId.CHLOROPHYLL, AbilityId.SOLAR_POWER, AbilityId.HARVEST, 460, 99, 68, 83, 72, 87, 51, 200, 70, 161, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.CHIMECHO, 3, false, false, false, "Wind Chime Pokémon", PokemonType.PSYCHIC, null, 0.6, 1, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 455, 75, 50, 80, 95, 90, 65, 45, 70, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.ABSOL, 3, false, false, false, "Disaster Pokémon", PokemonType.DARK, null, 1.2, 47, AbilityId.PRESSURE, AbilityId.SUPER_LUCK, AbilityId.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.DARK, null, 1.2, 47, AbilityId.PRESSURE, AbilityId.SUPER_LUCK, AbilityId.JUSTIFIED, 465, 65, 130, 60, 75, 60, 75, 30, 35, 163, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DARK, null, 1.2, 49, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, 565, 65, 150, 60, 115, 60, 115, 30, 35, 163), - ), - new PokemonSpecies(SpeciesId.WYNAUT, 3, false, false, false, "Bright Pokémon", PokemonType.PSYCHIC, null, 0.6, 14, AbilityId.SHADOW_TAG, AbilityId.NONE, AbilityId.TELEPATHY, 260, 95, 23, 48, 23, 48, 23, 125, 50, 52, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SNORUNT, 3, false, false, false, "Snow Hat Pokémon", PokemonType.ICE, null, 0.7, 16.8, AbilityId.INNER_FOCUS, AbilityId.ICE_BODY, AbilityId.MOODY, 300, 50, 50, 50, 50, 50, 50, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GLALIE, 3, false, false, false, "Face Pokémon", PokemonType.ICE, null, 1.5, 256.5, AbilityId.INNER_FOCUS, AbilityId.ICE_BODY, AbilityId.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.ICE, null, 1.5, 256.5, AbilityId.INNER_FOCUS, AbilityId.ICE_BODY, AbilityId.MOODY, 480, 80, 80, 80, 80, 80, 80, 75, 50, 168, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ICE, null, 2.1, 350.2, AbilityId.REFRIGERATE, AbilityId.REFRIGERATE, AbilityId.REFRIGERATE, 580, 80, 120, 80, 120, 80, 100, 75, 50, 168), - ), - new PokemonSpecies(SpeciesId.SPHEAL, 3, false, false, false, "Clap Pokémon", PokemonType.ICE, PokemonType.WATER, 0.8, 39.5, AbilityId.THICK_FAT, AbilityId.ICE_BODY, AbilityId.OBLIVIOUS, 290, 70, 40, 50, 55, 50, 25, 255, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SEALEO, 3, false, false, false, "Ball Roll Pokémon", PokemonType.ICE, PokemonType.WATER, 1.1, 87.6, AbilityId.THICK_FAT, AbilityId.ICE_BODY, AbilityId.OBLIVIOUS, 410, 90, 60, 70, 75, 70, 45, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.WALREIN, 3, false, false, false, "Ice Break Pokémon", PokemonType.ICE, PokemonType.WATER, 1.4, 150.6, AbilityId.THICK_FAT, AbilityId.ICE_BODY, AbilityId.OBLIVIOUS, 530, 110, 80, 90, 95, 90, 65, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CLAMPERL, 3, false, false, false, "Bivalve Pokémon", PokemonType.WATER, null, 0.4, 52.5, AbilityId.SHELL_ARMOR, AbilityId.NONE, AbilityId.RATTLED, 345, 35, 64, 85, 74, 55, 32, 255, 70, 69, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.HUNTAIL, 3, false, false, false, "Deep Sea Pokémon", PokemonType.WATER, null, 1.7, 27, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.WATER_VEIL, 485, 55, 104, 105, 94, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.GOREBYSS, 3, false, false, false, "South Sea Pokémon", PokemonType.WATER, null, 1.8, 22.6, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.HYDRATION, 485, 55, 84, 105, 114, 75, 52, 60, 70, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.RELICANTH, 3, false, false, false, "Longevity Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 23.4, AbilityId.SWIFT_SWIM, AbilityId.ROCK_HEAD, AbilityId.STURDY, 485, 100, 90, 130, 45, 65, 55, 25, 50, 170, GrowthRate.SLOW, 87.5, true), - new PokemonSpecies(SpeciesId.LUVDISC, 3, false, false, false, "Rendezvous Pokémon", PokemonType.WATER, null, 0.6, 8.7, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.HYDRATION, 330, 43, 30, 55, 40, 65, 97, 225, 70, 116, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.BAGON, 3, false, false, false, "Rock Head Pokémon", PokemonType.DRAGON, null, 0.6, 42.1, AbilityId.ROCK_HEAD, AbilityId.NONE, AbilityId.SHEER_FORCE, 300, 45, 75, 60, 40, 30, 50, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.SHELGON, 3, false, false, false, "Endurance Pokémon", PokemonType.DRAGON, null, 1.1, 110.5, AbilityId.ROCK_HEAD, AbilityId.NONE, AbilityId.OVERCOAT, 420, 65, 95, 100, 60, 50, 50, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.SALAMENCE, 3, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 1.5, 102.6, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 1.5, 102.6, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.MOXIE, 600, 95, 135, 80, 110, 80, 100, 45, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FLYING, 1.8, 112.6, AbilityId.AERILATE, AbilityId.NONE, AbilityId.AERILATE, 700, 95, 145, 130, 120, 90, 120, 45, 35, 300), - ), - new PokemonSpecies(SpeciesId.BELDUM, 3, false, false, false, "Iron Ball Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.6, 95.2, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 300, 40, 55, 80, 35, 60, 30, 45, 35, 60, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Frigibax - new PokemonSpecies(SpeciesId.METANG, 3, false, false, false, "Iron Claw Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.2, 202.5, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 420, 60, 75, 100, 55, 80, 50, 25, 35, 147, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Arctibax - new PokemonSpecies(SpeciesId.METAGROSS, 3, false, false, false, "Iron Leg Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 550, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 10, 35, 300, GrowthRate.SLOW, null, false, true, //Custom Catchrate, matching Baxcalibur - new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 550, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 600, 80, 135, 130, 95, 90, 70, 3, 35, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.STEEL, PokemonType.PSYCHIC, 2.5, 942.9, AbilityId.TOUGH_CLAWS, AbilityId.NONE, AbilityId.TOUGH_CLAWS, 700, 80, 145, 150, 105, 110, 110, 3, 35, 300), - ), - new PokemonSpecies(SpeciesId.REGIROCK, 3, true, false, false, "Rock Peak Pokémon", PokemonType.ROCK, null, 1.7, 230, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.STURDY, 580, 80, 100, 200, 50, 100, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.REGICE, 3, true, false, false, "Iceberg Pokémon", PokemonType.ICE, null, 1.8, 175, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.ICE_BODY, 580, 80, 50, 100, 100, 200, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.REGISTEEL, 3, true, false, false, "Iron Pokémon", PokemonType.STEEL, null, 1.9, 205, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.LIGHT_METAL, 580, 80, 75, 150, 75, 150, 50, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.LATIAS, 3, true, false, false, "Eon Pokémon", PokemonType.DRAGON, PokemonType.PSYCHIC, 1.4, 40, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.PSYCHIC, 1.4, 40, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 80, 80, 90, 110, 130, 110, 3, 90, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.PSYCHIC, 1.8, 52, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 700, 80, 100, 120, 140, 150, 110, 3, 90, 300), - ), - new PokemonSpecies(SpeciesId.LATIOS, 3, true, false, false, "Eon Pokémon", PokemonType.DRAGON, PokemonType.PSYCHIC, 2, 60, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.PSYCHIC, 2, 60, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 80, 90, 80, 130, 110, 110, 3, 90, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.PSYCHIC, 2.3, 70, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 700, 80, 130, 100, 160, 120, 110, 3, 90, 300), - ), - new PokemonSpecies(SpeciesId.KYOGRE, 3, false, true, false, "Sea Basin Pokémon", PokemonType.WATER, null, 4.5, 352, AbilityId.DRIZZLE, AbilityId.NONE, AbilityId.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, null, 4.5, 352, AbilityId.DRIZZLE, AbilityId.NONE, AbilityId.NONE, 670, 100, 100, 90, 150, 140, 90, 3, 0, 335, false, null, true), - new PokemonForm("Primal", "primal", PokemonType.WATER, null, 9.8, 430, AbilityId.PRIMORDIAL_SEA, AbilityId.NONE, AbilityId.NONE, 770, 100, 150, 90, 180, 160, 90, 3, 0, 335), - ), - new PokemonSpecies(SpeciesId.GROUDON, 3, false, true, false, "Continent Pokémon", PokemonType.GROUND, null, 3.5, 950, AbilityId.DROUGHT, AbilityId.NONE, AbilityId.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.GROUND, null, 3.5, 950, AbilityId.DROUGHT, AbilityId.NONE, AbilityId.NONE, 670, 100, 150, 140, 100, 90, 90, 3, 0, 335, false, null, true), - new PokemonForm("Primal", "primal", PokemonType.GROUND, PokemonType.FIRE, 5, 999.7, AbilityId.DESOLATE_LAND, AbilityId.NONE, AbilityId.NONE, 770, 100, 180, 160, 150, 90, 90, 3, 0, 335), - ), - new PokemonSpecies(SpeciesId.RAYQUAZA, 3, false, true, false, "Sky High Pokémon", PokemonType.DRAGON, PokemonType.FLYING, 7, 206.5, AbilityId.AIR_LOCK, AbilityId.NONE, AbilityId.NONE, 680, 105, 150, 90, 150, 90, 95, 3, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.FLYING, 7, 206.5, AbilityId.AIR_LOCK, AbilityId.NONE, AbilityId.NONE, 680, 105, 150, 90, 150, 90, 95, 3, 0, 340, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.FLYING, 10.8, 392, AbilityId.DELTA_STREAM, AbilityId.NONE, AbilityId.NONE, 780, 105, 180, 100, 180, 100, 115, 3, 0, 340), - ), - new PokemonSpecies(SpeciesId.JIRACHI, 3, false, false, true, "Wish Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.3, 1.1, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.DEOXYS, 3, false, false, true, "DNA Pokémon", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal Forme", "normal", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 150, 50, 150, 50, 150, 3, 0, 300, false, "", true), - new PokemonForm("Attack Forme", "attack", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 180, 20, 180, 20, 150, 3, 0, 300), - new PokemonForm("Defense Forme", "defense", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 70, 160, 70, 160, 90, 3, 0, 300), - new PokemonForm("Speed Forme", "speed", PokemonType.PSYCHIC, null, 1.7, 60.8, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 600, 50, 95, 90, 95, 90, 180, 3, 0, 300), - ), - new PokemonSpecies(SpeciesId.TURTWIG, 4, false, false, false, "Tiny Leaf Pokémon", PokemonType.GRASS, null, 0.4, 10.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.SHELL_ARMOR, 318, 55, 68, 64, 45, 55, 31, 45, 70, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.GROTLE, 4, false, false, false, "Grove Pokémon", PokemonType.GRASS, null, 1.1, 97, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.SHELL_ARMOR, 405, 75, 89, 85, 55, 65, 36, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.TORTERRA, 4, false, false, false, "Continent Pokémon", PokemonType.GRASS, PokemonType.GROUND, 2.2, 310, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.SHELL_ARMOR, 525, 95, 109, 105, 75, 85, 56, 45, 70, 263, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.CHIMCHAR, 4, false, false, false, "Chimp Pokémon", PokemonType.FIRE, null, 0.5, 6.2, AbilityId.BLAZE, AbilityId.NONE, AbilityId.IRON_FIST, 309, 44, 58, 44, 58, 44, 61, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.MONFERNO, 4, false, false, false, "Playful Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 0.9, 22, AbilityId.BLAZE, AbilityId.NONE, AbilityId.IRON_FIST, 405, 64, 78, 52, 78, 52, 81, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.INFERNAPE, 4, false, false, false, "Flame Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.2, 55, AbilityId.BLAZE, AbilityId.NONE, AbilityId.IRON_FIST, 534, 76, 104, 71, 104, 71, 108, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.PIPLUP, 4, false, false, false, "Penguin Pokémon", PokemonType.WATER, null, 0.4, 5.2, AbilityId.TORRENT, AbilityId.NONE, AbilityId.COMPETITIVE, 314, 53, 51, 53, 61, 56, 40, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.PRINPLUP, 4, false, false, false, "Penguin Pokémon", PokemonType.WATER, null, 0.8, 23, AbilityId.TORRENT, AbilityId.NONE, AbilityId.COMPETITIVE, 405, 64, 66, 68, 81, 76, 50, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.EMPOLEON, 4, false, false, false, "Emperor Pokémon", PokemonType.WATER, PokemonType.STEEL, 1.7, 84.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.COMPETITIVE, 530, 84, 86, 88, 111, 101, 60, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.STARLY, 4, false, false, false, "Starling Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2, AbilityId.KEEN_EYE, AbilityId.NONE, AbilityId.RECKLESS, 245, 40, 55, 30, 30, 30, 60, 255, 70, 49, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.STARAVIA, 4, false, false, false, "Starling Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 15.5, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.RECKLESS, 340, 55, 75, 50, 40, 40, 80, 120, 70, 119, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.STARAPTOR, 4, false, false, false, "Predator Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 24.9, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.RECKLESS, 485, 85, 120, 70, 50, 60, 100, 45, 70, 243, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.BIDOOF, 4, false, false, false, "Plump Mouse Pokémon", PokemonType.NORMAL, null, 0.5, 20, AbilityId.SIMPLE, AbilityId.UNAWARE, AbilityId.MOODY, 250, 59, 45, 40, 35, 40, 31, 255, 70, 50, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.BIBAREL, 4, false, false, false, "Beaver Pokémon", PokemonType.NORMAL, PokemonType.WATER, 1, 31.5, AbilityId.SIMPLE, AbilityId.UNAWARE, AbilityId.MOODY, 410, 79, 85, 60, 55, 60, 71, 127, 70, 144, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.KRICKETOT, 4, false, false, false, "Cricket Pokémon", PokemonType.BUG, null, 0.3, 2.2, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.RUN_AWAY, 194, 37, 25, 41, 25, 41, 25, 255, 70, 39, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.KRICKETUNE, 4, false, false, false, "Cricket Pokémon", PokemonType.BUG, null, 1, 25.5, AbilityId.SWARM, AbilityId.NONE, AbilityId.TECHNICIAN, 384, 77, 85, 51, 55, 51, 65, 45, 70, 134, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.SHINX, 4, false, false, false, "Flash Pokémon", PokemonType.ELECTRIC, null, 0.5, 9.5, AbilityId.RIVALRY, AbilityId.INTIMIDATE, AbilityId.GUTS, 263, 45, 65, 34, 40, 34, 45, 235, 50, 53, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.LUXIO, 4, false, false, false, "Spark Pokémon", PokemonType.ELECTRIC, null, 0.9, 30.5, AbilityId.RIVALRY, AbilityId.INTIMIDATE, AbilityId.GUTS, 363, 60, 85, 49, 60, 49, 60, 120, 100, 127, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.LUXRAY, 4, false, false, false, "Gleam Eyes Pokémon", PokemonType.ELECTRIC, null, 1.4, 42, AbilityId.RIVALRY, AbilityId.INTIMIDATE, AbilityId.GUTS, 523, 80, 120, 79, 95, 79, 70, 45, 50, 262, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.BUDEW, 4, false, false, false, "Bud Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.2, 1.2, AbilityId.NATURAL_CURE, AbilityId.POISON_POINT, AbilityId.LEAF_GUARD, 280, 40, 30, 35, 50, 70, 55, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.ROSERADE, 4, false, false, false, "Bouquet Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.9, 14.5, AbilityId.NATURAL_CURE, AbilityId.POISON_POINT, AbilityId.TECHNICIAN, 515, 60, 70, 65, 125, 105, 90, 75, 50, 258, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.CRANIDOS, 4, false, false, false, "Head Butt Pokémon", PokemonType.ROCK, null, 0.9, 31.5, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.SHEER_FORCE, 350, 67, 125, 40, 30, 30, 58, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(SpeciesId.RAMPARDOS, 4, false, false, false, "Head Butt Pokémon", PokemonType.ROCK, null, 1.6, 102.5, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.SHEER_FORCE, 495, 97, 165, 60, 65, 50, 58, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(SpeciesId.SHIELDON, 4, false, false, false, "Shield Pokémon", PokemonType.ROCK, PokemonType.STEEL, 0.5, 57, AbilityId.STURDY, AbilityId.NONE, AbilityId.SOUNDPROOF, 350, 30, 42, 118, 42, 88, 30, 45, 70, 70, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(SpeciesId.BASTIODON, 4, false, false, false, "Shield Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.3, 149.5, AbilityId.STURDY, AbilityId.NONE, AbilityId.SOUNDPROOF, 495, 60, 52, 168, 47, 138, 30, 45, 70, 173, GrowthRate.ERRATIC, 87.5, false), - new PokemonSpecies(SpeciesId.BURMY, 4, false, false, false, "Bagworm Pokémon", PokemonType.BUG, null, 0.2, 3.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Plant Cloak", "plant", PokemonType.BUG, null, 0.2, 3.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - new PokemonForm("Sandy Cloak", "sandy", PokemonType.BUG, null, 0.2, 3.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - new PokemonForm("Trash Cloak", "trash", PokemonType.BUG, null, 0.2, 3.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.OVERCOAT, 224, 40, 29, 45, 29, 45, 36, 120, 70, 45, false, null, true), - ), - new PokemonSpecies(SpeciesId.WORMADAM, 4, false, false, false, "Bagworm Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.5, 6.5, AbilityId.ANTICIPATION, AbilityId.NONE, AbilityId.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Plant Cloak", "plant", PokemonType.BUG, PokemonType.GRASS, 0.5, 6.5, AbilityId.ANTICIPATION, AbilityId.NONE, AbilityId.OVERCOAT, 424, 60, 59, 85, 79, 105, 36, 45, 70, 148, false, null, true), - new PokemonForm("Sandy Cloak", "sandy", PokemonType.BUG, PokemonType.GROUND, 0.5, 6.5, AbilityId.ANTICIPATION, AbilityId.NONE, AbilityId.OVERCOAT, 424, 60, 79, 105, 59, 85, 36, 45, 70, 148, false, null, true), - new PokemonForm("Trash Cloak", "trash", PokemonType.BUG, PokemonType.STEEL, 0.5, 6.5, AbilityId.ANTICIPATION, AbilityId.NONE, AbilityId.OVERCOAT, 424, 60, 69, 95, 69, 95, 36, 45, 70, 148, false, null, true), - ), - new PokemonSpecies(SpeciesId.MOTHIM, 4, false, false, false, "Moth Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.9, 23.3, AbilityId.SWARM, AbilityId.NONE, AbilityId.TINTED_LENS, 424, 70, 94, 50, 94, 50, 66, 45, 70, 148, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.COMBEE, 4, false, false, false, "Tiny Bee Pokémon", PokemonType.BUG, PokemonType.FLYING, 0.3, 5.5, AbilityId.HONEY_GATHER, AbilityId.NONE, AbilityId.HUSTLE, 244, 30, 30, 42, 30, 42, 70, 120, 50, 49, GrowthRate.MEDIUM_SLOW, 87.5, true), - new PokemonSpecies(SpeciesId.VESPIQUEN, 4, false, false, false, "Beehive Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 38.5, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.UNNERVE, 474, 70, 80, 102, 80, 102, 40, 45, 50, 166, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.PACHIRISU, 4, false, false, false, "EleSquirrel Pokémon", PokemonType.ELECTRIC, null, 0.4, 3.9, AbilityId.RUN_AWAY, AbilityId.PICKUP, AbilityId.VOLT_ABSORB, 405, 60, 45, 70, 45, 90, 95, 200, 100, 142, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.BUIZEL, 4, false, false, false, "Sea Weasel Pokémon", PokemonType.WATER, null, 0.7, 29.5, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.WATER_VEIL, 330, 55, 65, 35, 60, 30, 85, 190, 70, 66, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.FLOATZEL, 4, false, false, false, "Sea Weasel Pokémon", PokemonType.WATER, null, 1.1, 33.5, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.WATER_VEIL, 495, 85, 105, 55, 85, 50, 115, 75, 70, 173, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.CHERUBI, 4, false, false, false, "Cherry Pokémon", PokemonType.GRASS, null, 0.4, 3.3, AbilityId.CHLOROPHYLL, AbilityId.NONE, AbilityId.NONE, 275, 45, 35, 45, 62, 53, 35, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CHERRIM, 4, false, false, false, "Blossom Pokémon", PokemonType.GRASS, null, 0.5, 9.3, AbilityId.FLOWER_GIFT, AbilityId.NONE, AbilityId.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Overcast Form", "overcast", PokemonType.GRASS, null, 0.5, 9.3, AbilityId.FLOWER_GIFT, AbilityId.NONE, AbilityId.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158, false, null, true), - new PokemonForm("Sunshine Form", "sunshine", PokemonType.GRASS, null, 0.5, 9.3, AbilityId.FLOWER_GIFT, AbilityId.NONE, AbilityId.NONE, 450, 70, 60, 70, 87, 78, 85, 75, 50, 158), - ), - new PokemonSpecies(SpeciesId.SHELLOS, 4, false, false, false, "Sea Slug Pokémon", PokemonType.WATER, null, 0.3, 6.3, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("East Sea", "east", PokemonType.WATER, null, 0.3, 6.3, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), - new PokemonForm("West Sea", "west", PokemonType.WATER, null, 0.3, 6.3, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 325, 76, 48, 48, 57, 62, 34, 190, 50, 65, false, null, true), - ), - new PokemonSpecies(SpeciesId.GASTRODON, 4, false, false, false, "Sea Slug Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("East Sea", "east", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), - new PokemonForm("West Sea", "west", PokemonType.WATER, PokemonType.GROUND, 0.9, 29.9, AbilityId.STICKY_HOLD, AbilityId.STORM_DRAIN, AbilityId.SAND_FORCE, 475, 111, 83, 68, 92, 82, 39, 75, 50, 166, false, null, true), - ), - new PokemonSpecies(SpeciesId.AMBIPOM, 4, false, false, false, "Long Tail Pokémon", PokemonType.NORMAL, null, 1.2, 20.3, AbilityId.TECHNICIAN, AbilityId.PICKUP, AbilityId.SKILL_LINK, 482, 75, 100, 66, 60, 66, 115, 45, 100, 169, GrowthRate.FAST, 50, true), - new PokemonSpecies(SpeciesId.DRIFLOON, 4, false, false, false, "Balloon Pokémon", PokemonType.GHOST, PokemonType.FLYING, 0.4, 1.2, AbilityId.AFTERMATH, AbilityId.UNBURDEN, AbilityId.FLARE_BOOST, 348, 90, 50, 34, 60, 44, 70, 125, 50, 70, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.DRIFBLIM, 4, false, false, false, "Blimp Pokémon", PokemonType.GHOST, PokemonType.FLYING, 1.2, 15, AbilityId.AFTERMATH, AbilityId.UNBURDEN, AbilityId.FLARE_BOOST, 498, 150, 80, 44, 90, 54, 80, 60, 50, 174, GrowthRate.FLUCTUATING, 50, false), - new PokemonSpecies(SpeciesId.BUNEARY, 4, false, false, false, "Rabbit Pokémon", PokemonType.NORMAL, null, 0.4, 5.5, AbilityId.RUN_AWAY, AbilityId.KLUTZ, AbilityId.LIMBER, 350, 55, 66, 44, 44, 56, 85, 190, 0, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LOPUNNY, 4, false, false, false, "Rabbit Pokémon", PokemonType.NORMAL, null, 1.2, 33.3, AbilityId.CUTE_CHARM, AbilityId.KLUTZ, AbilityId.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.NORMAL, null, 1.2, 33.3, AbilityId.CUTE_CHARM, AbilityId.KLUTZ, AbilityId.LIMBER, 480, 65, 76, 84, 54, 96, 105, 60, 140, 168, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FIGHTING, 1.3, 28.3, AbilityId.SCRAPPY, AbilityId.SCRAPPY, AbilityId.SCRAPPY, 580, 65, 136, 94, 54, 96, 135, 60, 140, 168), - ), - new PokemonSpecies(SpeciesId.MISMAGIUS, 4, false, false, false, "Magical Pokémon", PokemonType.GHOST, null, 0.9, 4.4, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 495, 60, 60, 60, 105, 105, 105, 45, 35, 173, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.HONCHKROW, 4, false, false, false, "Big Boss Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.9, 27.3, AbilityId.INSOMNIA, AbilityId.SUPER_LUCK, AbilityId.MOXIE, 505, 100, 125, 52, 105, 52, 71, 30, 35, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GLAMEOW, 4, false, false, false, "Catty Pokémon", PokemonType.NORMAL, null, 0.5, 3.9, AbilityId.LIMBER, AbilityId.OWN_TEMPO, AbilityId.KEEN_EYE, 310, 49, 55, 42, 42, 37, 85, 190, 70, 62, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.PURUGLY, 4, false, false, false, "Tiger Cat Pokémon", PokemonType.NORMAL, null, 1, 43.8, AbilityId.THICK_FAT, AbilityId.OWN_TEMPO, AbilityId.DEFIANT, 452, 71, 82, 64, 64, 59, 112, 75, 70, 158, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.CHINGLING, 4, false, false, false, "Bell Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.6, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 285, 45, 30, 50, 65, 50, 45, 120, 70, 57, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.STUNKY, 4, false, false, false, "Skunk Pokémon", PokemonType.POISON, PokemonType.DARK, 0.4, 19.2, AbilityId.STENCH, AbilityId.AFTERMATH, AbilityId.KEEN_EYE, 329, 63, 63, 47, 41, 41, 74, 225, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SKUNTANK, 4, false, false, false, "Skunk Pokémon", PokemonType.POISON, PokemonType.DARK, 1, 38, AbilityId.STENCH, AbilityId.AFTERMATH, AbilityId.KEEN_EYE, 479, 103, 93, 67, 71, 61, 84, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BRONZOR, 4, false, false, false, "Bronze Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 0.5, 60.5, AbilityId.LEVITATE, AbilityId.HEATPROOF, AbilityId.HEAVY_METAL, 300, 57, 24, 86, 24, 86, 23, 255, 50, 60, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.BRONZONG, 4, false, false, false, "Bronze Bell Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.3, 187, AbilityId.LEVITATE, AbilityId.HEATPROOF, AbilityId.HEAVY_METAL, 500, 67, 89, 116, 79, 116, 33, 90, 50, 175, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.BONSLY, 4, false, false, false, "Bonsai Pokémon", PokemonType.ROCK, null, 0.5, 15, AbilityId.STURDY, AbilityId.ROCK_HEAD, AbilityId.RATTLED, 290, 50, 80, 95, 10, 45, 10, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MIME_JR, 4, false, false, false, "Mime Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 0.6, 13, AbilityId.SOUNDPROOF, AbilityId.FILTER, AbilityId.TECHNICIAN, 310, 20, 25, 45, 70, 90, 60, 145, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HAPPINY, 4, false, false, false, "Playhouse Pokémon", PokemonType.NORMAL, null, 0.6, 24.4, AbilityId.NATURAL_CURE, AbilityId.SERENE_GRACE, AbilityId.FRIEND_GUARD, 220, 100, 5, 5, 15, 65, 30, 130, 140, 110, GrowthRate.FAST, 0, false), - new PokemonSpecies(SpeciesId.CHATOT, 4, false, false, false, "Music Note Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.5, 1.9, AbilityId.KEEN_EYE, AbilityId.TANGLED_FEET, AbilityId.BIG_PECKS, 411, 76, 65, 45, 92, 42, 91, 30, 35, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SPIRITOMB, 4, false, false, false, "Forbidden Pokémon", PokemonType.GHOST, PokemonType.DARK, 1, 108, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.INFILTRATOR, 485, 50, 92, 108, 92, 108, 35, 100, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GIBLE, 4, false, false, false, "Land Shark Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 0.7, 20.5, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.ROUGH_SKIN, 300, 58, 70, 45, 40, 45, 42, 45, 50, 60, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.GABITE, 4, false, false, false, "Cave Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 1.4, 56, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.ROUGH_SKIN, 410, 68, 90, 65, 50, 55, 82, 45, 50, 144, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.GARCHOMP, 4, false, false, false, "Mach Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, AbilityId.SAND_VEIL, AbilityId.NONE, AbilityId.ROUGH_SKIN, 600, 108, 130, 95, 80, 85, 102, 45, 50, 300, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.DRAGON, PokemonType.GROUND, 1.9, 95, AbilityId.SAND_FORCE, AbilityId.NONE, AbilityId.SAND_FORCE, 700, 108, 170, 115, 120, 95, 92, 45, 50, 300, true), - ), - new PokemonSpecies(SpeciesId.MUNCHLAX, 4, false, false, false, "Big Eater Pokémon", PokemonType.NORMAL, null, 0.6, 105, AbilityId.PICKUP, AbilityId.THICK_FAT, AbilityId.GLUTTONY, 390, 135, 85, 40, 40, 85, 5, 50, 50, 78, GrowthRate.SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.RIOLU, 4, false, false, false, "Emanation Pokémon", PokemonType.FIGHTING, null, 0.7, 20.2, AbilityId.STEADFAST, AbilityId.INNER_FOCUS, AbilityId.PRANKSTER, 285, 40, 70, 40, 35, 40, 60, 75, 50, 57, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.LUCARIO, 4, false, false, false, "Aura Pokémon", PokemonType.FIGHTING, PokemonType.STEEL, 1.2, 54, AbilityId.STEADFAST, AbilityId.INNER_FOCUS, AbilityId.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.STEEL, 1.2, 54, AbilityId.STEADFAST, AbilityId.INNER_FOCUS, AbilityId.JUSTIFIED, 525, 70, 110, 70, 115, 70, 90, 45, 50, 184, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.FIGHTING, PokemonType.STEEL, 1.3, 57.5, AbilityId.ADAPTABILITY, AbilityId.ADAPTABILITY, AbilityId.ADAPTABILITY, 625, 70, 145, 88, 140, 70, 112, 45, 50, 184), - ), - new PokemonSpecies(SpeciesId.HIPPOPOTAS, 4, false, false, false, "Hippo Pokémon", PokemonType.GROUND, null, 0.8, 49.5, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.SAND_FORCE, 330, 68, 72, 78, 38, 42, 32, 140, 50, 66, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.HIPPOWDON, 4, false, false, false, "Heavyweight Pokémon", PokemonType.GROUND, null, 2, 300, AbilityId.SAND_STREAM, AbilityId.NONE, AbilityId.SAND_FORCE, 525, 108, 112, 118, 68, 72, 47, 60, 50, 184, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.SKORUPI, 4, false, false, false, "Scorpion Pokémon", PokemonType.POISON, PokemonType.BUG, 0.8, 12, AbilityId.BATTLE_ARMOR, AbilityId.SNIPER, AbilityId.KEEN_EYE, 330, 40, 50, 90, 30, 55, 65, 120, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.DRAPION, 4, false, false, false, "Ogre Scorpion Pokémon", PokemonType.POISON, PokemonType.DARK, 1.3, 61.5, AbilityId.BATTLE_ARMOR, AbilityId.SNIPER, AbilityId.KEEN_EYE, 500, 70, 90, 110, 60, 75, 95, 45, 50, 175, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.CROAGUNK, 4, false, false, false, "Toxic Mouth Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 0.7, 23, AbilityId.ANTICIPATION, AbilityId.DRY_SKIN, AbilityId.POISON_TOUCH, 300, 48, 61, 40, 61, 40, 50, 140, 100, 60, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.TOXICROAK, 4, false, false, false, "Toxic Mouth Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 1.3, 44.4, AbilityId.ANTICIPATION, AbilityId.DRY_SKIN, AbilityId.POISON_TOUCH, 490, 83, 106, 65, 86, 65, 85, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.CARNIVINE, 4, false, false, false, "Bug Catcher Pokémon", PokemonType.GRASS, null, 1.4, 27, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 454, 74, 100, 72, 90, 72, 46, 200, 70, 159, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.FINNEON, 4, false, false, false, "Wing Fish Pokémon", PokemonType.WATER, null, 0.4, 7, AbilityId.SWIFT_SWIM, AbilityId.STORM_DRAIN, AbilityId.WATER_VEIL, 330, 49, 49, 56, 49, 61, 66, 190, 70, 66, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(SpeciesId.LUMINEON, 4, false, false, false, "Neon Pokémon", PokemonType.WATER, null, 1.2, 24, AbilityId.SWIFT_SWIM, AbilityId.STORM_DRAIN, AbilityId.WATER_VEIL, 460, 69, 69, 76, 69, 86, 91, 75, 70, 161, GrowthRate.ERRATIC, 50, true), - new PokemonSpecies(SpeciesId.MANTYKE, 4, false, false, false, "Kite Pokémon", PokemonType.WATER, PokemonType.FLYING, 1, 65, AbilityId.SWIFT_SWIM, AbilityId.WATER_ABSORB, AbilityId.WATER_VEIL, 345, 45, 20, 50, 60, 120, 50, 25, 50, 69, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.SNOVER, 4, false, false, false, "Frost Tree Pokémon", PokemonType.GRASS, PokemonType.ICE, 1, 50.5, AbilityId.SNOW_WARNING, AbilityId.NONE, AbilityId.SOUNDPROOF, 334, 60, 62, 50, 62, 60, 40, 120, 50, 67, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.ABOMASNOW, 4, false, false, false, "Frost Tree Pokémon", PokemonType.GRASS, PokemonType.ICE, 2.2, 135.5, AbilityId.SNOW_WARNING, AbilityId.NONE, AbilityId.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, GrowthRate.SLOW, 50, true, true, - new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.ICE, 2.2, 135.5, AbilityId.SNOW_WARNING, AbilityId.NONE, AbilityId.SOUNDPROOF, 494, 90, 92, 75, 92, 85, 60, 60, 50, 173, true, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.GRASS, PokemonType.ICE, 2.7, 185, AbilityId.SNOW_WARNING, AbilityId.NONE, AbilityId.SNOW_WARNING, 594, 90, 132, 105, 132, 105, 30, 60, 50, 173, true), - ), - new PokemonSpecies(SpeciesId.WEAVILE, 4, false, false, false, "Sharp Claw Pokémon", PokemonType.DARK, PokemonType.ICE, 1.1, 34, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.PICKPOCKET, 510, 70, 120, 65, 45, 85, 125, 45, 35, 179, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.MAGNEZONE, 4, false, false, false, "Magnet Area Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 1.2, 180, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.ANALYTIC, 535, 70, 70, 115, 130, 90, 60, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.LICKILICKY, 4, false, false, false, "Licking Pokémon", PokemonType.NORMAL, null, 1.7, 140, AbilityId.OWN_TEMPO, AbilityId.OBLIVIOUS, AbilityId.CLOUD_NINE, 515, 110, 85, 95, 80, 95, 50, 30, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.RHYPERIOR, 4, false, false, false, "Drill Pokémon", PokemonType.GROUND, PokemonType.ROCK, 2.4, 282.8, AbilityId.LIGHTNING_ROD, AbilityId.SOLID_ROCK, AbilityId.RECKLESS, 535, 115, 140, 130, 55, 55, 40, 30, 50, 268, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.TANGROWTH, 4, false, false, false, "Vine Pokémon", PokemonType.GRASS, null, 2, 128.6, AbilityId.CHLOROPHYLL, AbilityId.LEAF_GUARD, AbilityId.REGENERATOR, 535, 100, 100, 125, 110, 50, 50, 30, 50, 187, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.ELECTIVIRE, 4, false, false, false, "Thunderbolt Pokémon", PokemonType.ELECTRIC, null, 1.8, 138.6, AbilityId.MOTOR_DRIVE, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 540, 75, 123, 67, 95, 85, 95, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(SpeciesId.MAGMORTAR, 4, false, false, false, "Blast Pokémon", PokemonType.FIRE, null, 1.6, 68, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.VITAL_SPIRIT, 540, 75, 95, 67, 125, 95, 83, 30, 50, 270, GrowthRate.MEDIUM_FAST, 75, false), - new PokemonSpecies(SpeciesId.TOGEKISS, 4, false, false, false, "Jubilee Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 1.5, 38, AbilityId.HUSTLE, AbilityId.SERENE_GRACE, AbilityId.SUPER_LUCK, 545, 85, 50, 95, 120, 115, 80, 30, 50, 273, GrowthRate.FAST, 87.5, false), - new PokemonSpecies(SpeciesId.YANMEGA, 4, false, false, false, "Ogre Darner Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.9, 51.5, AbilityId.SPEED_BOOST, AbilityId.TINTED_LENS, AbilityId.FRISK, 515, 86, 76, 86, 116, 56, 95, 30, 70, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LEAFEON, 4, false, false, false, "Verdant Pokémon", PokemonType.GRASS, null, 1, 25.5, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.CHLOROPHYLL, 525, 65, 110, 130, 60, 65, 95, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.GLACEON, 4, false, false, false, "Fresh Snow Pokémon", PokemonType.ICE, null, 0.8, 25.9, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.ICE_BODY, 525, 65, 60, 110, 130, 95, 65, 45, 35, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.GLISCOR, 4, false, false, false, "Fang Scorpion Pokémon", PokemonType.GROUND, PokemonType.FLYING, 2, 42.5, AbilityId.HYPER_CUTTER, AbilityId.SAND_VEIL, AbilityId.POISON_HEAL, 510, 75, 95, 125, 45, 75, 95, 30, 70, 179, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.MAMOSWINE, 4, false, false, false, "Twin Tusk Pokémon", PokemonType.ICE, PokemonType.GROUND, 2.5, 291, AbilityId.OBLIVIOUS, AbilityId.SNOW_CLOAK, AbilityId.THICK_FAT, 530, 110, 130, 80, 70, 60, 80, 50, 50, 265, GrowthRate.SLOW, 50, true), - new PokemonSpecies(SpeciesId.PORYGON_Z, 4, false, false, false, "Virtual Pokémon", PokemonType.NORMAL, null, 0.9, 34, AbilityId.ADAPTABILITY, AbilityId.DOWNLOAD, AbilityId.ANALYTIC, 535, 85, 80, 70, 135, 75, 90, 30, 50, 268, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.GALLADE, 4, false, false, false, "Blade Pokémon", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, AbilityId.STEADFAST, AbilityId.SHARPNESS, AbilityId.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 52, AbilityId.STEADFAST, AbilityId.SHARPNESS, AbilityId.JUSTIFIED, 518, 68, 125, 65, 65, 115, 80, 45, 35, 259, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.PSYCHIC, PokemonType.FIGHTING, 1.6, 56.4, AbilityId.INNER_FOCUS, AbilityId.INNER_FOCUS, AbilityId.INNER_FOCUS, 618, 68, 165, 95, 65, 115, 110, 45, 35, 259), - ), - new PokemonSpecies(SpeciesId.PROBOPASS, 4, false, false, false, "Compass Pokémon", PokemonType.ROCK, PokemonType.STEEL, 1.4, 340, AbilityId.STURDY, AbilityId.MAGNET_PULL, AbilityId.SAND_FORCE, 525, 60, 55, 145, 75, 150, 40, 60, 70, 184, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DUSKNOIR, 4, false, false, false, "Gripper Pokémon", PokemonType.GHOST, null, 2.2, 106.6, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.FRISK, 525, 45, 100, 135, 65, 135, 45, 45, 35, 263, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.FROSLASS, 4, false, false, false, "Snow Land Pokémon", PokemonType.ICE, PokemonType.GHOST, 1.3, 26.6, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.CURSED_BODY, 480, 70, 80, 70, 80, 70, 110, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(SpeciesId.ROTOM, 4, false, false, false, "Plasma Pokémon", PokemonType.ELECTRIC, PokemonType.GHOST, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Normal", "", PokemonType.ELECTRIC, PokemonType.GHOST, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 440, 50, 50, 77, 95, 77, 91, 45, 50, 154, false, null, true), - new PokemonForm("Heat", "heat", PokemonType.ELECTRIC, PokemonType.FIRE, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - new PokemonForm("Wash", "wash", PokemonType.ELECTRIC, PokemonType.WATER, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - new PokemonForm("Frost", "frost", PokemonType.ELECTRIC, PokemonType.ICE, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - new PokemonForm("Fan", "fan", PokemonType.ELECTRIC, PokemonType.FLYING, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - new PokemonForm("Mow", "mow", PokemonType.ELECTRIC, PokemonType.GRASS, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 520, 50, 65, 107, 105, 107, 86, 45, 50, 182, false, null, true), - ), - new PokemonSpecies(SpeciesId.UXIE, 4, true, false, false, "Knowledge Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 580, 75, 75, 130, 75, 130, 95, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.MESPRIT, 4, true, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 580, 80, 105, 105, 105, 105, 80, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.AZELF, 4, true, false, false, "Willpower Pokémon", PokemonType.PSYCHIC, null, 0.3, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 580, 75, 125, 70, 125, 70, 115, 3, 140, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.DIALGA, 4, false, true, false, "Temporal Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 5.4, 683, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.DRAGON, 5.4, 683, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 100, 120, 120, 150, 100, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", PokemonType.STEEL, PokemonType.DRAGON, 7, 848.7, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 100, 100, 120, 150, 120, 90, 3, 0, 340), - ), - new PokemonSpecies(SpeciesId.PALKIA, 4, false, true, false, "Spatial Pokémon", PokemonType.WATER, PokemonType.DRAGON, 4.2, 336, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DRAGON, 4.2, 336, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 90, 120, 100, 150, 120, 100, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", PokemonType.WATER, PokemonType.DRAGON, 6.3, 659, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 90, 100, 100, 150, 120, 120, 3, 0, 340), - ), - new PokemonSpecies(SpeciesId.HEATRAN, 4, true, false, false, "Lava Dome Pokémon", PokemonType.FIRE, PokemonType.STEEL, 1.7, 430, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.FLAME_BODY, 600, 91, 90, 106, 130, 106, 77, 3, 100, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.REGIGIGAS, 4, true, false, false, "Colossal Pokémon", PokemonType.NORMAL, null, 3.7, 420, AbilityId.SLOW_START, AbilityId.NONE, AbilityId.NORMALIZE, 670, 110, 160, 110, 80, 110, 100, 3, 0, 335, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.GIRATINA, 4, false, true, false, "Renegade Pokémon", PokemonType.GHOST, PokemonType.DRAGON, 4.5, 750, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Altered Forme", "altered", PokemonType.GHOST, PokemonType.DRAGON, 4.5, 750, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.TELEPATHY, 680, 150, 100, 120, 100, 120, 90, 3, 0, 340, false, null, true), - new PokemonForm("Origin Forme", "origin", PokemonType.GHOST, PokemonType.DRAGON, 6.9, 650, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.LEVITATE, 680, 150, 120, 100, 120, 100, 90, 3, 0, 340), - ), - new PokemonSpecies(SpeciesId.CRESSELIA, 4, true, false, false, "Lunar Pokémon", PokemonType.PSYCHIC, null, 1.5, 85.6, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 580, 120, 70, 110, 75, 120, 85, 3, 100, 300, GrowthRate.SLOW, 0, false), - new PokemonSpecies(SpeciesId.PHIONE, 4, false, false, true, "Sea Drifter Pokémon", PokemonType.WATER, null, 0.4, 3.1, AbilityId.HYDRATION, AbilityId.NONE, AbilityId.NONE, 480, 80, 80, 80, 80, 80, 80, 30, 70, 240, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.MANAPHY, 4, false, false, true, "Seafaring Pokémon", PokemonType.WATER, null, 0.3, 1.4, AbilityId.HYDRATION, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 70, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.DARKRAI, 4, false, false, true, "Pitch-Black Pokémon", PokemonType.DARK, null, 1.5, 50.5, AbilityId.BAD_DREAMS, AbilityId.NONE, AbilityId.NONE, 600, 70, 90, 90, 135, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SHAYMIN, 4, false, false, true, "Gratitude Pokémon", PokemonType.GRASS, null, 0.2, 2.1, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, GrowthRate.MEDIUM_SLOW, null, false, true, - new PokemonForm("Land Forme", "land", PokemonType.GRASS, null, 0.2, 2.1, AbilityId.NATURAL_CURE, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 45, 100, 300, false, null, true), - new PokemonForm("Sky Forme", "sky", PokemonType.GRASS, PokemonType.FLYING, 0.4, 5.2, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 103, 75, 120, 75, 127, 45, 100, 300), - ), - new PokemonSpecies(SpeciesId.ARCEUS, 4, false, false, true, "Alpha Pokémon", PokemonType.NORMAL, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "normal", PokemonType.NORMAL, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, true), - new PokemonForm("Fighting", "fighting", PokemonType.FIGHTING, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Flying", "flying", PokemonType.FLYING, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Poison", "poison", PokemonType.POISON, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Ground", "ground", PokemonType.GROUND, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Rock", "rock", PokemonType.ROCK, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Bug", "bug", PokemonType.BUG, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Ghost", "ghost", PokemonType.GHOST, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Steel", "steel", PokemonType.STEEL, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Fire", "fire", PokemonType.FIRE, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Water", "water", PokemonType.WATER, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Grass", "grass", PokemonType.GRASS, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Electric", "electric", PokemonType.ELECTRIC, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Psychic", "psychic", PokemonType.PSYCHIC, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Ice", "ice", PokemonType.ICE, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Dragon", "dragon", PokemonType.DRAGON, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Dark", "dark", PokemonType.DARK, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("Fairy", "fairy", PokemonType.FAIRY, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360), - new PokemonForm("???", "unknown", PokemonType.UNKNOWN, null, 3.2, 320, AbilityId.MULTITYPE, AbilityId.NONE, AbilityId.NONE, 720, 120, 120, 120, 120, 120, 120, 3, 0, 360, false, null, false, true), - ), - new PokemonSpecies(SpeciesId.VICTINI, 5, false, false, true, "Victory Pokémon", PokemonType.PSYCHIC, PokemonType.FIRE, 0.4, 4, AbilityId.VICTORY_STAR, AbilityId.NONE, AbilityId.NONE, 600, 100, 100, 100, 100, 100, 100, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SNIVY, 5, false, false, false, "Grass Snake Pokémon", PokemonType.GRASS, null, 0.6, 8.1, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CONTRARY, 308, 45, 45, 55, 45, 55, 63, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.SERVINE, 5, false, false, false, "Grass Snake Pokémon", PokemonType.GRASS, null, 0.8, 16, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CONTRARY, 413, 60, 60, 75, 60, 75, 83, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.SERPERIOR, 5, false, false, false, "Regal Pokémon", PokemonType.GRASS, null, 3.3, 63, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.CONTRARY, 528, 75, 75, 95, 75, 95, 113, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.TEPIG, 5, false, false, false, "Fire Pig Pokémon", PokemonType.FIRE, null, 0.5, 9.9, AbilityId.BLAZE, AbilityId.NONE, AbilityId.THICK_FAT, 308, 65, 63, 45, 45, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.PIGNITE, 5, false, false, false, "Fire Pig Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1, 55.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.THICK_FAT, 418, 90, 93, 55, 70, 55, 55, 45, 70, 146, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.EMBOAR, 5, false, false, false, "Mega Fire Pig Pokémon", PokemonType.FIRE, PokemonType.FIGHTING, 1.6, 150, AbilityId.BLAZE, AbilityId.NONE, AbilityId.RECKLESS, 528, 110, 123, 65, 100, 65, 65, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.OSHAWOTT, 5, false, false, false, "Sea Otter Pokémon", PokemonType.WATER, null, 0.5, 5.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHELL_ARMOR, 308, 55, 55, 45, 63, 45, 45, 45, 70, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.DEWOTT, 5, false, false, false, "Discipline Pokémon", PokemonType.WATER, null, 0.8, 24.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHELL_ARMOR, 413, 75, 75, 60, 83, 60, 60, 45, 70, 145, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.SAMUROTT, 5, false, false, false, "Formidable Pokémon", PokemonType.WATER, null, 1.5, 94.6, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHELL_ARMOR, 528, 95, 100, 85, 108, 70, 70, 45, 70, 264, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.PATRAT, 5, false, false, false, "Scout Pokémon", PokemonType.NORMAL, null, 0.5, 11.6, AbilityId.RUN_AWAY, AbilityId.KEEN_EYE, AbilityId.ANALYTIC, 255, 45, 55, 39, 35, 39, 42, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WATCHOG, 5, false, false, false, "Lookout Pokémon", PokemonType.NORMAL, null, 1.1, 27, AbilityId.ILLUMINATE, AbilityId.KEEN_EYE, AbilityId.ANALYTIC, 420, 60, 85, 69, 60, 69, 77, 255, 70, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LILLIPUP, 5, false, false, false, "Puppy Pokémon", PokemonType.NORMAL, null, 0.4, 4.1, AbilityId.VITAL_SPIRIT, AbilityId.PICKUP, AbilityId.RUN_AWAY, 275, 45, 60, 45, 25, 45, 55, 255, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.HERDIER, 5, false, false, false, "Loyal Dog Pokémon", PokemonType.NORMAL, null, 0.9, 14.7, AbilityId.INTIMIDATE, AbilityId.SAND_RUSH, AbilityId.SCRAPPY, 370, 65, 80, 65, 35, 65, 60, 120, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.STOUTLAND, 5, false, false, false, "Big-Hearted Pokémon", PokemonType.NORMAL, null, 1.2, 61, AbilityId.INTIMIDATE, AbilityId.SAND_RUSH, AbilityId.SCRAPPY, 500, 85, 110, 90, 45, 90, 80, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.PURRLOIN, 5, false, false, false, "Devious Pokémon", PokemonType.DARK, null, 0.4, 10.1, AbilityId.LIMBER, AbilityId.UNBURDEN, AbilityId.PRANKSTER, 281, 41, 50, 37, 50, 37, 66, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LIEPARD, 5, false, false, false, "Cruel Pokémon", PokemonType.DARK, null, 1.1, 37.5, AbilityId.LIMBER, AbilityId.UNBURDEN, AbilityId.PRANKSTER, 446, 64, 88, 50, 88, 50, 106, 90, 50, 156, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PANSAGE, 5, false, false, false, "Grass Monkey Pokémon", PokemonType.GRASS, null, 0.6, 10.5, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.OVERGROW, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.SIMISAGE, 5, false, false, false, "Thorn Monkey Pokémon", PokemonType.GRASS, null, 1.1, 30.5, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.OVERGROW, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.PANSEAR, 5, false, false, false, "High Temp Pokémon", PokemonType.FIRE, null, 0.6, 11, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.BLAZE, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.SIMISEAR, 5, false, false, false, "Ember Pokémon", PokemonType.FIRE, null, 1, 28, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.BLAZE, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.PANPOUR, 5, false, false, false, "Spray Pokémon", PokemonType.WATER, null, 0.6, 13.5, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.TORRENT, 316, 50, 53, 48, 53, 48, 64, 190, 70, 63, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.SIMIPOUR, 5, false, false, false, "Geyser Pokémon", PokemonType.WATER, null, 1, 29, AbilityId.GLUTTONY, AbilityId.NONE, AbilityId.TORRENT, 498, 75, 98, 63, 98, 63, 101, 75, 70, 174, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.MUNNA, 5, false, false, false, "Dream Eater Pokémon", PokemonType.PSYCHIC, null, 0.6, 23.3, AbilityId.FOREWARN, AbilityId.SYNCHRONIZE, AbilityId.TELEPATHY, 292, 76, 25, 45, 67, 55, 24, 190, 50, 58, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.MUSHARNA, 5, false, false, false, "Drowsing Pokémon", PokemonType.PSYCHIC, null, 1.1, 60.5, AbilityId.FOREWARN, AbilityId.SYNCHRONIZE, AbilityId.TELEPATHY, 487, 116, 55, 85, 107, 95, 29, 75, 50, 170, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.PIDOVE, 5, false, false, false, "Tiny Pigeon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 2.1, AbilityId.BIG_PECKS, AbilityId.SUPER_LUCK, AbilityId.RIVALRY, 264, 50, 55, 50, 36, 30, 43, 255, 50, 53, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.TRANQUILL, 5, false, false, false, "Wild Pigeon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 15, AbilityId.BIG_PECKS, AbilityId.SUPER_LUCK, AbilityId.RIVALRY, 358, 62, 77, 62, 50, 42, 65, 120, 50, 125, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.UNFEZANT, 5, false, false, false, "Proud Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.2, 29, AbilityId.BIG_PECKS, AbilityId.SUPER_LUCK, AbilityId.RIVALRY, 488, 80, 115, 80, 65, 55, 93, 45, 50, 244, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.BLITZLE, 5, false, false, false, "Electrified Pokémon", PokemonType.ELECTRIC, null, 0.8, 29.8, AbilityId.LIGHTNING_ROD, AbilityId.MOTOR_DRIVE, AbilityId.SAP_SIPPER, 295, 45, 60, 32, 50, 32, 76, 190, 70, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ZEBSTRIKA, 5, false, false, false, "Thunderbolt Pokémon", PokemonType.ELECTRIC, null, 1.6, 79.5, AbilityId.LIGHTNING_ROD, AbilityId.MOTOR_DRIVE, AbilityId.SAP_SIPPER, 497, 75, 100, 63, 80, 63, 116, 75, 70, 174, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ROGGENROLA, 5, false, false, false, "Mantle Pokémon", PokemonType.ROCK, null, 0.4, 18, AbilityId.STURDY, AbilityId.WEAK_ARMOR, AbilityId.SAND_FORCE, 280, 55, 75, 85, 25, 25, 15, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.BOLDORE, 5, false, false, false, "Ore Pokémon", PokemonType.ROCK, null, 0.9, 102, AbilityId.STURDY, AbilityId.WEAK_ARMOR, AbilityId.SAND_FORCE, 390, 70, 105, 105, 50, 40, 20, 120, 50, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GIGALITH, 5, false, false, false, "Compressed Pokémon", PokemonType.ROCK, null, 1.7, 260, AbilityId.STURDY, AbilityId.SAND_STREAM, AbilityId.SAND_FORCE, 515, 85, 135, 130, 60, 80, 25, 45, 50, 258, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.WOOBAT, 5, false, false, false, "Bat Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.4, 2.1, AbilityId.UNAWARE, AbilityId.KLUTZ, AbilityId.SIMPLE, 323, 65, 45, 43, 55, 43, 72, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SWOOBAT, 5, false, false, false, "Courting Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 0.9, 10.5, AbilityId.UNAWARE, AbilityId.KLUTZ, AbilityId.SIMPLE, 425, 67, 57, 55, 77, 55, 114, 45, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DRILBUR, 5, false, false, false, "Mole Pokémon", PokemonType.GROUND, null, 0.3, 8.5, AbilityId.SAND_RUSH, AbilityId.SAND_FORCE, AbilityId.MOLD_BREAKER, 328, 60, 85, 40, 30, 45, 68, 120, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.EXCADRILL, 5, false, false, false, "Subterrene Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 40.4, AbilityId.SAND_RUSH, AbilityId.SAND_FORCE, AbilityId.MOLD_BREAKER, 508, 110, 135, 60, 50, 65, 88, 60, 50, 178, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.AUDINO, 5, false, false, false, "Hearing Pokémon", PokemonType.NORMAL, null, 1.1, 31, AbilityId.HEALER, AbilityId.REGENERATOR, AbilityId.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, GrowthRate.FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.NORMAL, null, 1.1, 31, AbilityId.HEALER, AbilityId.REGENERATOR, AbilityId.KLUTZ, 445, 103, 60, 86, 60, 86, 50, 255, 50, 390, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.NORMAL, PokemonType.FAIRY, 1.5, 32, AbilityId.REGENERATOR, AbilityId.REGENERATOR, AbilityId.REGENERATOR, 545, 103, 60, 126, 80, 126, 50, 255, 50, 390), //Custom Ability, base form Hidden Ability - ), - new PokemonSpecies(SpeciesId.TIMBURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 0.6, 12.5, AbilityId.GUTS, AbilityId.SHEER_FORCE, AbilityId.IRON_FIST, 305, 75, 80, 55, 25, 35, 35, 180, 70, 61, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(SpeciesId.GURDURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 1.2, 40, AbilityId.GUTS, AbilityId.SHEER_FORCE, AbilityId.IRON_FIST, 405, 85, 105, 85, 40, 50, 40, 90, 50, 142, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(SpeciesId.CONKELDURR, 5, false, false, false, "Muscular Pokémon", PokemonType.FIGHTING, null, 1.4, 87, AbilityId.GUTS, AbilityId.SHEER_FORCE, AbilityId.IRON_FIST, 505, 105, 140, 95, 55, 65, 45, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 75, false), - new PokemonSpecies(SpeciesId.TYMPOLE, 5, false, false, false, "Tadpole Pokémon", PokemonType.WATER, null, 0.5, 4.5, AbilityId.SWIFT_SWIM, AbilityId.HYDRATION, AbilityId.WATER_ABSORB, 294, 50, 50, 40, 50, 40, 64, 255, 50, 59, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.PALPITOAD, 5, false, false, false, "Vibration Pokémon", PokemonType.WATER, PokemonType.GROUND, 0.8, 17, AbilityId.SWIFT_SWIM, AbilityId.HYDRATION, AbilityId.WATER_ABSORB, 384, 75, 65, 55, 65, 55, 69, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SEISMITOAD, 5, false, false, false, "Vibration Pokémon", PokemonType.WATER, PokemonType.GROUND, 1.5, 62, AbilityId.SWIFT_SWIM, AbilityId.POISON_TOUCH, AbilityId.WATER_ABSORB, 509, 105, 95, 75, 85, 75, 74, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.THROH, 5, false, false, false, "Judo Pokémon", PokemonType.FIGHTING, null, 1.3, 55.5, AbilityId.GUTS, AbilityId.INNER_FOCUS, AbilityId.MOLD_BREAKER, 465, 120, 100, 85, 30, 85, 45, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.SAWK, 5, false, false, false, "Karate Pokémon", PokemonType.FIGHTING, null, 1.4, 51, AbilityId.STURDY, AbilityId.INNER_FOCUS, AbilityId.MOLD_BREAKER, 465, 75, 125, 75, 30, 75, 85, 45, 50, 163, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.SEWADDLE, 5, false, false, false, "Sewing Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.3, 2.5, AbilityId.SWARM, AbilityId.CHLOROPHYLL, AbilityId.OVERCOAT, 310, 45, 53, 70, 40, 60, 42, 255, 70, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SWADLOON, 5, false, false, false, "Leaf-Wrapped Pokémon", PokemonType.BUG, PokemonType.GRASS, 0.5, 7.3, AbilityId.LEAF_GUARD, AbilityId.CHLOROPHYLL, AbilityId.OVERCOAT, 380, 55, 63, 90, 50, 80, 42, 120, 70, 133, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.LEAVANNY, 5, false, false, false, "Nurturing Pokémon", PokemonType.BUG, PokemonType.GRASS, 1.2, 20.5, AbilityId.SWARM, AbilityId.CHLOROPHYLL, AbilityId.OVERCOAT, 500, 75, 103, 80, 70, 80, 92, 45, 70, 250, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.VENIPEDE, 5, false, false, false, "Centipede Pokémon", PokemonType.BUG, PokemonType.POISON, 0.4, 5.3, AbilityId.POISON_POINT, AbilityId.SWARM, AbilityId.SPEED_BOOST, 260, 30, 45, 59, 30, 39, 57, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.WHIRLIPEDE, 5, false, false, false, "Curlipede Pokémon", PokemonType.BUG, PokemonType.POISON, 1.2, 58.5, AbilityId.POISON_POINT, AbilityId.SWARM, AbilityId.SPEED_BOOST, 360, 40, 55, 99, 40, 79, 47, 120, 50, 126, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SCOLIPEDE, 5, false, false, false, "Megapede Pokémon", PokemonType.BUG, PokemonType.POISON, 2.5, 200.5, AbilityId.POISON_POINT, AbilityId.SWARM, AbilityId.SPEED_BOOST, 485, 60, 100, 89, 55, 69, 112, 45, 50, 243, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.COTTONEE, 5, false, false, false, "Cotton Puff Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.3, 0.6, AbilityId.PRANKSTER, AbilityId.INFILTRATOR, AbilityId.CHLOROPHYLL, 280, 40, 27, 60, 37, 50, 66, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WHIMSICOTT, 5, false, false, false, "Windveiled Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.7, 6.6, AbilityId.PRANKSTER, AbilityId.INFILTRATOR, AbilityId.CHLOROPHYLL, 480, 60, 67, 85, 77, 75, 116, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PETILIL, 5, false, false, false, "Bulb Pokémon", PokemonType.GRASS, null, 0.5, 6.6, AbilityId.CHLOROPHYLL, AbilityId.OWN_TEMPO, AbilityId.LEAF_GUARD, 280, 45, 35, 50, 70, 50, 30, 190, 50, 56, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(SpeciesId.LILLIGANT, 5, false, false, false, "Flowering Pokémon", PokemonType.GRASS, null, 1.1, 16.3, AbilityId.CHLOROPHYLL, AbilityId.OWN_TEMPO, AbilityId.LEAF_GUARD, 480, 70, 60, 75, 110, 75, 90, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(SpeciesId.BASCULIN, 5, false, false, false, "Hostile Pokémon", PokemonType.WATER, null, 1, 18, AbilityId.RECKLESS, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 190, 50, 161, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Red-Striped Form", "red-striped", PokemonType.WATER, null, 1, 18, AbilityId.RECKLESS, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 190, 50, 161, false, null, true), - new PokemonForm("Blue-Striped Form", "blue-striped", PokemonType.WATER, null, 1, 18, AbilityId.ROCK_HEAD, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 190, 50, 161, false, null, true), - new PokemonForm("White-Striped Form", "white-striped", PokemonType.WATER, null, 1, 18, AbilityId.RATTLED, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 460, 70, 92, 65, 80, 55, 98, 190, 50, 161, false, null, true), - ), - new PokemonSpecies(SpeciesId.SANDILE, 5, false, false, false, "Desert Croc Pokémon", PokemonType.GROUND, PokemonType.DARK, 0.7, 15.2, AbilityId.INTIMIDATE, AbilityId.MOXIE, AbilityId.ANGER_POINT, 292, 50, 72, 35, 35, 35, 65, 180, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.KROKOROK, 5, false, false, false, "Desert Croc Pokémon", PokemonType.GROUND, PokemonType.DARK, 1, 33.4, AbilityId.INTIMIDATE, AbilityId.MOXIE, AbilityId.ANGER_POINT, 351, 60, 82, 45, 45, 45, 74, 90, 50, 123, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.KROOKODILE, 5, false, false, false, "Intimidation Pokémon", PokemonType.GROUND, PokemonType.DARK, 1.5, 96.3, AbilityId.INTIMIDATE, AbilityId.MOXIE, AbilityId.ANGER_POINT, 519, 95, 117, 80, 65, 70, 92, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.DARUMAKA, 5, false, false, false, "Zen Charm Pokémon", PokemonType.FIRE, null, 0.6, 37.5, AbilityId.HUSTLE, AbilityId.NONE, AbilityId.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.DARMANITAN, 5, false, false, false, "Blazing Pokémon", PokemonType.FIRE, null, 1.3, 92.9, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Standard Mode", "", PokemonType.FIRE, null, 1.3, 92.9, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), - new PokemonForm("Zen Mode", "zen", PokemonType.FIRE, PokemonType.PSYCHIC, 1.3, 92.9, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.ZEN_MODE, 540, 105, 30, 105, 140, 105, 55, 60, 50, 189), - ), - new PokemonSpecies(SpeciesId.MARACTUS, 5, false, false, false, "Cactus Pokémon", PokemonType.GRASS, null, 1, 28, AbilityId.WATER_ABSORB, AbilityId.CHLOROPHYLL, AbilityId.STORM_DRAIN, 461, 75, 86, 67, 106, 67, 60, 255, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DWEBBLE, 5, false, false, false, "Rock Inn Pokémon", PokemonType.BUG, PokemonType.ROCK, 0.3, 14.5, AbilityId.STURDY, AbilityId.SHELL_ARMOR, AbilityId.WEAK_ARMOR, 325, 50, 65, 85, 35, 35, 55, 190, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CRUSTLE, 5, false, false, false, "Stone Home Pokémon", PokemonType.BUG, PokemonType.ROCK, 1.4, 200, AbilityId.STURDY, AbilityId.SHELL_ARMOR, AbilityId.WEAK_ARMOR, 485, 70, 105, 125, 65, 75, 45, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SCRAGGY, 5, false, false, false, "Shedding Pokémon", PokemonType.DARK, PokemonType.FIGHTING, 0.6, 11.8, AbilityId.SHED_SKIN, AbilityId.MOXIE, AbilityId.INTIMIDATE, 348, 50, 75, 70, 35, 70, 48, 180, 35, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SCRAFTY, 5, false, false, false, "Hoodlum Pokémon", PokemonType.DARK, PokemonType.FIGHTING, 1.1, 30, AbilityId.SHED_SKIN, AbilityId.MOXIE, AbilityId.INTIMIDATE, 488, 65, 90, 115, 45, 115, 58, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SIGILYPH, 5, false, false, false, "Avianoid Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.4, 14, AbilityId.WONDER_SKIN, AbilityId.MAGIC_GUARD, AbilityId.TINTED_LENS, 490, 72, 58, 80, 103, 80, 97, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.YAMASK, 5, false, false, false, "Spirit Pokémon", PokemonType.GHOST, null, 0.5, 1.5, AbilityId.MUMMY, AbilityId.NONE, AbilityId.NONE, 303, 38, 30, 85, 55, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.COFAGRIGUS, 5, false, false, false, "Coffin Pokémon", PokemonType.GHOST, null, 1.7, 76.5, AbilityId.MUMMY, AbilityId.NONE, AbilityId.NONE, 483, 58, 50, 145, 95, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TIRTOUGA, 5, false, false, false, "Prototurtle Pokémon", PokemonType.WATER, PokemonType.ROCK, 0.7, 16.5, AbilityId.SOLID_ROCK, AbilityId.STURDY, AbilityId.SWIFT_SWIM, 355, 54, 78, 103, 53, 45, 22, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.CARRACOSTA, 5, false, false, false, "Prototurtle Pokémon", PokemonType.WATER, PokemonType.ROCK, 1.2, 81, AbilityId.SOLID_ROCK, AbilityId.STURDY, AbilityId.SWIFT_SWIM, 495, 74, 108, 133, 83, 65, 32, 45, 50, 173, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.ARCHEN, 5, false, false, false, "First Bird Pokémon", PokemonType.ROCK, PokemonType.FLYING, 0.5, 9.5, AbilityId.DEFEATIST, AbilityId.NONE, AbilityId.WIMP_OUT, 401, 55, 112, 45, 74, 45, 70, 45, 50, 71, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden - new PokemonSpecies(SpeciesId.ARCHEOPS, 5, false, false, false, "First Bird Pokémon", PokemonType.ROCK, PokemonType.FLYING, 1.4, 32, AbilityId.DEFEATIST, AbilityId.NONE, AbilityId.EMERGENCY_EXIT, 567, 75, 140, 65, 112, 65, 110, 45, 50, 177, GrowthRate.MEDIUM_FAST, 87.5, false), //Custom Hidden - new PokemonSpecies(SpeciesId.TRUBBISH, 5, false, false, false, "Trash Bag Pokémon", PokemonType.POISON, null, 0.6, 31, AbilityId.STENCH, AbilityId.STICKY_HOLD, AbilityId.AFTERMATH, 329, 50, 50, 62, 40, 62, 65, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GARBODOR, 5, false, false, false, "Trash Heap Pokémon", PokemonType.POISON, null, 1.9, 107.3, AbilityId.STENCH, AbilityId.WEAK_ARMOR, AbilityId.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.POISON, null, 1.9, 107.3, AbilityId.STENCH, AbilityId.WEAK_ARMOR, AbilityId.AFTERMATH, 474, 80, 95, 82, 60, 82, 75, 60, 50, 166, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.POISON, PokemonType.STEEL, 21, 999.9, AbilityId.TOXIC_DEBRIS, AbilityId.TOXIC_DEBRIS, AbilityId.TOXIC_DEBRIS, 574, 115, 121, 102, 81, 102, 53, 60, 50, 166), - ), - new PokemonSpecies(SpeciesId.ZORUA, 5, false, false, false, "Tricky Fox Pokémon", PokemonType.DARK, null, 0.7, 12.5, AbilityId.ILLUSION, AbilityId.NONE, AbilityId.NONE, 330, 40, 65, 40, 80, 40, 65, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.ZOROARK, 5, false, false, false, "Illusion Fox Pokémon", PokemonType.DARK, null, 1.6, 81.1, AbilityId.ILLUSION, AbilityId.NONE, AbilityId.NONE, 510, 60, 105, 60, 120, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.MINCCINO, 5, false, false, false, "Chinchilla Pokémon", PokemonType.NORMAL, null, 0.4, 5.8, AbilityId.CUTE_CHARM, AbilityId.TECHNICIAN, AbilityId.SKILL_LINK, 300, 55, 50, 40, 40, 40, 75, 255, 50, 60, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.CINCCINO, 5, false, false, false, "Scarf Pokémon", PokemonType.NORMAL, null, 0.5, 7.5, AbilityId.CUTE_CHARM, AbilityId.TECHNICIAN, AbilityId.SKILL_LINK, 470, 75, 95, 60, 65, 60, 115, 60, 50, 165, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.GOTHITA, 5, false, false, false, "Fixation Pokémon", PokemonType.PSYCHIC, null, 0.4, 5.8, AbilityId.FRISK, AbilityId.COMPETITIVE, AbilityId.SHADOW_TAG, 290, 45, 30, 50, 55, 65, 45, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(SpeciesId.GOTHORITA, 5, false, false, false, "Manipulate Pokémon", PokemonType.PSYCHIC, null, 0.7, 18, AbilityId.FRISK, AbilityId.COMPETITIVE, AbilityId.SHADOW_TAG, 390, 60, 45, 70, 75, 85, 55, 100, 50, 137, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(SpeciesId.GOTHITELLE, 5, false, false, false, "Astral Body Pokémon", PokemonType.PSYCHIC, null, 1.5, 44, AbilityId.FRISK, AbilityId.COMPETITIVE, AbilityId.SHADOW_TAG, 490, 70, 55, 95, 95, 110, 65, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 25, false), - new PokemonSpecies(SpeciesId.SOLOSIS, 5, false, false, false, "Cell Pokémon", PokemonType.PSYCHIC, null, 0.3, 1, AbilityId.OVERCOAT, AbilityId.MAGIC_GUARD, AbilityId.REGENERATOR, 290, 45, 30, 40, 105, 50, 20, 200, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.DUOSION, 5, false, false, false, "Mitosis Pokémon", PokemonType.PSYCHIC, null, 0.6, 8, AbilityId.OVERCOAT, AbilityId.MAGIC_GUARD, AbilityId.REGENERATOR, 370, 65, 40, 50, 125, 60, 30, 100, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.REUNICLUS, 5, false, false, false, "Multiplying Pokémon", PokemonType.PSYCHIC, null, 1, 20.1, AbilityId.OVERCOAT, AbilityId.MAGIC_GUARD, AbilityId.REGENERATOR, 490, 110, 65, 75, 125, 85, 30, 50, 50, 245, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.DUCKLETT, 5, false, false, false, "Water Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 0.5, 5.5, AbilityId.KEEN_EYE, AbilityId.BIG_PECKS, AbilityId.HYDRATION, 305, 62, 44, 50, 44, 50, 55, 190, 70, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SWANNA, 5, false, false, false, "White Bird Pokémon", PokemonType.WATER, PokemonType.FLYING, 1.3, 24.2, AbilityId.KEEN_EYE, AbilityId.BIG_PECKS, AbilityId.HYDRATION, 473, 75, 87, 63, 87, 63, 98, 45, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.VANILLITE, 5, false, false, false, "Fresh Snow Pokémon", PokemonType.ICE, null, 0.4, 5.7, AbilityId.ICE_BODY, AbilityId.SNOW_CLOAK, AbilityId.WEAK_ARMOR, 305, 36, 50, 50, 65, 60, 44, 255, 50, 61, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.VANILLISH, 5, false, false, false, "Icy Snow Pokémon", PokemonType.ICE, null, 1.1, 41, AbilityId.ICE_BODY, AbilityId.SNOW_CLOAK, AbilityId.WEAK_ARMOR, 395, 51, 65, 65, 80, 75, 59, 120, 50, 138, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.VANILLUXE, 5, false, false, false, "Snowstorm Pokémon", PokemonType.ICE, null, 1.3, 57.5, AbilityId.ICE_BODY, AbilityId.SNOW_WARNING, AbilityId.WEAK_ARMOR, 535, 71, 95, 85, 110, 95, 79, 45, 50, 268, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.DEERLING, 5, false, false, false, "Season Pokémon", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Spring Form", "spring", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Summer Form", "summer", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Autumn Form", "autumn", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - new PokemonForm("Winter Form", "winter", PokemonType.NORMAL, PokemonType.GRASS, 0.6, 19.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 335, 60, 60, 50, 40, 50, 75, 190, 70, 67, false, null, true), - ), - new PokemonSpecies(SpeciesId.SAWSBUCK, 5, false, false, false, "Season Pokémon", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Spring Form", "spring", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Summer Form", "summer", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Autumn Form", "autumn", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - new PokemonForm("Winter Form", "winter", PokemonType.NORMAL, PokemonType.GRASS, 1.9, 92.5, AbilityId.CHLOROPHYLL, AbilityId.SAP_SIPPER, AbilityId.SERENE_GRACE, 475, 80, 100, 70, 60, 70, 95, 75, 70, 166, false, null, true), - ), - new PokemonSpecies(SpeciesId.EMOLGA, 5, false, false, false, "Sky Squirrel Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 0.4, 5, AbilityId.STATIC, AbilityId.NONE, AbilityId.MOTOR_DRIVE, 428, 55, 75, 60, 75, 60, 103, 200, 50, 150, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.KARRABLAST, 5, false, false, false, "Clamping Pokémon", PokemonType.BUG, null, 0.5, 5.9, AbilityId.SWARM, AbilityId.SHED_SKIN, AbilityId.NO_GUARD, 315, 50, 75, 45, 40, 45, 60, 200, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ESCAVALIER, 5, false, false, false, "Cavalry Pokémon", PokemonType.BUG, PokemonType.STEEL, 1, 33, AbilityId.SWARM, AbilityId.SHELL_ARMOR, AbilityId.OVERCOAT, 495, 70, 135, 105, 60, 105, 20, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FOONGUS, 5, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.2, 1, AbilityId.EFFECT_SPORE, AbilityId.NONE, AbilityId.REGENERATOR, 294, 69, 55, 45, 55, 55, 15, 190, 50, 59, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.AMOONGUSS, 5, false, false, false, "Mushroom Pokémon", PokemonType.GRASS, PokemonType.POISON, 0.6, 10.5, AbilityId.EFFECT_SPORE, AbilityId.NONE, AbilityId.REGENERATOR, 464, 114, 85, 70, 85, 80, 30, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FRILLISH, 5, false, false, false, "Floating Pokémon", PokemonType.WATER, PokemonType.GHOST, 1.2, 33, AbilityId.WATER_ABSORB, AbilityId.CURSED_BODY, AbilityId.DAMP, 335, 55, 40, 50, 65, 85, 40, 190, 50, 67, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.JELLICENT, 5, false, false, false, "Floating Pokémon", PokemonType.WATER, PokemonType.GHOST, 2.2, 135, AbilityId.WATER_ABSORB, AbilityId.CURSED_BODY, AbilityId.DAMP, 480, 100, 60, 70, 85, 105, 60, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, true), - new PokemonSpecies(SpeciesId.ALOMOMOLA, 5, false, false, false, "Caring Pokémon", PokemonType.WATER, null, 1.2, 31.6, AbilityId.HEALER, AbilityId.HYDRATION, AbilityId.REGENERATOR, 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.JOLTIK, 5, false, false, false, "Attaching Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.1, 0.6, AbilityId.COMPOUND_EYES, AbilityId.UNNERVE, AbilityId.SWARM, 319, 50, 47, 50, 57, 50, 65, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALVANTULA, 5, false, false, false, "EleSpider Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.8, 14.3, AbilityId.COMPOUND_EYES, AbilityId.UNNERVE, AbilityId.SWARM, 472, 70, 77, 60, 97, 60, 108, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", PokemonType.GRASS, PokemonType.STEEL, 0.6, 18.8, AbilityId.IRON_BARBS, AbilityId.NONE, AbilityId.ANTICIPATION, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FERROTHORN, 5, false, false, false, "Thorn Pod Pokémon", PokemonType.GRASS, PokemonType.STEEL, 1, 110, AbilityId.IRON_BARBS, AbilityId.NONE, AbilityId.ANTICIPATION, 489, 74, 94, 131, 54, 116, 20, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.KLINK, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.3, 21, AbilityId.PLUS, AbilityId.MINUS, AbilityId.CLEAR_BODY, 300, 40, 55, 70, 45, 60, 30, 130, 50, 60, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(SpeciesId.KLANG, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.6, 51, AbilityId.PLUS, AbilityId.MINUS, AbilityId.CLEAR_BODY, 440, 60, 80, 95, 70, 85, 50, 60, 50, 154, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(SpeciesId.KLINKLANG, 5, false, false, false, "Gear Pokémon", PokemonType.STEEL, null, 0.6, 81, AbilityId.PLUS, AbilityId.MINUS, AbilityId.CLEAR_BODY, 520, 60, 100, 115, 70, 85, 90, 30, 50, 260, GrowthRate.MEDIUM_SLOW, null, false), - new PokemonSpecies(SpeciesId.TYNAMO, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 0.2, 0.3, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 275, 35, 55, 40, 45, 40, 60, 190, 70, 55, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.EELEKTRIK, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 1.2, 22, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 405, 65, 85, 70, 75, 70, 40, 60, 70, 142, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.EELEKTROSS, 5, false, false, false, "EleFish Pokémon", PokemonType.ELECTRIC, null, 2.1, 80.5, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 515, 85, 115, 80, 105, 80, 50, 30, 70, 258, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.ELGYEM, 5, false, false, false, "Cerebral Pokémon", PokemonType.PSYCHIC, null, 0.5, 9, AbilityId.TELEPATHY, AbilityId.SYNCHRONIZE, AbilityId.ANALYTIC, 335, 55, 55, 55, 85, 55, 30, 255, 50, 67, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BEHEEYEM, 5, false, false, false, "Cerebral Pokémon", PokemonType.PSYCHIC, null, 1, 34.5, AbilityId.TELEPATHY, AbilityId.SYNCHRONIZE, AbilityId.ANALYTIC, 485, 75, 75, 75, 125, 95, 40, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LITWICK, 5, false, false, false, "Candle Pokémon", PokemonType.GHOST, PokemonType.FIRE, 0.3, 3.1, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, AbilityId.INFILTRATOR, 275, 50, 30, 55, 65, 55, 20, 190, 50, 55, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.LAMPENT, 5, false, false, false, "Lamp Pokémon", PokemonType.GHOST, PokemonType.FIRE, 0.6, 13, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, AbilityId.INFILTRATOR, 370, 60, 40, 60, 95, 60, 55, 90, 50, 130, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CHANDELURE, 5, false, false, false, "Luring Pokémon", PokemonType.GHOST, PokemonType.FIRE, 1, 34.3, AbilityId.FLASH_FIRE, AbilityId.FLAME_BODY, AbilityId.INFILTRATOR, 520, 60, 55, 90, 145, 90, 80, 45, 50, 260, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.AXEW, 5, false, false, false, "Tusk Pokémon", PokemonType.DRAGON, null, 0.6, 18, AbilityId.RIVALRY, AbilityId.MOLD_BREAKER, AbilityId.UNNERVE, 320, 46, 87, 60, 30, 40, 57, 75, 35, 64, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.FRAXURE, 5, false, false, false, "Axe Jaw Pokémon", PokemonType.DRAGON, null, 1, 36, AbilityId.RIVALRY, AbilityId.MOLD_BREAKER, AbilityId.UNNERVE, 410, 66, 117, 70, 40, 50, 67, 60, 35, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.HAXORUS, 5, false, false, false, "Axe Jaw Pokémon", PokemonType.DRAGON, null, 1.8, 105.5, AbilityId.RIVALRY, AbilityId.MOLD_BREAKER, AbilityId.UNNERVE, 540, 76, 147, 90, 60, 70, 97, 45, 35, 270, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.CUBCHOO, 5, false, false, false, "Chill Pokémon", PokemonType.ICE, null, 0.5, 8.5, AbilityId.SNOW_CLOAK, AbilityId.SLUSH_RUSH, AbilityId.RATTLED, 305, 55, 70, 40, 60, 40, 40, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BEARTIC, 5, false, false, false, "Freezing Pokémon", PokemonType.ICE, null, 2.6, 260, AbilityId.SNOW_CLOAK, AbilityId.SLUSH_RUSH, AbilityId.SWIFT_SWIM, 505, 95, 130, 80, 70, 80, 50, 60, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CRYOGONAL, 5, false, false, false, "Crystallizing Pokémon", PokemonType.ICE, null, 1.1, 148, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 515, 80, 50, 50, 95, 135, 105, 25, 50, 180, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.SHELMET, 5, false, false, false, "Snail Pokémon", PokemonType.BUG, null, 0.4, 7.7, AbilityId.HYDRATION, AbilityId.SHELL_ARMOR, AbilityId.OVERCOAT, 305, 50, 40, 85, 40, 65, 25, 200, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ACCELGOR, 5, false, false, false, "Shell Out Pokémon", PokemonType.BUG, null, 0.8, 25.3, AbilityId.HYDRATION, AbilityId.STICKY_HOLD, AbilityId.UNBURDEN, 495, 80, 70, 40, 100, 60, 145, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.STUNFISK, 5, false, false, false, "Trap Pokémon", PokemonType.GROUND, PokemonType.ELECTRIC, 0.7, 11, AbilityId.STATIC, AbilityId.LIMBER, AbilityId.SAND_VEIL, 471, 109, 66, 84, 81, 99, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MIENFOO, 5, false, false, false, "Martial Arts Pokémon", PokemonType.FIGHTING, null, 0.9, 20, AbilityId.INNER_FOCUS, AbilityId.REGENERATOR, AbilityId.RECKLESS, 350, 45, 85, 50, 55, 50, 65, 180, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.MIENSHAO, 5, false, false, false, "Martial Arts Pokémon", PokemonType.FIGHTING, null, 1.4, 35.5, AbilityId.INNER_FOCUS, AbilityId.REGENERATOR, AbilityId.RECKLESS, 510, 65, 125, 60, 95, 60, 105, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.DRUDDIGON, 5, false, false, false, "Cave Pokémon", PokemonType.DRAGON, null, 1.6, 139, AbilityId.ROUGH_SKIN, AbilityId.SHEER_FORCE, AbilityId.MOLD_BREAKER, 485, 77, 120, 90, 60, 90, 48, 45, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GOLETT, 5, false, false, false, "Automaton Pokémon", PokemonType.GROUND, PokemonType.GHOST, 1, 92, AbilityId.IRON_FIST, AbilityId.KLUTZ, AbilityId.NO_GUARD, 303, 59, 74, 50, 35, 50, 35, 190, 50, 61, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.GOLURK, 5, false, false, false, "Automaton Pokémon", PokemonType.GROUND, PokemonType.GHOST, 2.8, 330, AbilityId.IRON_FIST, AbilityId.KLUTZ, AbilityId.NO_GUARD, 483, 89, 124, 80, 55, 80, 55, 90, 50, 169, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.PAWNIARD, 5, false, false, false, "Sharp Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 0.5, 10.2, AbilityId.DEFIANT, AbilityId.INNER_FOCUS, AbilityId.PRESSURE, 340, 45, 85, 70, 40, 40, 60, 120, 35, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BISHARP, 5, false, false, false, "Sword Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 1.6, 70, AbilityId.DEFIANT, AbilityId.INNER_FOCUS, AbilityId.PRESSURE, 490, 65, 125, 100, 60, 70, 70, 45, 35, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BOUFFALANT, 5, false, false, false, "Bash Buffalo Pokémon", PokemonType.NORMAL, null, 1.6, 94.6, AbilityId.RECKLESS, AbilityId.SAP_SIPPER, AbilityId.SOUNDPROOF, 490, 95, 110, 95, 40, 95, 55, 45, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.RUFFLET, 5, false, false, false, "Eaglet Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.5, 10.5, AbilityId.KEEN_EYE, AbilityId.SHEER_FORCE, AbilityId.HUSTLE, 350, 70, 83, 50, 37, 50, 60, 190, 50, 70, GrowthRate.SLOW, 100, false), - new PokemonSpecies(SpeciesId.BRAVIARY, 5, false, false, false, "Valiant Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.5, 41, AbilityId.KEEN_EYE, AbilityId.SHEER_FORCE, AbilityId.DEFIANT, 510, 100, 123, 75, 57, 75, 80, 60, 50, 179, GrowthRate.SLOW, 100, false), - new PokemonSpecies(SpeciesId.VULLABY, 5, false, false, false, "Diapered Pokémon", PokemonType.DARK, PokemonType.FLYING, 0.5, 9, AbilityId.BIG_PECKS, AbilityId.OVERCOAT, AbilityId.WEAK_ARMOR, 370, 70, 55, 75, 45, 65, 60, 190, 35, 74, GrowthRate.SLOW, 0, false), - new PokemonSpecies(SpeciesId.MANDIBUZZ, 5, false, false, false, "Bone Vulture Pokémon", PokemonType.DARK, PokemonType.FLYING, 1.2, 39.5, AbilityId.BIG_PECKS, AbilityId.OVERCOAT, AbilityId.WEAK_ARMOR, 510, 110, 65, 105, 55, 95, 80, 60, 35, 179, GrowthRate.SLOW, 0, false), - new PokemonSpecies(SpeciesId.HEATMOR, 5, false, false, false, "Anteater Pokémon", PokemonType.FIRE, null, 1.4, 58, AbilityId.GLUTTONY, AbilityId.FLASH_FIRE, AbilityId.WHITE_SMOKE, 484, 85, 97, 66, 105, 66, 65, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DURANT, 5, false, false, false, "Iron Ant Pokémon", PokemonType.BUG, PokemonType.STEEL, 0.3, 33, AbilityId.SWARM, AbilityId.HUSTLE, AbilityId.TRUANT, 484, 58, 109, 112, 48, 48, 109, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DEINO, 5, false, false, false, "Irate Pokémon", PokemonType.DARK, PokemonType.DRAGON, 0.8, 17.3, AbilityId.HUSTLE, AbilityId.NONE, AbilityId.NONE, 300, 52, 65, 50, 45, 50, 38, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.ZWEILOUS, 5, false, false, false, "Hostile Pokémon", PokemonType.DARK, PokemonType.DRAGON, 1.4, 50, AbilityId.HUSTLE, AbilityId.NONE, AbilityId.NONE, 420, 72, 85, 70, 65, 70, 58, 45, 35, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.HYDREIGON, 5, false, false, false, "Brutal Pokémon", PokemonType.DARK, PokemonType.DRAGON, 1.8, 160, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 600, 92, 105, 90, 125, 90, 98, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.LARVESTA, 5, false, false, false, "Torch Pokémon", PokemonType.BUG, PokemonType.FIRE, 1.1, 28.8, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.SWARM, 360, 55, 85, 55, 50, 55, 60, 45, 50, 72, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.VOLCARONA, 5, false, false, false, "Sun Pokémon", PokemonType.BUG, PokemonType.FIRE, 1.6, 46, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.SWARM, 550, 85, 60, 65, 135, 105, 100, 15, 50, 275, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.COBALION, 5, true, false, false, "Iron Will Pokémon", PokemonType.STEEL, PokemonType.FIGHTING, 2.1, 250, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 90, 129, 90, 72, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.TERRAKION, 5, true, false, false, "Cavern Pokémon", PokemonType.ROCK, PokemonType.FIGHTING, 1.9, 260, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 129, 90, 72, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.VIRIZION, 5, true, false, false, "Grassland Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 2, 200, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 90, 72, 90, 129, 108, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.TORNADUS, 5, true, false, false, "Cyclone Pokémon", PokemonType.FLYING, null, 1.5, 63, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", PokemonType.FLYING, null, 1.5, 63, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), - new PokemonForm("Therian Forme", "therian", PokemonType.FLYING, null, 1.4, 63, AbilityId.REGENERATOR, AbilityId.NONE, AbilityId.REGENERATOR, 580, 79, 100, 80, 110, 90, 121, 3, 90, 290), - ), - new PokemonSpecies(SpeciesId.THUNDURUS, 5, true, false, false, "Bolt Strike Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.5, 61, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", PokemonType.ELECTRIC, PokemonType.FLYING, 1.5, 61, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.DEFIANT, 580, 79, 115, 70, 125, 80, 111, 3, 90, 290, false, null, true), - new PokemonForm("Therian Forme", "therian", PokemonType.ELECTRIC, PokemonType.FLYING, 3, 61, AbilityId.VOLT_ABSORB, AbilityId.NONE, AbilityId.VOLT_ABSORB, 580, 79, 105, 70, 145, 80, 101, 3, 90, 290), - ), - new PokemonSpecies(SpeciesId.RESHIRAM, 5, false, true, false, "Vast White Pokémon", PokemonType.DRAGON, PokemonType.FIRE, 3.2, 330, AbilityId.TURBOBLAZE, AbilityId.NONE, AbilityId.NONE, 680, 100, 120, 100, 150, 120, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ZEKROM, 5, false, true, false, "Deep Black Pokémon", PokemonType.DRAGON, PokemonType.ELECTRIC, 2.9, 345, AbilityId.TERAVOLT, AbilityId.NONE, AbilityId.NONE, 680, 100, 150, 120, 120, 100, 90, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.LANDORUS, 5, true, false, false, "Abundance Pokémon", PokemonType.GROUND, PokemonType.FLYING, 1.5, 68, AbilityId.SAND_FORCE, AbilityId.NONE, AbilityId.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, GrowthRate.SLOW, 100, false, true, - new PokemonForm("Incarnate Forme", "incarnate", PokemonType.GROUND, PokemonType.FLYING, 1.5, 68, AbilityId.SAND_FORCE, AbilityId.NONE, AbilityId.SHEER_FORCE, 600, 89, 125, 90, 115, 80, 101, 3, 90, 300, false, null, true), - new PokemonForm("Therian Forme", "therian", PokemonType.GROUND, PokemonType.FLYING, 1.3, 68, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.INTIMIDATE, 600, 89, 145, 90, 105, 80, 91, 3, 90, 300), - ), - new PokemonSpecies(SpeciesId.KYUREM, 5, false, true, false, "Boundary Pokémon", PokemonType.DRAGON, PokemonType.ICE, 3, 325, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.DRAGON, PokemonType.ICE, 3, 325, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 660, 125, 130, 90, 130, 90, 95, 3, 0, 330, false, null, true), - new PokemonForm("Black", "black", PokemonType.DRAGON, PokemonType.ICE, 3.3, 325, AbilityId.TERAVOLT, AbilityId.NONE, AbilityId.NONE, 700, 125, 170, 100, 120, 90, 95, 3, 0, 350), - new PokemonForm("White", "white", PokemonType.DRAGON, PokemonType.ICE, 3.6, 325, AbilityId.TURBOBLAZE, AbilityId.NONE, AbilityId.NONE, 700, 125, 120, 90, 170, 100, 95, 3, 0, 350), - ), - new PokemonSpecies(SpeciesId.KELDEO, 5, false, false, true, "Colt Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, GrowthRate.SLOW, null, false, true, - new PokemonForm("Ordinary Form", "ordinary", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290, false, null, true), - new PokemonForm("Resolute", "resolute", PokemonType.WATER, PokemonType.FIGHTING, 1.4, 48.5, AbilityId.JUSTIFIED, AbilityId.NONE, AbilityId.NONE, 580, 91, 72, 90, 129, 90, 108, 3, 35, 290), - ), - new PokemonSpecies(SpeciesId.MELOETTA, 5, false, false, true, "Melody Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 0.6, 6.5, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Aria Forme", "aria", PokemonType.NORMAL, PokemonType.PSYCHIC, 0.6, 6.5, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 77, 77, 128, 128, 90, 3, 100, 300, false, null, true), - new PokemonForm("Pirouette Forme", "pirouette", PokemonType.NORMAL, PokemonType.FIGHTING, 0.6, 6.5, AbilityId.SERENE_GRACE, AbilityId.NONE, AbilityId.NONE, 600, 100, 128, 90, 77, 77, 128, 3, 100, 300, false, null, true), - ), - new PokemonSpecies(SpeciesId.GENESECT, 5, false, false, true, "Paleozoic Pokémon", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300, false, null, true), - new PokemonForm("Shock Drive", "shock", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Burn Drive", "burn", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Chill Drive", "chill", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - new PokemonForm("Douse Drive", "douse", PokemonType.BUG, PokemonType.STEEL, 1.5, 82.5, AbilityId.DOWNLOAD, AbilityId.NONE, AbilityId.NONE, 600, 71, 120, 95, 120, 95, 99, 3, 0, 300), - ), - new PokemonSpecies(SpeciesId.CHESPIN, 6, false, false, false, "Spiny Nut Pokémon", PokemonType.GRASS, null, 0.4, 9, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.BULLETPROOF, 313, 56, 61, 65, 48, 45, 38, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.QUILLADIN, 6, false, false, false, "Spiny Armor Pokémon", PokemonType.GRASS, null, 0.7, 29, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.BULLETPROOF, 405, 61, 78, 95, 56, 58, 57, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.CHESNAUGHT, 6, false, false, false, "Spiny Armor Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.6, 90, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.BULLETPROOF, 530, 88, 107, 122, 74, 75, 64, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.FENNEKIN, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 0.4, 9.4, AbilityId.BLAZE, AbilityId.NONE, AbilityId.MAGICIAN, 307, 40, 45, 40, 62, 60, 60, 45, 70, 61, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.BRAIXEN, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, null, 1, 14.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.MAGICIAN, 409, 59, 59, 58, 90, 70, 73, 45, 70, 143, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.DELPHOX, 6, false, false, false, "Fox Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 39, AbilityId.BLAZE, AbilityId.NONE, AbilityId.MAGICIAN, 534, 75, 69, 72, 114, 100, 104, 45, 70, 267, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.FROAKIE, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.3, 7, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", PokemonType.WATER, null, 0.3, 7, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.3, 7, AbilityId.TORRENT, AbilityId.NONE, AbilityId.TORRENT, 314, 41, 56, 40, 62, 44, 71, 45, 70, 63, false, "", true), - ), - new PokemonSpecies(SpeciesId.FROGADIER, 6, false, false, false, "Bubble Frog Pokémon", PokemonType.WATER, null, 0.6, 10.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", PokemonType.WATER, null, 0.6, 10.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, null, 0.6, 10.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.NONE, 405, 54, 63, 52, 83, 56, 97, 45, 70, 142, false, "", true), - ), - new PokemonSpecies(SpeciesId.GRENINJA, 6, false, false, false, "Ninja Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 40, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, false, - new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.DARK, 1.5, 40, AbilityId.TORRENT, AbilityId.NONE, AbilityId.PROTEAN, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, null, true), - new PokemonForm("Battle Bond", "battle-bond", PokemonType.WATER, PokemonType.DARK, 1.5, 40, AbilityId.BATTLE_BOND, AbilityId.NONE, AbilityId.BATTLE_BOND, 530, 72, 95, 67, 103, 71, 122, 45, 70, 265, false, "", true), - new PokemonForm("Ash", "ash", PokemonType.WATER, PokemonType.DARK, 1.5, 40, AbilityId.BATTLE_BOND, AbilityId.NONE, AbilityId.NONE, 640, 72, 145, 67, 153, 71, 132, 45, 70, 265), - ), - new PokemonSpecies(SpeciesId.BUNNELBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, null, 0.4, 5, AbilityId.PICKUP, AbilityId.CHEEK_POUCH, AbilityId.HUGE_POWER, 237, 38, 36, 38, 32, 36, 57, 255, 50, 47, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DIGGERSBY, 6, false, false, false, "Digging Pokémon", PokemonType.NORMAL, PokemonType.GROUND, 1, 42.4, AbilityId.PICKUP, AbilityId.CHEEK_POUCH, AbilityId.HUGE_POWER, 423, 85, 56, 77, 50, 77, 78, 127, 50, 148, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FLETCHLING, 6, false, false, false, "Tiny Robin Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.7, AbilityId.BIG_PECKS, AbilityId.NONE, AbilityId.GALE_WINGS, 278, 45, 50, 43, 40, 38, 62, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.FLETCHINDER, 6, false, false, false, "Ember Pokémon", PokemonType.FIRE, PokemonType.FLYING, 0.7, 16, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.GALE_WINGS, 382, 62, 73, 55, 56, 52, 84, 120, 50, 134, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.TALONFLAME, 6, false, false, false, "Scorching Pokémon", PokemonType.FIRE, PokemonType.FLYING, 1.2, 24.5, AbilityId.FLAME_BODY, AbilityId.NONE, AbilityId.GALE_WINGS, 499, 78, 81, 71, 74, 69, 126, 45, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SCATTERBUG, 6, false, false, false, "Scatterdust Pokémon", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("River Pattern", "river", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, null, 0.3, 2.5, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 200, 38, 35, 40, 27, 25, 35, 255, 70, 40, false, "", true), - ), - new PokemonSpecies(SpeciesId.SPEWPA, 6, false, false, false, "Scatterdust Pokémon", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.SHED_SKIN, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("River Pattern", "river", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, null, 0.3, 8.4, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.FRIEND_GUARD, 213, 45, 22, 60, 27, 30, 29, 120, 70, 75, false, "", true), - ), - new PokemonSpecies(SpeciesId.VIVILLON, 6, false, false, false, "Scale Pokémon", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Meadow Pattern", "meadow", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Icy Snow Pattern", "icy-snow", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Polar Pattern", "polar", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Tundra Pattern", "tundra", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Continental Pattern", "continental", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Garden Pattern", "garden", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Elegant Pattern", "elegant", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Modern Pattern", "modern", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Marine Pattern", "marine", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Archipelago Pattern", "archipelago", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("High Plains Pattern", "high-plains", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Sandstorm Pattern", "sandstorm", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("River Pattern", "river", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Monsoon Pattern", "monsoon", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Savanna Pattern", "savanna", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Sun Pattern", "sun", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Ocean Pattern", "ocean", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Jungle Pattern", "jungle", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Fancy Pattern", "fancy", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - new PokemonForm("Poké Ball Pattern", "poke-ball", PokemonType.BUG, PokemonType.FLYING, 1.2, 17, AbilityId.SHIELD_DUST, AbilityId.COMPOUND_EYES, AbilityId.FRIEND_GUARD, 411, 80, 52, 50, 90, 50, 89, 45, 70, 206, false, null, true), - ), - new PokemonSpecies(SpeciesId.LITLEO, 6, false, false, false, "Lion Cub Pokémon", PokemonType.FIRE, PokemonType.NORMAL, 0.6, 13.5, AbilityId.RIVALRY, AbilityId.UNNERVE, AbilityId.MOXIE, 369, 62, 50, 58, 73, 54, 72, 220, 70, 74, GrowthRate.MEDIUM_SLOW, 12.5, false), - new PokemonSpecies(SpeciesId.PYROAR, 6, false, false, false, "Royal Pokémon", PokemonType.FIRE, PokemonType.NORMAL, 1.5, 81.5, AbilityId.RIVALRY, AbilityId.UNNERVE, AbilityId.MOXIE, 507, 86, 68, 72, 109, 66, 106, 65, 70, 177, GrowthRate.MEDIUM_SLOW, 12.5, true), - new PokemonSpecies(SpeciesId.FLABEBE, 6, false, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 0.1, 0.1, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 303, 44, 38, 39, 61, 79, 42, 225, 70, 61, false, null, true), - ), - new PokemonSpecies(SpeciesId.FLOETTE, 6, false, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 371, 54, 45, 47, 75, 98, 52, 120, 70, 130, false, null, true), - ), - new PokemonSpecies(SpeciesId.FLORGES, 6, false, false, false, "Garden Pokémon", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, GrowthRate.MEDIUM_FAST, 0, false, false, - new PokemonForm("Red Flower", "red", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - new PokemonForm("Yellow Flower", "yellow", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - new PokemonForm("Orange Flower", "orange", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - new PokemonForm("Blue Flower", "blue", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - new PokemonForm("White Flower", "white", PokemonType.FAIRY, null, 1.1, 10, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 552, 78, 65, 68, 112, 154, 75, 45, 70, 276, false, null, true), - ), - new PokemonSpecies(SpeciesId.SKIDDO, 6, false, false, false, "Mount Pokémon", PokemonType.GRASS, null, 0.9, 31, AbilityId.SAP_SIPPER, AbilityId.NONE, AbilityId.GRASS_PELT, 350, 66, 65, 48, 62, 57, 52, 200, 70, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GOGOAT, 6, false, false, false, "Mount Pokémon", PokemonType.GRASS, null, 1.7, 91, AbilityId.SAP_SIPPER, AbilityId.NONE, AbilityId.GRASS_PELT, 531, 123, 100, 62, 97, 81, 68, 45, 70, 186, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PANCHAM, 6, false, false, false, "Playful Pokémon", PokemonType.FIGHTING, null, 0.6, 8, AbilityId.IRON_FIST, AbilityId.MOLD_BREAKER, AbilityId.SCRAPPY, 348, 67, 82, 62, 46, 48, 43, 220, 50, 70, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PANGORO, 6, false, false, false, "Daunting Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 2.1, 136, AbilityId.IRON_FIST, AbilityId.MOLD_BREAKER, AbilityId.SCRAPPY, 495, 95, 124, 78, 69, 71, 58, 65, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FURFROU, 6, false, false, false, "Poodle Pokémon", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Natural Form", "", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Heart Trim", "heart", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Star Trim", "star", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Diamond Trim", "diamond", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Debutante Trim", "debutante", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Matron Trim", "matron", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Dandy Trim", "dandy", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("La Reine Trim", "la-reine", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Kabuki Trim", "kabuki", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - new PokemonForm("Pharaoh Trim", "pharaoh", PokemonType.NORMAL, null, 1.2, 28, AbilityId.FUR_COAT, AbilityId.NONE, AbilityId.NONE, 472, 75, 80, 60, 65, 90, 102, 160, 70, 165, false, null, true), - ), - new PokemonSpecies(SpeciesId.ESPURR, 6, false, false, false, "Restraint Pokémon", PokemonType.PSYCHIC, null, 0.3, 3.5, AbilityId.KEEN_EYE, AbilityId.INFILTRATOR, AbilityId.OWN_TEMPO, 355, 62, 48, 54, 63, 60, 68, 190, 50, 71, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MEOWSTIC, 6, false, false, false, "Constraint Pokémon", PokemonType.PSYCHIC, null, 0.6, 8.5, AbilityId.KEEN_EYE, AbilityId.INFILTRATOR, AbilityId.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", PokemonType.PSYCHIC, null, 0.6, 8.5, AbilityId.KEEN_EYE, AbilityId.INFILTRATOR, AbilityId.PRANKSTER, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, "", true), - new PokemonForm("Female", "female", PokemonType.PSYCHIC, null, 0.6, 8.5, AbilityId.KEEN_EYE, AbilityId.INFILTRATOR, AbilityId.COMPETITIVE, 466, 74, 48, 76, 83, 81, 104, 75, 50, 163, false, null, true), - ), - new PokemonSpecies(SpeciesId.HONEDGE, 6, false, false, false, "Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 0.8, 2, AbilityId.NO_GUARD, AbilityId.NONE, AbilityId.NONE, 325, 45, 80, 100, 35, 37, 28, 180, 50, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DOUBLADE, 6, false, false, false, "Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 0.8, 4.5, AbilityId.NO_GUARD, AbilityId.NONE, AbilityId.NONE, 448, 59, 110, 150, 45, 49, 35, 90, 50, 157, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.AEGISLASH, 6, false, false, false, "Royal Sword Pokémon", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, AbilityId.STANCE_CHANGE, AbilityId.NONE, AbilityId.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Shield Forme", "shield", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, AbilityId.STANCE_CHANGE, AbilityId.NONE, AbilityId.NONE, 500, 60, 50, 140, 50, 140, 60, 45, 50, 250, false, "", true), - new PokemonForm("Blade Forme", "blade", PokemonType.STEEL, PokemonType.GHOST, 1.7, 53, AbilityId.STANCE_CHANGE, AbilityId.NONE, AbilityId.NONE, 500, 60, 140, 50, 140, 50, 60, 45, 50, 250), - ), - new PokemonSpecies(SpeciesId.SPRITZEE, 6, false, false, false, "Perfume Pokémon", PokemonType.FAIRY, null, 0.2, 0.5, AbilityId.HEALER, AbilityId.NONE, AbilityId.AROMA_VEIL, 341, 78, 52, 60, 63, 65, 23, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.AROMATISSE, 6, false, false, false, "Fragrance Pokémon", PokemonType.FAIRY, null, 0.8, 15.5, AbilityId.HEALER, AbilityId.NONE, AbilityId.AROMA_VEIL, 462, 101, 72, 72, 99, 89, 29, 140, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SWIRLIX, 6, false, false, false, "Cotton Candy Pokémon", PokemonType.FAIRY, null, 0.4, 3.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.UNBURDEN, 341, 62, 48, 66, 59, 57, 49, 200, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SLURPUFF, 6, false, false, false, "Meringue Pokémon", PokemonType.FAIRY, null, 0.8, 5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.UNBURDEN, 480, 82, 80, 86, 85, 75, 72, 140, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.INKAY, 6, false, false, false, "Revolving Pokémon", PokemonType.DARK, PokemonType.PSYCHIC, 0.4, 3.5, AbilityId.CONTRARY, AbilityId.SUCTION_CUPS, AbilityId.INFILTRATOR, 288, 53, 54, 53, 37, 46, 45, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MALAMAR, 6, false, false, false, "Overturning Pokémon", PokemonType.DARK, PokemonType.PSYCHIC, 1.5, 47, AbilityId.CONTRARY, AbilityId.SUCTION_CUPS, AbilityId.INFILTRATOR, 482, 86, 92, 88, 68, 75, 73, 80, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BINACLE, 6, false, false, false, "Two-Handed Pokémon", PokemonType.ROCK, PokemonType.WATER, 0.5, 31, AbilityId.TOUGH_CLAWS, AbilityId.SNIPER, AbilityId.PICKPOCKET, 306, 42, 52, 67, 39, 56, 50, 120, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BARBARACLE, 6, false, false, false, "Collective Pokémon", PokemonType.ROCK, PokemonType.WATER, 1.3, 96, AbilityId.TOUGH_CLAWS, AbilityId.SNIPER, AbilityId.PICKPOCKET, 500, 72, 105, 115, 54, 86, 68, 45, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SKRELP, 6, false, false, false, "Mock Kelp Pokémon", PokemonType.POISON, PokemonType.WATER, 0.5, 7.3, AbilityId.POISON_POINT, AbilityId.POISON_TOUCH, AbilityId.ADAPTABILITY, 320, 50, 60, 60, 60, 60, 30, 225, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DRAGALGE, 6, false, false, false, "Mock Kelp Pokémon", PokemonType.POISON, PokemonType.DRAGON, 1.8, 81.5, AbilityId.POISON_POINT, AbilityId.POISON_TOUCH, AbilityId.ADAPTABILITY, 494, 65, 75, 90, 97, 123, 44, 55, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CLAUNCHER, 6, false, false, false, "Water Gun Pokémon", PokemonType.WATER, null, 0.5, 8.3, AbilityId.MEGA_LAUNCHER, AbilityId.NONE, AbilityId.NONE, 330, 50, 53, 62, 58, 63, 44, 225, 50, 66, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.CLAWITZER, 6, false, false, false, "Howitzer Pokémon", PokemonType.WATER, null, 1.3, 35.3, AbilityId.MEGA_LAUNCHER, AbilityId.NONE, AbilityId.NONE, 500, 71, 73, 88, 120, 89, 59, 55, 50, 100, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.HELIOPTILE, 6, false, false, false, "Generator Pokémon", PokemonType.ELECTRIC, PokemonType.NORMAL, 0.5, 6, AbilityId.DRY_SKIN, AbilityId.SAND_VEIL, AbilityId.SOLAR_POWER, 289, 44, 38, 33, 61, 43, 70, 190, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HELIOLISK, 6, false, false, false, "Generator Pokémon", PokemonType.ELECTRIC, PokemonType.NORMAL, 1, 21, AbilityId.DRY_SKIN, AbilityId.SAND_VEIL, AbilityId.SOLAR_POWER, 481, 62, 55, 52, 109, 94, 109, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TYRUNT, 6, false, false, false, "Royal Heir Pokémon", PokemonType.ROCK, PokemonType.DRAGON, 0.8, 26, AbilityId.STRONG_JAW, AbilityId.NONE, AbilityId.STURDY, 362, 58, 89, 77, 45, 45, 48, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.TYRANTRUM, 6, false, false, false, "Despot Pokémon", PokemonType.ROCK, PokemonType.DRAGON, 2.5, 270, AbilityId.STRONG_JAW, AbilityId.NONE, AbilityId.ROCK_HEAD, 521, 82, 121, 119, 69, 59, 71, 45, 50, 182, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.AMAURA, 6, false, false, false, "Tundra Pokémon", PokemonType.ROCK, PokemonType.ICE, 1.3, 25.2, AbilityId.REFRIGERATE, AbilityId.NONE, AbilityId.SNOW_WARNING, 362, 77, 59, 50, 67, 63, 46, 45, 50, 72, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.AURORUS, 6, false, false, false, "Tundra Pokémon", PokemonType.ROCK, PokemonType.ICE, 2.7, 225, AbilityId.REFRIGERATE, AbilityId.NONE, AbilityId.SNOW_WARNING, 521, 123, 77, 72, 99, 92, 58, 45, 50, 104, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.SYLVEON, 6, false, false, false, "Intertwining Pokémon", PokemonType.FAIRY, null, 1, 23.5, AbilityId.CUTE_CHARM, AbilityId.NONE, AbilityId.PIXILATE, 525, 95, 65, 65, 110, 130, 60, 45, 50, 184, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.HAWLUCHA, 6, false, false, false, "Wrestling Pokémon", PokemonType.FIGHTING, PokemonType.FLYING, 0.8, 21.5, AbilityId.LIMBER, AbilityId.UNBURDEN, AbilityId.MOLD_BREAKER, 500, 78, 92, 75, 74, 63, 118, 100, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DEDENNE, 6, false, false, false, "Antenna Pokémon", PokemonType.ELECTRIC, PokemonType.FAIRY, 0.2, 2.2, AbilityId.CHEEK_POUCH, AbilityId.PICKUP, AbilityId.PLUS, 431, 67, 58, 57, 81, 67, 101, 180, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CARBINK, 6, false, false, false, "Jewel Pokémon", PokemonType.ROCK, PokemonType.FAIRY, 0.3, 5.7, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.STURDY, 500, 50, 50, 150, 50, 150, 50, 60, 50, 100, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.GOOMY, 6, false, false, false, "Soft Tissue Pokémon", PokemonType.DRAGON, null, 0.3, 2.8, AbilityId.SAP_SIPPER, AbilityId.HYDRATION, AbilityId.GOOEY, 300, 45, 50, 35, 55, 75, 40, 45, 35, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.SLIGGOO, 6, false, false, false, "Soft Tissue Pokémon", PokemonType.DRAGON, null, 0.8, 17.5, AbilityId.SAP_SIPPER, AbilityId.HYDRATION, AbilityId.GOOEY, 452, 68, 75, 53, 83, 113, 60, 45, 35, 158, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.GOODRA, 6, false, false, false, "Dragon Pokémon", PokemonType.DRAGON, null, 2, 150.5, AbilityId.SAP_SIPPER, AbilityId.HYDRATION, AbilityId.GOOEY, 600, 90, 100, 70, 110, 150, 80, 45, 35, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.KLEFKI, 6, false, false, false, "Key Ring Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 0.2, 3, AbilityId.PRANKSTER, AbilityId.NONE, AbilityId.MAGICIAN, 470, 57, 80, 91, 80, 87, 75, 75, 50, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.PHANTUMP, 6, false, false, false, "Stump Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.4, 7, AbilityId.NATURAL_CURE, AbilityId.FRISK, AbilityId.HARVEST, 309, 43, 70, 48, 50, 60, 38, 120, 50, 62, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TREVENANT, 6, false, false, false, "Elder Tree Pokémon", PokemonType.GHOST, PokemonType.GRASS, 1.5, 71, AbilityId.NATURAL_CURE, AbilityId.FRISK, AbilityId.HARVEST, 474, 85, 110, 76, 65, 82, 56, 60, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PUMPKABOO, 6, false, false, false, "Pumpkin Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.4, 5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Average Size", "", PokemonType.GHOST, PokemonType.GRASS, 0.4, 5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 49, 66, 70, 44, 55, 51, 120, 50, 67, false, null, true), - new PokemonForm("Small Size", "small", PokemonType.GHOST, PokemonType.GRASS, 0.3, 3.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 44, 66, 70, 44, 55, 56, 120, 50, 67, false, "", true), - new PokemonForm("Large Size", "large", PokemonType.GHOST, PokemonType.GRASS, 0.5, 7.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 54, 66, 70, 44, 55, 46, 120, 50, 67, false, "", true), - new PokemonForm("Super Size", "super", PokemonType.GHOST, PokemonType.GRASS, 0.8, 15, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 335, 59, 66, 70, 44, 55, 41, 120, 50, 67, false, "", true), - ), - new PokemonSpecies(SpeciesId.GOURGEIST, 6, false, false, false, "Pumpkin Pokémon", PokemonType.GHOST, PokemonType.GRASS, 0.9, 12.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Average Size", "", PokemonType.GHOST, PokemonType.GRASS, 0.9, 12.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 65, 90, 122, 58, 75, 84, 60, 50, 173, false, null, true), - new PokemonForm("Small Size", "small", PokemonType.GHOST, PokemonType.GRASS, 0.7, 9.5, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 55, 85, 122, 58, 75, 99, 60, 50, 173, false, "", true), - new PokemonForm("Large Size", "large", PokemonType.GHOST, PokemonType.GRASS, 1.1, 14, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 75, 95, 122, 58, 75, 69, 60, 50, 173, false, "", true), - new PokemonForm("Super Size", "super", PokemonType.GHOST, PokemonType.GRASS, 1.7, 39, AbilityId.PICKUP, AbilityId.FRISK, AbilityId.INSOMNIA, 494, 85, 100, 122, 58, 75, 54, 60, 50, 173, false, "", true), - ), - new PokemonSpecies(SpeciesId.BERGMITE, 6, false, false, false, "Ice Chunk Pokémon", PokemonType.ICE, null, 1, 99.5, AbilityId.OWN_TEMPO, AbilityId.ICE_BODY, AbilityId.STURDY, 304, 55, 69, 85, 32, 35, 28, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.AVALUGG, 6, false, false, false, "Iceberg Pokémon", PokemonType.ICE, null, 2, 505, AbilityId.OWN_TEMPO, AbilityId.ICE_BODY, AbilityId.STURDY, 514, 95, 117, 184, 44, 46, 28, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.NOIBAT, 6, false, false, false, "Sound Wave Pokémon", PokemonType.FLYING, PokemonType.DRAGON, 0.5, 8, AbilityId.FRISK, AbilityId.INFILTRATOR, AbilityId.TELEPATHY, 245, 40, 30, 35, 45, 40, 55, 190, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.NOIVERN, 6, false, false, false, "Sound Wave Pokémon", PokemonType.FLYING, PokemonType.DRAGON, 1.5, 85, AbilityId.FRISK, AbilityId.INFILTRATOR, AbilityId.TELEPATHY, 535, 85, 70, 80, 97, 80, 123, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.XERNEAS, 6, false, true, false, "Life Pokémon", PokemonType.FAIRY, null, 3, 215, AbilityId.FAIRY_AURA, AbilityId.NONE, AbilityId.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false, true, - new PokemonForm("Neutral Mode", "neutral", PokemonType.FAIRY, null, 3, 215, AbilityId.FAIRY_AURA, AbilityId.NONE, AbilityId.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, false, null, true), - new PokemonForm("Active Mode", "active", PokemonType.FAIRY, null, 3, 215, AbilityId.FAIRY_AURA, AbilityId.NONE, AbilityId.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340) - ), - new PokemonSpecies(SpeciesId.YVELTAL, 6, false, true, false, "Destruction Pokémon", PokemonType.DARK, PokemonType.FLYING, 5.8, 203, AbilityId.DARK_AURA, AbilityId.NONE, AbilityId.NONE, 680, 126, 131, 95, 131, 98, 99, 45, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ZYGARDE, 6, false, true, false, "Order Pokémon", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, AbilityId.AURA_BREAK, AbilityId.NONE, AbilityId.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("50% Forme", "50", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, AbilityId.AURA_BREAK, AbilityId.NONE, AbilityId.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), - new PokemonForm("10% Forme", "10", PokemonType.DRAGON, PokemonType.GROUND, 1.2, 33.5, AbilityId.AURA_BREAK, AbilityId.NONE, AbilityId.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 243, false, null, true), - new PokemonForm("50% Forme Power Construct", "50-pc", PokemonType.DRAGON, PokemonType.GROUND, 5, 305, AbilityId.POWER_CONSTRUCT, AbilityId.NONE, AbilityId.NONE, 600, 108, 100, 121, 81, 95, 95, 3, 0, 300, false, "", true), - new PokemonForm("10% Forme Power Construct", "10-pc", PokemonType.DRAGON, PokemonType.GROUND, 1.2, 33.5, AbilityId.POWER_CONSTRUCT, AbilityId.NONE, AbilityId.NONE, 486, 54, 100, 71, 61, 85, 115, 3, 0, 243, false, "10", true), - new PokemonForm("Complete Forme (50% PC)", "complete", PokemonType.DRAGON, PokemonType.GROUND, 4.5, 610, AbilityId.POWER_CONSTRUCT, AbilityId.NONE, AbilityId.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354), - new PokemonForm("Complete Forme (10% PC)", "10-complete", PokemonType.DRAGON, PokemonType.GROUND, 4.5, 610, AbilityId.POWER_CONSTRUCT, AbilityId.NONE, AbilityId.NONE, 708, 216, 100, 121, 91, 95, 85, 3, 0, 354, false, "complete"), - ), - new PokemonSpecies(SpeciesId.DIANCIE, 6, false, false, true, "Jewel Pokémon", PokemonType.ROCK, PokemonType.FAIRY, 0.7, 8.8, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FAIRY, 0.7, 8.8, AbilityId.CLEAR_BODY, AbilityId.NONE, AbilityId.NONE, 600, 50, 100, 150, 100, 150, 50, 3, 50, 300, false, null, true), - new PokemonForm("Mega", SpeciesFormKey.MEGA, PokemonType.ROCK, PokemonType.FAIRY, 1.1, 27.8, AbilityId.MAGIC_BOUNCE, AbilityId.NONE, AbilityId.NONE, 700, 50, 160, 110, 160, 110, 110, 3, 50, 300), - ), - new PokemonSpecies(SpeciesId.HOOPA, 6, false, false, true, "Mischief Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 0.5, 9, AbilityId.MAGICIAN, AbilityId.NONE, AbilityId.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hoopa Confined", "", PokemonType.PSYCHIC, PokemonType.GHOST, 0.5, 9, AbilityId.MAGICIAN, AbilityId.NONE, AbilityId.NONE, 600, 80, 110, 60, 150, 130, 70, 3, 100, 300, false, null, true), - new PokemonForm("Hoopa Unbound", "unbound", PokemonType.PSYCHIC, PokemonType.DARK, 6.5, 490, AbilityId.MAGICIAN, AbilityId.NONE, AbilityId.NONE, 680, 80, 160, 60, 170, 130, 80, 3, 100, 340), - ), - new PokemonSpecies(SpeciesId.VOLCANION, 6, false, false, true, "Steam Pokémon", PokemonType.FIRE, PokemonType.WATER, 1.7, 195, AbilityId.WATER_ABSORB, AbilityId.NONE, AbilityId.NONE, 600, 80, 110, 120, 130, 90, 70, 3, 100, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ROWLET, 7, false, false, false, "Grass Quill Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.3, 1.5, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LONG_REACH, 320, 68, 55, 55, 50, 50, 42, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.DARTRIX, 7, false, false, false, "Blade Quill Pokémon", PokemonType.GRASS, PokemonType.FLYING, 0.7, 16, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LONG_REACH, 420, 78, 75, 75, 70, 70, 52, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.DECIDUEYE, 7, false, false, false, "Arrow Quill Pokémon", PokemonType.GRASS, PokemonType.GHOST, 1.6, 36.6, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.LONG_REACH, 530, 78, 107, 75, 100, 100, 70, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.LITTEN, 7, false, false, false, "Fire Cat Pokémon", PokemonType.FIRE, null, 0.4, 4.3, AbilityId.BLAZE, AbilityId.NONE, AbilityId.INTIMIDATE, 320, 45, 65, 40, 60, 40, 70, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.TORRACAT, 7, false, false, false, "Fire Cat Pokémon", PokemonType.FIRE, null, 0.7, 25, AbilityId.BLAZE, AbilityId.NONE, AbilityId.INTIMIDATE, 420, 65, 85, 50, 80, 50, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.INCINEROAR, 7, false, false, false, "Heel Pokémon", PokemonType.FIRE, PokemonType.DARK, 1.8, 83, AbilityId.BLAZE, AbilityId.NONE, AbilityId.INTIMIDATE, 530, 95, 115, 90, 80, 90, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.POPPLIO, 7, false, false, false, "Sea Lion Pokémon", PokemonType.WATER, null, 0.4, 7.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.LIQUID_VOICE, 320, 50, 54, 54, 66, 56, 40, 45, 50, 64, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.BRIONNE, 7, false, false, false, "Pop Star Pokémon", PokemonType.WATER, null, 0.6, 17.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.LIQUID_VOICE, 420, 60, 69, 69, 91, 81, 50, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.PRIMARINA, 7, false, false, false, "Soloist Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.8, 44, AbilityId.TORRENT, AbilityId.NONE, AbilityId.LIQUID_VOICE, 530, 80, 74, 74, 126, 116, 60, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.PIKIPEK, 7, false, false, false, "Woodpecker Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.3, 1.2, AbilityId.KEEN_EYE, AbilityId.SKILL_LINK, AbilityId.PICKUP, 265, 35, 75, 30, 30, 30, 65, 255, 70, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TRUMBEAK, 7, false, false, false, "Bugle Beak Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 14.8, AbilityId.KEEN_EYE, AbilityId.SKILL_LINK, AbilityId.PICKUP, 355, 55, 85, 50, 40, 50, 75, 120, 70, 124, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TOUCANNON, 7, false, false, false, "Cannon Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 1.1, 26, AbilityId.KEEN_EYE, AbilityId.SKILL_LINK, AbilityId.SHEER_FORCE, 485, 80, 120, 75, 75, 75, 60, 45, 70, 243, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.YUNGOOS, 7, false, false, false, "Loitering Pokémon", PokemonType.NORMAL, null, 0.4, 6, AbilityId.STAKEOUT, AbilityId.STRONG_JAW, AbilityId.ADAPTABILITY, 253, 48, 70, 30, 30, 30, 45, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GUMSHOOS, 7, false, false, false, "Stakeout Pokémon", PokemonType.NORMAL, null, 0.7, 14.2, AbilityId.STAKEOUT, AbilityId.STRONG_JAW, AbilityId.ADAPTABILITY, 418, 88, 110, 60, 55, 60, 45, 127, 70, 146, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GRUBBIN, 7, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 4.4, AbilityId.SWARM, AbilityId.NONE, AbilityId.NONE, 300, 47, 62, 45, 55, 45, 46, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CHARJABUG, 7, false, false, false, "Battery Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 0.5, 10.5, AbilityId.BATTERY, AbilityId.NONE, AbilityId.NONE, 400, 57, 82, 95, 55, 75, 36, 120, 50, 140, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.VIKAVOLT, 7, false, false, false, "Stag Beetle Pokémon", PokemonType.BUG, PokemonType.ELECTRIC, 1.5, 45, AbilityId.LEVITATE, AbilityId.NONE, AbilityId.NONE, 500, 77, 70, 90, 145, 75, 43, 45, 50, 250, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CRABRAWLER, 7, false, false, false, "Boxing Pokémon", PokemonType.FIGHTING, null, 0.6, 7, AbilityId.HYPER_CUTTER, AbilityId.IRON_FIST, AbilityId.ANGER_POINT, 338, 47, 82, 57, 42, 47, 63, 225, 70, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CRABOMINABLE, 7, false, false, false, "Woolly Crab Pokémon", PokemonType.FIGHTING, PokemonType.ICE, 1.7, 180, AbilityId.HYPER_CUTTER, AbilityId.IRON_FIST, AbilityId.ANGER_POINT, 478, 97, 132, 77, 62, 67, 43, 60, 70, 167, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ORICORIO, 7, false, false, false, "Dancing Pokémon", PokemonType.FIRE, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, GrowthRate.MEDIUM_FAST, 25, false, false, - new PokemonForm("Baile Style", "baile", PokemonType.FIRE, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, "", true), - new PokemonForm("Pom-Pom Style", "pompom", PokemonType.ELECTRIC, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - new PokemonForm("Pau Style", "pau", PokemonType.PSYCHIC, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - new PokemonForm("Sensu Style", "sensu", PokemonType.GHOST, PokemonType.FLYING, 0.6, 3.4, AbilityId.DANCER, AbilityId.NONE, AbilityId.NONE, 476, 75, 70, 70, 98, 70, 93, 45, 70, 167, false, null, true), - ), - new PokemonSpecies(SpeciesId.CUTIEFLY, 7, false, false, false, "Bee Fly Pokémon", PokemonType.BUG, PokemonType.FAIRY, 0.1, 0.2, AbilityId.HONEY_GATHER, AbilityId.SHIELD_DUST, AbilityId.SWEET_VEIL, 304, 40, 45, 40, 55, 40, 84, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.RIBOMBEE, 7, false, false, false, "Bee Fly Pokémon", PokemonType.BUG, PokemonType.FAIRY, 0.2, 0.5, AbilityId.HONEY_GATHER, AbilityId.SHIELD_DUST, AbilityId.SWEET_VEIL, 464, 60, 55, 60, 95, 70, 124, 75, 50, 162, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ROCKRUFF, 7, false, false, false, "Puppy Pokémon", PokemonType.ROCK, null, 0.5, 9.2, AbilityId.KEEN_EYE, AbilityId.VITAL_SPIRIT, AbilityId.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", PokemonType.ROCK, null, 0.5, 9.2, AbilityId.KEEN_EYE, AbilityId.VITAL_SPIRIT, AbilityId.STEADFAST, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, null, true), - new PokemonForm("Own Tempo", "own-tempo", PokemonType.ROCK, null, 0.5, 9.2, AbilityId.OWN_TEMPO, AbilityId.NONE, AbilityId.OWN_TEMPO, 280, 45, 65, 40, 30, 40, 60, 190, 50, 56, false, "", true), - ), - new PokemonSpecies(SpeciesId.LYCANROC, 7, false, false, false, "Wolf Pokémon", PokemonType.ROCK, null, 0.8, 25, AbilityId.KEEN_EYE, AbilityId.SAND_RUSH, AbilityId.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Midday Form", "midday", PokemonType.ROCK, null, 0.8, 25, AbilityId.KEEN_EYE, AbilityId.SAND_RUSH, AbilityId.STEADFAST, 487, 75, 115, 65, 55, 65, 112, 90, 50, 170, false, "", true), - new PokemonForm("Midnight Form", "midnight", PokemonType.ROCK, null, 1.1, 25, AbilityId.KEEN_EYE, AbilityId.VITAL_SPIRIT, AbilityId.NO_GUARD, 487, 85, 115, 75, 55, 75, 82, 90, 50, 170, false, null, true), - new PokemonForm("Dusk Form", "dusk", PokemonType.ROCK, null, 0.8, 25, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, AbilityId.TOUGH_CLAWS, 487, 75, 117, 65, 55, 65, 110, 90, 50, 170, false, null, true), - ), - new PokemonSpecies(SpeciesId.WISHIWASHI, 7, false, false, false, "Small Fry Pokémon", PokemonType.WATER, null, 0.2, 0.3, AbilityId.SCHOOLING, AbilityId.NONE, AbilityId.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, GrowthRate.FAST, 50, false, false, - new PokemonForm("Solo Form", "", PokemonType.WATER, null, 0.2, 0.3, AbilityId.SCHOOLING, AbilityId.NONE, AbilityId.NONE, 175, 45, 20, 20, 25, 25, 40, 60, 50, 61, false, null, true), - new PokemonForm("School", "school", PokemonType.WATER, null, 8.2, 78.6, AbilityId.SCHOOLING, AbilityId.NONE, AbilityId.NONE, 620, 45, 140, 130, 140, 135, 30, 60, 50, 217), - ), - new PokemonSpecies(SpeciesId.MAREANIE, 7, false, false, false, "Brutal Star Pokémon", PokemonType.POISON, PokemonType.WATER, 0.4, 8, AbilityId.MERCILESS, AbilityId.LIMBER, AbilityId.REGENERATOR, 305, 50, 53, 62, 43, 52, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TOXAPEX, 7, false, false, false, "Brutal Star Pokémon", PokemonType.POISON, PokemonType.WATER, 0.7, 14.5, AbilityId.MERCILESS, AbilityId.LIMBER, AbilityId.REGENERATOR, 495, 50, 63, 152, 53, 142, 35, 75, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MUDBRAY, 7, false, false, false, "Donkey Pokémon", PokemonType.GROUND, null, 1, 110, AbilityId.OWN_TEMPO, AbilityId.STAMINA, AbilityId.INNER_FOCUS, 385, 70, 100, 70, 45, 55, 45, 190, 50, 77, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MUDSDALE, 7, false, false, false, "Draft Horse Pokémon", PokemonType.GROUND, null, 2.5, 920, AbilityId.OWN_TEMPO, AbilityId.STAMINA, AbilityId.INNER_FOCUS, 500, 100, 125, 100, 55, 85, 35, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DEWPIDER, 7, false, false, false, "Water Bubble Pokémon", PokemonType.WATER, PokemonType.BUG, 0.3, 4, AbilityId.WATER_BUBBLE, AbilityId.NONE, AbilityId.WATER_ABSORB, 269, 38, 40, 52, 40, 72, 27, 200, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ARAQUANID, 7, false, false, false, "Water Bubble Pokémon", PokemonType.WATER, PokemonType.BUG, 1.8, 82, AbilityId.WATER_BUBBLE, AbilityId.NONE, AbilityId.WATER_ABSORB, 454, 68, 70, 92, 50, 132, 42, 100, 50, 159, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FOMANTIS, 7, false, false, false, "Sickle Grass Pokémon", PokemonType.GRASS, null, 0.3, 1.5, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.CONTRARY, 250, 40, 55, 35, 50, 35, 35, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LURANTIS, 7, false, false, false, "Bloom Sickle Pokémon", PokemonType.GRASS, null, 0.9, 18.5, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.CONTRARY, 480, 70, 105, 90, 80, 90, 45, 75, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MORELULL, 7, false, false, false, "Illuminating Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 0.2, 1.5, AbilityId.ILLUMINATE, AbilityId.EFFECT_SPORE, AbilityId.RAIN_DISH, 285, 40, 35, 55, 65, 75, 15, 190, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SHIINOTIC, 7, false, false, false, "Illuminating Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 1, 11.5, AbilityId.ILLUMINATE, AbilityId.EFFECT_SPORE, AbilityId.RAIN_DISH, 405, 60, 45, 80, 90, 100, 30, 75, 50, 142, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SALANDIT, 7, false, false, false, "Toxic Lizard Pokémon", PokemonType.POISON, PokemonType.FIRE, 0.6, 4.8, AbilityId.CORROSION, AbilityId.NONE, AbilityId.OBLIVIOUS, 320, 48, 44, 40, 71, 40, 77, 120, 50, 64, GrowthRate.MEDIUM_FAST, 87.5, false), - new PokemonSpecies(SpeciesId.SALAZZLE, 7, false, false, false, "Toxic Lizard Pokémon", PokemonType.POISON, PokemonType.FIRE, 1.2, 22.2, AbilityId.CORROSION, AbilityId.NONE, AbilityId.OBLIVIOUS, 480, 68, 64, 60, 111, 60, 117, 45, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(SpeciesId.STUFFUL, 7, false, false, false, "Flailing Pokémon", PokemonType.NORMAL, PokemonType.FIGHTING, 0.5, 6.8, AbilityId.FLUFFY, AbilityId.KLUTZ, AbilityId.CUTE_CHARM, 340, 70, 75, 50, 45, 50, 50, 140, 50, 68, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BEWEAR, 7, false, false, false, "Strong Arm Pokémon", PokemonType.NORMAL, PokemonType.FIGHTING, 2.1, 135, AbilityId.FLUFFY, AbilityId.KLUTZ, AbilityId.UNNERVE, 500, 120, 125, 80, 55, 60, 60, 70, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BOUNSWEET, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 0.3, 3.2, AbilityId.LEAF_GUARD, AbilityId.OBLIVIOUS, AbilityId.SWEET_VEIL, 210, 42, 30, 38, 30, 38, 32, 235, 50, 42, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.STEENEE, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 0.7, 8.2, AbilityId.LEAF_GUARD, AbilityId.OBLIVIOUS, AbilityId.SWEET_VEIL, 290, 52, 40, 48, 40, 48, 62, 120, 50, 102, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.TSAREENA, 7, false, false, false, "Fruit Pokémon", PokemonType.GRASS, null, 1.2, 21.4, AbilityId.LEAF_GUARD, AbilityId.QUEENLY_MAJESTY, AbilityId.SWEET_VEIL, 510, 72, 120, 98, 50, 98, 72, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.COMFEY, 7, false, false, false, "Posy Picker Pokémon", PokemonType.FAIRY, null, 0.1, 0.3, AbilityId.FLOWER_VEIL, AbilityId.TRIAGE, AbilityId.NATURAL_CURE, 485, 51, 52, 90, 82, 110, 100, 60, 50, 170, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.ORANGURU, 7, false, false, false, "Sage Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.5, 76, AbilityId.INNER_FOCUS, AbilityId.TELEPATHY, AbilityId.SYMBIOSIS, 490, 90, 60, 80, 90, 110, 60, 45, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.PASSIMIAN, 7, false, false, false, "Teamwork Pokémon", PokemonType.FIGHTING, null, 2, 82.8, AbilityId.RECEIVER, AbilityId.NONE, AbilityId.DEFIANT, 490, 100, 120, 90, 40, 60, 80, 45, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.WIMPOD, 7, false, false, false, "Turn Tail Pokémon", PokemonType.BUG, PokemonType.WATER, 0.5, 12, AbilityId.WIMP_OUT, AbilityId.NONE, AbilityId.RUN_AWAY, 230, 25, 35, 40, 20, 30, 80, 90, 50, 46, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden - new PokemonSpecies(SpeciesId.GOLISOPOD, 7, false, false, false, "Hard Scale Pokémon", PokemonType.BUG, PokemonType.WATER, 2, 108, AbilityId.EMERGENCY_EXIT, AbilityId.NONE, AbilityId.ANTICIPATION, 530, 75, 125, 140, 60, 90, 40, 45, 50, 186, GrowthRate.MEDIUM_FAST, 50, false), //Custom Hidden - new PokemonSpecies(SpeciesId.SANDYGAST, 7, false, false, false, "Sand Heap Pokémon", PokemonType.GHOST, PokemonType.GROUND, 0.5, 70, AbilityId.WATER_COMPACTION, AbilityId.NONE, AbilityId.SAND_VEIL, 320, 55, 55, 80, 70, 45, 15, 140, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PALOSSAND, 7, false, false, false, "Sand Castle Pokémon", PokemonType.GHOST, PokemonType.GROUND, 1.3, 250, AbilityId.WATER_COMPACTION, AbilityId.NONE, AbilityId.SAND_VEIL, 480, 85, 75, 110, 100, 75, 35, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PYUKUMUKU, 7, false, false, false, "Sea Cucumber Pokémon", PokemonType.WATER, null, 0.3, 1.2, AbilityId.INNARDS_OUT, AbilityId.NONE, AbilityId.UNAWARE, 410, 55, 60, 130, 30, 130, 5, 60, 50, 144, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.TYPE_NULL, 7, true, false, false, "Synthetic Pokémon", PokemonType.NORMAL, null, 1.9, 120.5, AbilityId.BATTLE_ARMOR, AbilityId.NONE, AbilityId.NONE, 534, 95, 95, 95, 95, 95, 59, 3, 0, 107, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SILVALLY, 7, true, false, false, "Synthetic Pokémon", PokemonType.NORMAL, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, GrowthRate.SLOW, null, false, false, - new PokemonForm("Type: Normal", "normal", PokemonType.NORMAL, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, false, "", true), - new PokemonForm("Type: Fighting", "fighting", PokemonType.FIGHTING, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Flying", "flying", PokemonType.FLYING, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Poison", "poison", PokemonType.POISON, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ground", "ground", PokemonType.GROUND, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Rock", "rock", PokemonType.ROCK, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Bug", "bug", PokemonType.BUG, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ghost", "ghost", PokemonType.GHOST, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Steel", "steel", PokemonType.STEEL, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Fire", "fire", PokemonType.FIRE, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Water", "water", PokemonType.WATER, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Grass", "grass", PokemonType.GRASS, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Electric", "electric", PokemonType.ELECTRIC, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Psychic", "psychic", PokemonType.PSYCHIC, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Ice", "ice", PokemonType.ICE, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Dragon", "dragon", PokemonType.DRAGON, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Dark", "dark", PokemonType.DARK, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - new PokemonForm("Type: Fairy", "fairy", PokemonType.FAIRY, null, 2.3, 100.5, AbilityId.RKS_SYSTEM, AbilityId.NONE, AbilityId.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), - ), - new PokemonSpecies(SpeciesId.MINIOR, 7, false, false, false, "Meteor Pokémon", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, GrowthRate.MEDIUM_SLOW, null, false, false, - new PokemonForm("Red Meteor Form", "red-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), - new PokemonForm("Orange Meteor Form", "orange-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), - new PokemonForm("Yellow Meteor Form", "yellow-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), - new PokemonForm("Green Meteor Form", "green-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), - new PokemonForm("Blue Meteor Form", "blue-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), - new PokemonForm("Indigo Meteor Form", "indigo-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), - new PokemonForm("Violet Meteor Form", "violet-meteor", PokemonType.ROCK, PokemonType.FLYING, 0.3, 40, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 440, 60, 60, 100, 60, 100, 60, 30, 70, 154, false, null, true), - new PokemonForm("Red Core Form", "red", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Orange Core Form", "orange", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Yellow Core Form", "yellow", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Green Core Form", "green", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Blue Core Form", "blue", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Indigo Core Form", "indigo", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - new PokemonForm("Violet Core Form", "violet", PokemonType.ROCK, PokemonType.FLYING, 0.3, 0.3, AbilityId.SHIELDS_DOWN, AbilityId.NONE, AbilityId.NONE, 500, 60, 100, 60, 100, 60, 120, 30, 70, 175, false, null, true), - ), - new PokemonSpecies(SpeciesId.KOMALA, 7, false, false, false, "Drowsing Pokémon", PokemonType.NORMAL, null, 0.4, 19.9, AbilityId.COMATOSE, AbilityId.NONE, AbilityId.NONE, 480, 65, 115, 65, 75, 95, 65, 45, 70, 168, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.TURTONATOR, 7, false, false, false, "Blast Turtle Pokémon", PokemonType.FIRE, PokemonType.DRAGON, 2, 212, AbilityId.SHELL_ARMOR, AbilityId.NONE, AbilityId.NONE, 485, 60, 78, 135, 91, 85, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TOGEDEMARU, 7, false, false, false, "Roly-Poly Pokémon", PokemonType.ELECTRIC, PokemonType.STEEL, 0.3, 3.3, AbilityId.IRON_BARBS, AbilityId.LIGHTNING_ROD, AbilityId.STURDY, 435, 65, 98, 63, 40, 73, 96, 180, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MIMIKYU, 7, false, false, false, "Disguise Pokémon", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, AbilityId.DISGUISE, AbilityId.NONE, AbilityId.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Disguised Form", "disguised", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, AbilityId.DISGUISE, AbilityId.NONE, AbilityId.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167, false, null, true), - new PokemonForm("Busted Form", "busted", PokemonType.GHOST, PokemonType.FAIRY, 0.2, 0.7, AbilityId.DISGUISE, AbilityId.NONE, AbilityId.NONE, 476, 55, 90, 80, 50, 105, 96, 45, 50, 167), - ), - new PokemonSpecies(SpeciesId.BRUXISH, 7, false, false, false, "Gnash Teeth Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 0.9, 19, AbilityId.DAZZLING, AbilityId.STRONG_JAW, AbilityId.WONDER_SKIN, 475, 68, 105, 70, 70, 70, 92, 80, 70, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DRAMPA, 7, false, false, false, "Placid Pokémon", PokemonType.NORMAL, PokemonType.DRAGON, 3, 185, AbilityId.BERSERK, AbilityId.SAP_SIPPER, AbilityId.CLOUD_NINE, 485, 78, 60, 85, 135, 91, 36, 70, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DHELMISE, 7, false, false, false, "Sea Creeper Pokémon", PokemonType.GHOST, PokemonType.GRASS, 3.9, 210, AbilityId.STEELWORKER, AbilityId.NONE, AbilityId.NONE, 517, 70, 131, 100, 86, 90, 40, 25, 50, 181, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.JANGMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, null, 0.6, 29.7, AbilityId.BULLETPROOF, AbilityId.SOUNDPROOF, AbilityId.OVERCOAT, 300, 45, 55, 65, 45, 45, 45, 45, 50, 60, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.HAKAMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, PokemonType.FIGHTING, 1.2, 47, AbilityId.BULLETPROOF, AbilityId.SOUNDPROOF, AbilityId.OVERCOAT, 420, 55, 75, 90, 65, 70, 65, 45, 50, 147, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.KOMMO_O, 7, false, false, false, "Scaly Pokémon", PokemonType.DRAGON, PokemonType.FIGHTING, 1.6, 78.2, AbilityId.BULLETPROOF, AbilityId.SOUNDPROOF, AbilityId.OVERCOAT, 600, 75, 110, 125, 100, 105, 85, 45, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.TAPU_KOKO, 7, true, false, false, "Land Spirit Pokémon", PokemonType.ELECTRIC, PokemonType.FAIRY, 1.8, 20.5, AbilityId.ELECTRIC_SURGE, AbilityId.NONE, AbilityId.TELEPATHY, 570, 70, 115, 85, 95, 75, 130, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.TAPU_LELE, 7, true, false, false, "Land Spirit Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.2, 18.6, AbilityId.PSYCHIC_SURGE, AbilityId.NONE, AbilityId.TELEPATHY, 570, 70, 85, 75, 130, 115, 95, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.TAPU_BULU, 7, true, false, false, "Land Spirit Pokémon", PokemonType.GRASS, PokemonType.FAIRY, 1.9, 45.5, AbilityId.GRASSY_SURGE, AbilityId.NONE, AbilityId.TELEPATHY, 570, 70, 130, 115, 85, 95, 75, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.TAPU_FINI, 7, true, false, false, "Land Spirit Pokémon", PokemonType.WATER, PokemonType.FAIRY, 1.3, 21.2, AbilityId.MISTY_SURGE, AbilityId.NONE, AbilityId.TELEPATHY, 570, 70, 75, 115, 95, 130, 85, 3, 50, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.COSMOG, 7, true, false, false, "Nebula Pokémon", PokemonType.PSYCHIC, null, 0.2, 0.1, AbilityId.UNAWARE, AbilityId.NONE, AbilityId.NONE, 200, 43, 29, 31, 29, 31, 37, 3, 0, 40, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.COSMOEM, 7, true, false, false, "Protostar Pokémon", PokemonType.PSYCHIC, null, 0.1, 999.9, AbilityId.STURDY, AbilityId.NONE, AbilityId.NONE, 400, 43, 29, 131, 29, 131, 37, 3, 0, 140, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SOLGALEO, 7, false, true, false, "Sunne Pokémon", PokemonType.PSYCHIC, PokemonType.STEEL, 3.4, 230, AbilityId.FULL_METAL_BODY, AbilityId.NONE, AbilityId.NONE, 680, 137, 137, 107, 113, 89, 97, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.LUNALA, 7, false, true, false, "Moone Pokémon", PokemonType.PSYCHIC, PokemonType.GHOST, 4, 120, AbilityId.SHADOW_SHIELD, AbilityId.NONE, AbilityId.NONE, 680, 137, 113, 89, 137, 107, 97, 3, 0, 340, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.NIHILEGO, 7, true, false, false, "Parasite Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.2, 55.5, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 109, 53, 47, 127, 131, 103, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.BUZZWOLE, 7, true, false, false, "Swollen Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 2.4, 333.6, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 107, 139, 139, 53, 53, 79, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.PHEROMOSA, 7, true, false, false, "Lissome Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 1.8, 25, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 71, 137, 37, 137, 37, 151, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.XURKITREE, 7, true, false, false, "Glowing Pokémon", PokemonType.ELECTRIC, null, 3.8, 100, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 83, 89, 71, 173, 71, 83, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.CELESTEELA, 7, true, false, false, "Launch Pokémon", PokemonType.STEEL, PokemonType.FLYING, 9.2, 999.9, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 97, 101, 103, 107, 101, 61, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.KARTANA, 7, true, false, false, "Drawn Sword Pokémon", PokemonType.GRASS, PokemonType.STEEL, 0.3, 0.1, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 59, 181, 131, 59, 31, 109, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.GUZZLORD, 7, true, false, false, "Junkivore Pokémon", PokemonType.DARK, PokemonType.DRAGON, 5.5, 888, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 223, 101, 53, 97, 53, 43, 45, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.NECROZMA, 7, false, true, false, "Prism Pokémon", PokemonType.PSYCHIC, null, 2.4, 230, AbilityId.PRISM_ARMOR, AbilityId.NONE, AbilityId.NONE, 600, 97, 107, 101, 127, 89, 79, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, null, 2.4, 230, AbilityId.PRISM_ARMOR, AbilityId.NONE, AbilityId.NONE, 600, 97, 107, 101, 127, 89, 79, 3, 0, 300, false, null, true), - new PokemonForm("Dusk Mane", "dusk-mane", PokemonType.PSYCHIC, PokemonType.STEEL, 3.8, 460, AbilityId.PRISM_ARMOR, AbilityId.NONE, AbilityId.NONE, 680, 97, 157, 127, 113, 109, 77, 3, 0, 340), - new PokemonForm("Dawn Wings", "dawn-wings", PokemonType.PSYCHIC, PokemonType.GHOST, 4.2, 350, AbilityId.PRISM_ARMOR, AbilityId.NONE, AbilityId.NONE, 680, 97, 113, 109, 157, 127, 77, 3, 0, 340), - new PokemonForm("Ultra", "ultra", PokemonType.PSYCHIC, PokemonType.DRAGON, 7.5, 230, AbilityId.NEUROFORCE, AbilityId.NONE, AbilityId.NONE, 754, 97, 167, 97, 167, 97, 129, 3, 0, 377), - ), - new PokemonSpecies(SpeciesId.MAGEARNA, 7, false, false, true, "Artificial Pokémon", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, AbilityId.SOUL_HEART, AbilityId.NONE, AbilityId.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, AbilityId.SOUL_HEART, AbilityId.NONE, AbilityId.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), - new PokemonForm("Original", "original", PokemonType.STEEL, PokemonType.FAIRY, 1, 80.5, AbilityId.SOUL_HEART, AbilityId.NONE, AbilityId.NONE, 600, 80, 95, 115, 130, 115, 65, 3, 0, 300, false, null, true), - ), - new PokemonSpecies(SpeciesId.MARSHADOW, 7, false, false, true, "Gloomdweller Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, AbilityId.TECHNICIAN, AbilityId.NONE, AbilityId.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, AbilityId.TECHNICIAN, AbilityId.NONE, AbilityId.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, true), - new PokemonForm("Zenith", "zenith", PokemonType.FIGHTING, PokemonType.GHOST, 0.7, 22.2, AbilityId.TECHNICIAN, AbilityId.NONE, AbilityId.NONE, 600, 90, 125, 80, 90, 90, 125, 3, 0, 300, false, null, false, true) - ), - new PokemonSpecies(SpeciesId.POIPOLE, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, null, 0.6, 1.8, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 420, 67, 73, 67, 73, 67, 73, 45, 0, 210, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.NAGANADEL, 7, true, false, false, "Poison Pin Pokémon", PokemonType.POISON, PokemonType.DRAGON, 3.6, 150, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 540, 73, 73, 73, 127, 73, 121, 45, 0, 270, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.STAKATAKA, 7, true, false, false, "Rampart Pokémon", PokemonType.ROCK, PokemonType.STEEL, 5.5, 820, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 61, 131, 211, 53, 101, 13, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.BLACEPHALON, 7, true, false, false, "Fireworks Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.8, 13, AbilityId.BEAST_BOOST, AbilityId.NONE, AbilityId.NONE, 570, 53, 127, 53, 151, 79, 107, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ZERAORA, 7, false, false, true, "Thunderclap Pokémon", PokemonType.ELECTRIC, null, 1.5, 44.5, AbilityId.VOLT_ABSORB, AbilityId.NONE, AbilityId.NONE, 600, 88, 112, 75, 102, 80, 143, 3, 0, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.MELTAN, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 0.2, 8, AbilityId.MAGNET_PULL, AbilityId.NONE, AbilityId.NONE, 300, 46, 65, 65, 55, 35, 34, 3, 0, 150, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.MELMETAL, 7, false, false, true, "Hex Nut Pokémon", PokemonType.STEEL, null, 2.5, 800, AbilityId.IRON_FIST, AbilityId.NONE, AbilityId.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.STEEL, null, 2.5, 800, AbilityId.IRON_FIST, AbilityId.NONE, AbilityId.NONE, 600, 135, 143, 143, 80, 65, 34, 3, 0, 300, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, null, 25, 999.9, AbilityId.IRON_FIST, AbilityId.NONE, AbilityId.NONE, 700, 170, 158, 158, 95, 75, 44, 3, 0, 300), - ), - new PokemonSpecies(SpeciesId.GROOKEY, 8, false, false, false, "Chimp Pokémon", PokemonType.GRASS, null, 0.3, 5, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.GRASSY_SURGE, 310, 50, 65, 50, 40, 40, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.THWACKEY, 8, false, false, false, "Beat Pokémon", PokemonType.GRASS, null, 0.7, 14, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.RILLABOOM, 8, false, false, false, "Drummer Pokémon", PokemonType.GRASS, null, 2.1, 90, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.GRASS, null, 2.1, 90, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, null, 28, 999.9, AbilityId.GRASSY_SURGE, AbilityId.NONE, AbilityId.GRASSY_SURGE, 630, 125, 140, 105, 90, 85, 85, 45, 50, 265), - ), - new PokemonSpecies(SpeciesId.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.3, 4.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.RABOOT, 8, false, false, false, "Rabbit Pokémon", PokemonType.FIRE, null, 0.6, 9, AbilityId.BLAZE, AbilityId.NONE, AbilityId.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.CINDERACE, 8, false, false, false, "Striker Pokémon", PokemonType.FIRE, null, 1.4, 33, AbilityId.BLAZE, AbilityId.NONE, AbilityId.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.FIRE, null, 1.4, 33, AbilityId.BLAZE, AbilityId.NONE, AbilityId.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, null, 27, 999.9, AbilityId.LIBERO, AbilityId.NONE, AbilityId.LIBERO, 630, 100, 141, 80, 95, 80, 134, 45, 50, 265), - ), - new PokemonSpecies(SpeciesId.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.3, 4, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", PokemonType.WATER, null, 0.7, 11.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.INTELEON, 8, false, false, false, "Secret Agent Pokémon", PokemonType.WATER, null, 1.9, 45.2, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, null, 1.9, 45.2, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, null, 40, 999.9, AbilityId.SNIPER, AbilityId.NONE, AbilityId.SNIPER, 630, 95, 117, 67, 147, 67, 137, 45, 50, 265), - ), - new PokemonSpecies(SpeciesId.SKWOVET, 8, false, false, false, "Cheeky Pokémon", PokemonType.NORMAL, null, 0.3, 2.5, AbilityId.CHEEK_POUCH, AbilityId.NONE, AbilityId.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GREEDENT, 8, false, false, false, "Greedy Pokémon", PokemonType.NORMAL, null, 0.6, 6, AbilityId.CHEEK_POUCH, AbilityId.NONE, AbilityId.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ROOKIDEE, 8, false, false, false, "Tiny Bird Pokémon", PokemonType.FLYING, null, 0.2, 1.8, AbilityId.KEEN_EYE, AbilityId.UNNERVE, AbilityId.BIG_PECKS, 245, 38, 47, 35, 33, 35, 57, 255, 50, 49, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CORVISQUIRE, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, null, 0.8, 16, AbilityId.KEEN_EYE, AbilityId.UNNERVE, AbilityId.BIG_PECKS, 365, 68, 67, 55, 43, 55, 77, 120, 50, 128, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CORVIKNIGHT, 8, false, false, false, "Raven Pokémon", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, AbilityId.PRESSURE, AbilityId.UNNERVE, AbilityId.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.STEEL, 2.2, 75, AbilityId.PRESSURE, AbilityId.UNNERVE, AbilityId.MIRROR_ARMOR, 495, 98, 87, 105, 53, 85, 67, 45, 50, 248, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FLYING, PokemonType.STEEL, 14, 999.9, AbilityId.MIRROR_ARMOR, AbilityId.MIRROR_ARMOR, AbilityId.MIRROR_ARMOR, 595, 118, 112, 135, 63, 90, 77, 45, 50, 248), - ), - new PokemonSpecies(SpeciesId.BLIPBUG, 8, false, false, false, "Larva Pokémon", PokemonType.BUG, null, 0.4, 8, AbilityId.SWARM, AbilityId.COMPOUND_EYES, AbilityId.TELEPATHY, 180, 25, 20, 20, 25, 45, 45, 255, 50, 36, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DOTTLER, 8, false, false, false, "Radome Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 19.5, AbilityId.SWARM, AbilityId.COMPOUND_EYES, AbilityId.TELEPATHY, 335, 50, 35, 80, 50, 90, 30, 120, 50, 117, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ORBEETLE, 8, false, false, false, "Seven Spot Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, AbilityId.SWARM, AbilityId.FRISK, AbilityId.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.BUG, PokemonType.PSYCHIC, 0.4, 40.8, AbilityId.SWARM, AbilityId.FRISK, AbilityId.TELEPATHY, 505, 60, 45, 110, 80, 120, 90, 45, 50, 253, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.BUG, PokemonType.PSYCHIC, 14, 999.9, AbilityId.TRACE, AbilityId.TRACE, AbilityId.TRACE, 605, 75, 50, 140, 100, 150, 90, 45, 50, 253), - ), - new PokemonSpecies(SpeciesId.NICKIT, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 0.6, 8.9, AbilityId.RUN_AWAY, AbilityId.UNBURDEN, AbilityId.STAKEOUT, 245, 40, 28, 28, 47, 52, 50, 255, 50, 49, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.THIEVUL, 8, false, false, false, "Fox Pokémon", PokemonType.DARK, null, 1.2, 19.9, AbilityId.RUN_AWAY, AbilityId.UNBURDEN, AbilityId.STAKEOUT, 455, 70, 58, 58, 87, 92, 90, 127, 50, 159, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.GOSSIFLEUR, 8, false, false, false, "Flowering Pokémon", PokemonType.GRASS, null, 0.4, 2.2, AbilityId.COTTON_DOWN, AbilityId.REGENERATOR, AbilityId.EFFECT_SPORE, 250, 40, 40, 60, 40, 60, 10, 190, 50, 50, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ELDEGOSS, 8, false, false, false, "Cotton Bloom Pokémon", PokemonType.GRASS, null, 0.5, 2.5, AbilityId.COTTON_DOWN, AbilityId.REGENERATOR, AbilityId.EFFECT_SPORE, 460, 60, 50, 90, 80, 120, 60, 75, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WOOLOO, 8, false, false, false, "Sheep Pokémon", PokemonType.NORMAL, null, 0.6, 6, AbilityId.FLUFFY, AbilityId.RUN_AWAY, AbilityId.BULLETPROOF, 270, 42, 40, 55, 40, 45, 48, 255, 50, 122, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DUBWOOL, 8, false, false, false, "Sheep Pokémon", PokemonType.NORMAL, null, 1.3, 43, AbilityId.FLUFFY, AbilityId.STEADFAST, AbilityId.BULLETPROOF, 490, 72, 80, 100, 60, 90, 88, 127, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CHEWTLE, 8, false, false, false, "Snapping Pokémon", PokemonType.WATER, null, 0.3, 8.5, AbilityId.STRONG_JAW, AbilityId.SHELL_ARMOR, AbilityId.SWIFT_SWIM, 284, 50, 64, 50, 38, 38, 44, 255, 50, 57, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DREDNAW, 8, false, false, false, "Bite Pokémon", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, AbilityId.STRONG_JAW, AbilityId.SHELL_ARMOR, AbilityId.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.WATER, PokemonType.ROCK, 1, 115.5, AbilityId.STRONG_JAW, AbilityId.SHELL_ARMOR, AbilityId.SWIFT_SWIM, 485, 90, 115, 90, 48, 68, 74, 75, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.WATER, PokemonType.ROCK, 24, 999.9, AbilityId.STRONG_JAW, AbilityId.STRONG_JAW, AbilityId.STRONG_JAW, 585, 115, 137, 115, 61, 83, 74, 75, 50, 170), - ), - new PokemonSpecies(SpeciesId.YAMPER, 8, false, false, false, "Puppy Pokémon", PokemonType.ELECTRIC, null, 0.3, 13.5, AbilityId.BALL_FETCH, AbilityId.NONE, AbilityId.RATTLED, 270, 59, 45, 50, 40, 50, 26, 255, 50, 54, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.BOLTUND, 8, false, false, false, "Dog Pokémon", PokemonType.ELECTRIC, null, 1, 34, AbilityId.STRONG_JAW, AbilityId.NONE, AbilityId.COMPETITIVE, 490, 69, 90, 60, 90, 60, 121, 45, 50, 172, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.ROLYCOLY, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, null, 0.3, 12, AbilityId.STEAM_ENGINE, AbilityId.HEATPROOF, AbilityId.FLASH_FIRE, 240, 30, 40, 50, 40, 50, 30, 255, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CARKOL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 1.1, 78, AbilityId.STEAM_ENGINE, AbilityId.FLAME_BODY, AbilityId.FLASH_FIRE, 410, 80, 60, 90, 60, 70, 50, 120, 50, 144, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.COALOSSAL, 8, false, false, false, "Coal Pokémon", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, AbilityId.STEAM_ENGINE, AbilityId.FLAME_BODY, AbilityId.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Normal", "", PokemonType.ROCK, PokemonType.FIRE, 2.8, 310.5, AbilityId.STEAM_ENGINE, AbilityId.FLAME_BODY, AbilityId.FLASH_FIRE, 510, 110, 80, 120, 80, 90, 30, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ROCK, PokemonType.FIRE, 42, 999.9, AbilityId.STEAM_ENGINE, AbilityId.STEAM_ENGINE, AbilityId.STEAM_ENGINE, 610, 140, 100, 132, 95, 100, 43, 45, 50, 255), - ), - new PokemonSpecies(SpeciesId.APPLIN, 8, false, false, false, "Apple Core Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.2, 0.5, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.BULLETPROOF, 260, 40, 40, 80, 40, 40, 20, 255, 50, 52, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.FLAPPLE, 8, false, false, false, "Apple Wing Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.DRAGON, 0.3, 1, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.HUSTLE, 485, 70, 110, 80, 95, 60, 70, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.DRAGON, 24, 999.9, AbilityId.HUSTLE, AbilityId.HUSTLE, AbilityId.HUSTLE, 585, 100, 125, 90, 105, 70, 95, 45, 50, 170), - ), - new PokemonSpecies(SpeciesId.APPLETUN, 8, false, false, false, "Apple Nectar Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 13, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, GrowthRate.ERRATIC, 50, false, true, - new PokemonForm("Normal", "", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 13, AbilityId.RIPEN, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 485, 110, 85, 80, 100, 80, 30, 45, 50, 170, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GRASS, PokemonType.DRAGON, 24, 999.9, AbilityId.THICK_FAT, AbilityId.THICK_FAT, AbilityId.THICK_FAT, 585, 150, 100, 95, 115, 95, 30, 45, 50, 170), - ), - new PokemonSpecies(SpeciesId.SILICOBRA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 2.2, 7.6, AbilityId.SAND_SPIT, AbilityId.SHED_SKIN, AbilityId.SAND_VEIL, 315, 52, 57, 75, 35, 50, 46, 255, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SANDACONDA, 8, false, false, false, "Sand Snake Pokémon", PokemonType.GROUND, null, 3.8, 65.5, AbilityId.SAND_SPIT, AbilityId.SHED_SKIN, AbilityId.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.GROUND, null, 3.8, 65.5, AbilityId.SAND_SPIT, AbilityId.SHED_SKIN, AbilityId.SAND_VEIL, 510, 72, 107, 125, 65, 70, 71, 120, 50, 179, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.GROUND, null, 22, 999.9, AbilityId.SAND_SPIT, AbilityId.SAND_SPIT, AbilityId.SAND_SPIT, 610, 102, 137, 140, 70, 80, 81, 120, 50, 179), - ), - new PokemonSpecies(SpeciesId.CRAMORANT, 8, false, false, false, "Gulp Pokémon", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, AbilityId.GULP_MISSILE, AbilityId.NONE, AbilityId.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, AbilityId.GULP_MISSILE, AbilityId.NONE, AbilityId.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166, false, null, true), - new PokemonForm("Gulping Form", "gulping", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, AbilityId.GULP_MISSILE, AbilityId.NONE, AbilityId.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), - new PokemonForm("Gorging Form", "gorging", PokemonType.FLYING, PokemonType.WATER, 0.8, 18, AbilityId.GULP_MISSILE, AbilityId.NONE, AbilityId.NONE, 475, 70, 85, 55, 85, 95, 85, 45, 50, 166), - ), - new PokemonSpecies(SpeciesId.ARROKUDA, 8, false, false, false, "Rush Pokémon", PokemonType.WATER, null, 0.5, 1, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.PROPELLER_TAIL, 280, 41, 63, 40, 40, 30, 66, 255, 50, 56, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.BARRASKEWDA, 8, false, false, false, "Skewer Pokémon", PokemonType.WATER, null, 1.3, 30, AbilityId.SWIFT_SWIM, AbilityId.NONE, AbilityId.PROPELLER_TAIL, 490, 61, 123, 60, 60, 50, 136, 60, 50, 172, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.TOXEL, 8, false, false, false, "Baby Pokémon", PokemonType.ELECTRIC, PokemonType.POISON, 0.4, 11, AbilityId.RATTLED, AbilityId.STATIC, AbilityId.KLUTZ, 242, 40, 38, 35, 54, 35, 40, 75, 50, 48, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.TOXTRICITY, 8, false, false, false, "Punk Pokémon", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, AbilityId.PUNK_ROCK, AbilityId.PLUS, AbilityId.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Amped Form", "amped", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, AbilityId.PUNK_ROCK, AbilityId.PLUS, AbilityId.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "", true), - new PokemonForm("Low-Key Form", "lowkey", PokemonType.ELECTRIC, PokemonType.POISON, 1.6, 40, AbilityId.PUNK_ROCK, AbilityId.MINUS, AbilityId.TECHNICIAN, 502, 75, 98, 70, 114, 70, 75, 45, 50, 176, false, "lowkey", true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.ELECTRIC, PokemonType.POISON, 24, 999.9, AbilityId.PUNK_ROCK, AbilityId.PUNK_ROCK, AbilityId.PUNK_ROCK, 602, 114, 105, 82, 137, 82, 82, 45, 50, 176), - ), - new PokemonSpecies(SpeciesId.SIZZLIPEDE, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 0.7, 1, AbilityId.FLASH_FIRE, AbilityId.WHITE_SMOKE, AbilityId.FLAME_BODY, 305, 50, 65, 45, 50, 50, 45, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CENTISKORCH, 8, false, false, false, "Radiator Pokémon", PokemonType.FIRE, PokemonType.BUG, 3, 120, AbilityId.FLASH_FIRE, AbilityId.WHITE_SMOKE, AbilityId.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.FIRE, PokemonType.BUG, 3, 120, AbilityId.FLASH_FIRE, AbilityId.WHITE_SMOKE, AbilityId.FLAME_BODY, 525, 100, 115, 65, 90, 90, 65, 75, 50, 184, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FIRE, PokemonType.BUG, 75, 999.9, AbilityId.FLASH_FIRE, AbilityId.FLASH_FIRE, AbilityId.FLASH_FIRE, 625, 130, 125, 75, 94, 100, 101, 75, 50, 184), - ), - new PokemonSpecies(SpeciesId.CLOBBOPUS, 8, false, false, false, "Tantrum Pokémon", PokemonType.FIGHTING, null, 0.6, 4, AbilityId.LIMBER, AbilityId.NONE, AbilityId.TECHNICIAN, 310, 50, 68, 60, 50, 50, 32, 180, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GRAPPLOCT, 8, false, false, false, "Jujitsu Pokémon", PokemonType.FIGHTING, null, 1.6, 39, AbilityId.LIMBER, AbilityId.NONE, AbilityId.TECHNICIAN, 480, 80, 118, 90, 70, 80, 42, 45, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SINISTEA, 8, false, false, false, "Black Tea Pokémon", PokemonType.GHOST, null, 0.1, 0.2, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Phony Form", "phony", PokemonType.GHOST, null, 0.1, 0.2, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), - new PokemonForm("Antique Form", "antique", PokemonType.GHOST, null, 0.1, 0.2, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "", true), - ), - new PokemonSpecies(SpeciesId.POLTEAGEIST, 8, false, false, false, "Black Tea Pokémon", PokemonType.GHOST, null, 0.2, 0.4, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, GrowthRate.MEDIUM_FAST, null, false, false, - new PokemonForm("Phony Form", "phony", PokemonType.GHOST, null, 0.2, 0.4, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), - new PokemonForm("Antique Form", "antique", PokemonType.GHOST, null, 0.2, 0.4, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 508, 60, 65, 65, 134, 114, 70, 60, 50, 178, false, "", true), - ), - new PokemonSpecies(SpeciesId.HATENNA, 8, false, false, false, "Calm Pokémon", PokemonType.PSYCHIC, null, 0.4, 3.4, AbilityId.HEALER, AbilityId.ANTICIPATION, AbilityId.MAGIC_BOUNCE, 265, 42, 30, 45, 56, 53, 39, 235, 50, 53, GrowthRate.SLOW, 0, false), - new PokemonSpecies(SpeciesId.HATTREM, 8, false, false, false, "Serene Pokémon", PokemonType.PSYCHIC, null, 0.6, 4.8, AbilityId.HEALER, AbilityId.ANTICIPATION, AbilityId.MAGIC_BOUNCE, 370, 57, 40, 65, 86, 73, 49, 120, 50, 130, GrowthRate.SLOW, 0, false), - new PokemonSpecies(SpeciesId.HATTERENE, 8, false, false, false, "Silent Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 2.1, 5.1, AbilityId.HEALER, AbilityId.ANTICIPATION, AbilityId.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.FAIRY, 2.1, 5.1, AbilityId.HEALER, AbilityId.ANTICIPATION, AbilityId.MAGIC_BOUNCE, 510, 57, 90, 95, 136, 103, 29, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.PSYCHIC, PokemonType.FAIRY, 26, 999.9, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, AbilityId.MAGIC_BOUNCE, 610, 87, 100, 110, 146, 118, 49, 45, 50, 255), - ), - new PokemonSpecies(SpeciesId.IMPIDIMP, 8, false, false, false, "Wily Pokémon", PokemonType.DARK, PokemonType.FAIRY, 0.4, 5.5, AbilityId.PRANKSTER, AbilityId.FRISK, AbilityId.PICKPOCKET, 265, 45, 45, 30, 55, 40, 50, 255, 50, 53, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.MORGREM, 8, false, false, false, "Devious Pokémon", PokemonType.DARK, PokemonType.FAIRY, 0.8, 12.5, AbilityId.PRANKSTER, AbilityId.FRISK, AbilityId.PICKPOCKET, 370, 65, 60, 45, 75, 55, 70, 120, 50, 130, GrowthRate.MEDIUM_FAST, 100, false), - new PokemonSpecies(SpeciesId.GRIMMSNARL, 8, false, false, false, "Bulk Up Pokémon", PokemonType.DARK, PokemonType.FAIRY, 1.5, 61, AbilityId.PRANKSTER, AbilityId.FRISK, AbilityId.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, GrowthRate.MEDIUM_FAST, 100, false, true, - new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.FAIRY, 1.5, 61, AbilityId.PRANKSTER, AbilityId.FRISK, AbilityId.PICKPOCKET, 510, 95, 120, 65, 95, 75, 60, 45, 50, 255, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.DARK, PokemonType.FAIRY, 32, 999.9, AbilityId.PRANKSTER, AbilityId.PRANKSTER, AbilityId.PRANKSTER, 610, 130, 138, 75, 110, 92, 65, 45, 50, 255), - ), - new PokemonSpecies(SpeciesId.OBSTAGOON, 8, false, false, false, "Blocking Pokémon", PokemonType.DARK, PokemonType.NORMAL, 1.6, 46, AbilityId.RECKLESS, AbilityId.GUTS, AbilityId.DEFIANT, 520, 93, 90, 101, 60, 81, 95, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PERRSERKER, 8, false, false, false, "Viking Pokémon", PokemonType.STEEL, null, 0.8, 28, AbilityId.BATTLE_ARMOR, AbilityId.TOUGH_CLAWS, AbilityId.STEELY_SPIRIT, 440, 70, 110, 100, 50, 60, 50, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CURSOLA, 8, false, false, false, "Coral Pokémon", PokemonType.GHOST, null, 1, 0.4, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.PERISH_BODY, 510, 60, 95, 50, 145, 130, 30, 30, 50, 179, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.SIRFETCHD, 8, false, false, false, "Wild Duck Pokémon", PokemonType.FIGHTING, null, 0.8, 117, AbilityId.STEADFAST, AbilityId.NONE, AbilityId.SCRAPPY, 507, 62, 135, 95, 68, 82, 65, 45, 50, 177, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MR_RIME, 8, false, false, false, "Comedian Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.5, 58.2, AbilityId.TANGLED_FEET, AbilityId.SCREEN_CLEANER, AbilityId.ICE_BODY, 520, 80, 85, 75, 110, 100, 70, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.RUNERIGUS, 8, false, false, false, "Grudge Pokémon", PokemonType.GROUND, PokemonType.GHOST, 1.6, 66.6, AbilityId.WANDERING_SPIRIT, AbilityId.NONE, AbilityId.NONE, 483, 58, 95, 145, 50, 105, 30, 90, 50, 169, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.MILCERY, 8, false, false, false, "Cream Pokémon", PokemonType.FAIRY, null, 0.2, 0.3, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 270, 45, 40, 40, 50, 61, 34, 200, 50, 54, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(SpeciesId.ALCREMIE, 8, false, false, false, "Cream Pokémon", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, GrowthRate.MEDIUM_FAST, 0, false, true, - new PokemonForm("Vanilla Cream", "vanilla-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, "", true), - new PokemonForm("Ruby Cream", "ruby-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Matcha Cream", "matcha-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Mint Cream", "mint-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Lemon Cream", "lemon-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Salted Cream", "salted-cream", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Ruby Swirl", "ruby-swirl", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Caramel Swirl", "caramel-swirl", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("Rainbow Swirl", "rainbow-swirl", PokemonType.FAIRY, null, 0.3, 0.5, AbilityId.SWEET_VEIL, AbilityId.NONE, AbilityId.AROMA_VEIL, 495, 65, 60, 75, 110, 121, 64, 100, 50, 173, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.FAIRY, null, 30, 999.9, AbilityId.MISTY_SURGE, AbilityId.NONE, AbilityId.MISTY_SURGE, 595, 105, 70, 85, 130, 141, 64, 100, 50, 173), - ), - new PokemonSpecies(SpeciesId.FALINKS, 8, false, false, false, "Formation Pokémon", PokemonType.FIGHTING, null, 3, 62, AbilityId.BATTLE_ARMOR, AbilityId.NONE, AbilityId.DEFIANT, 470, 65, 100, 100, 70, 60, 75, 45, 50, 165, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.PINCURCHIN, 8, false, false, false, "Sea Urchin Pokémon", PokemonType.ELECTRIC, null, 0.3, 1, AbilityId.LIGHTNING_ROD, AbilityId.NONE, AbilityId.ELECTRIC_SURGE, 435, 48, 101, 95, 91, 85, 15, 75, 50, 152, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SNOM, 8, false, false, false, "Worm Pokémon", PokemonType.ICE, PokemonType.BUG, 0.3, 3.8, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.ICE_SCALES, 185, 30, 25, 35, 45, 30, 20, 190, 50, 37, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FROSMOTH, 8, false, false, false, "Frost Moth Pokémon", PokemonType.ICE, PokemonType.BUG, 1.3, 42, AbilityId.SHIELD_DUST, AbilityId.NONE, AbilityId.ICE_SCALES, 475, 70, 65, 60, 125, 90, 65, 75, 50, 166, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.STONJOURNER, 8, false, false, false, "Big Rock Pokémon", PokemonType.ROCK, null, 2.5, 520, AbilityId.POWER_SPOT, AbilityId.NONE, AbilityId.NONE, 470, 100, 125, 135, 20, 20, 70, 60, 50, 165, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.EISCUE, 8, false, false, false, "Penguin Pokémon", PokemonType.ICE, null, 1.4, 89, AbilityId.ICE_FACE, AbilityId.NONE, AbilityId.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, GrowthRate.SLOW, 50, false, false, - new PokemonForm("Ice Face", "", PokemonType.ICE, null, 1.4, 89, AbilityId.ICE_FACE, AbilityId.NONE, AbilityId.NONE, 470, 75, 80, 110, 65, 90, 50, 60, 50, 165, false, null, true), - new PokemonForm("No Ice", "no-ice", PokemonType.ICE, null, 1.4, 89, AbilityId.ICE_FACE, AbilityId.NONE, AbilityId.NONE, 470, 75, 80, 70, 65, 50, 130, 60, 50, 165), - ), - new PokemonSpecies(SpeciesId.INDEEDEE, 8, false, false, false, "Emotion Pokémon", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, AbilityId.INNER_FOCUS, AbilityId.SYNCHRONIZE, AbilityId.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, GrowthRate.FAST, 50, false, false, - new PokemonForm("Male", "male", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, AbilityId.INNER_FOCUS, AbilityId.SYNCHRONIZE, AbilityId.PSYCHIC_SURGE, 475, 60, 65, 55, 105, 95, 95, 30, 140, 166, false, "", true), - new PokemonForm("Female", "female", PokemonType.PSYCHIC, PokemonType.NORMAL, 0.9, 28, AbilityId.OWN_TEMPO, AbilityId.SYNCHRONIZE, AbilityId.PSYCHIC_SURGE, 475, 70, 55, 65, 95, 105, 85, 30, 140, 166, false, null, true), - ), - new PokemonSpecies(SpeciesId.MORPEKO, 8, false, false, false, "Two-Sided Pokémon", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, AbilityId.HUNGER_SWITCH, AbilityId.NONE, AbilityId.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Full Belly Mode", "full-belly", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, AbilityId.HUNGER_SWITCH, AbilityId.NONE, AbilityId.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153, false, "", true), - new PokemonForm("Hangry Mode", "hangry", PokemonType.ELECTRIC, PokemonType.DARK, 0.3, 3, AbilityId.HUNGER_SWITCH, AbilityId.NONE, AbilityId.NONE, 436, 58, 95, 58, 70, 58, 97, 180, 50, 153), - ), - new PokemonSpecies(SpeciesId.CUFANT, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 1.2, 100, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.HEAVY_METAL, 330, 72, 80, 49, 40, 49, 40, 190, 50, 66, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.COPPERAJAH, 8, false, false, false, "Copperderm Pokémon", PokemonType.STEEL, null, 3, 650, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.STEEL, null, 3, 650, AbilityId.SHEER_FORCE, AbilityId.NONE, AbilityId.HEAVY_METAL, 500, 122, 130, 69, 80, 69, 30, 90, 50, 175, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.GROUND, 23, 999.9, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.MOLD_BREAKER, 600, 177, 155, 79, 90, 79, 20, 90, 50, 175), - ), - new PokemonSpecies(SpeciesId.DRACOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 1.8, 190, AbilityId.VOLT_ABSORB, AbilityId.HUSTLE, AbilityId.SAND_RUSH, 505, 90, 100, 90, 80, 70, 75, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ARCTOZOLT, 8, false, false, false, "Fossil Pokémon", PokemonType.ELECTRIC, PokemonType.ICE, 2.3, 150, AbilityId.VOLT_ABSORB, AbilityId.STATIC, AbilityId.SLUSH_RUSH, 505, 90, 100, 90, 90, 80, 55, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.DRACOVISH, 8, false, false, false, "Fossil Pokémon", PokemonType.WATER, PokemonType.DRAGON, 2.3, 215, AbilityId.WATER_ABSORB, AbilityId.STRONG_JAW, AbilityId.SAND_RUSH, 505, 90, 90, 100, 70, 80, 75, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ARCTOVISH, 8, false, false, false, "Fossil Pokémon", PokemonType.WATER, PokemonType.ICE, 2, 175, AbilityId.WATER_ABSORB, AbilityId.ICE_BODY, AbilityId.SLUSH_RUSH, 505, 90, 90, 100, 80, 90, 55, 45, 50, 177, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.DURALUDON, 8, false, false, false, "Alloy Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 1.8, 40, AbilityId.LIGHT_METAL, AbilityId.HEAVY_METAL, AbilityId.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, GrowthRate.MEDIUM_FAST, 50, false, true, - new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.DRAGON, 1.8, 40, AbilityId.LIGHT_METAL, AbilityId.HEAVY_METAL, AbilityId.STALWART, 535, 70, 95, 115, 120, 50, 85, 45, 50, 187, false, null, true), - new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, PokemonType.STEEL, PokemonType.DRAGON, 43, 999.9, AbilityId.LIGHTNING_ROD, AbilityId.LIGHTNING_ROD, AbilityId.LIGHTNING_ROD, 635, 100, 110, 120, 175, 60, 70, 45, 50, 187), - ), - new PokemonSpecies(SpeciesId.DREEPY, 8, false, false, false, "Lingering Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 0.5, 2, AbilityId.CLEAR_BODY, AbilityId.INFILTRATOR, AbilityId.CURSED_BODY, 270, 28, 60, 30, 40, 30, 82, 45, 50, 54, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.DRAKLOAK, 8, false, false, false, "Caretaker Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 1.4, 11, AbilityId.CLEAR_BODY, AbilityId.INFILTRATOR, AbilityId.CURSED_BODY, 410, 68, 80, 50, 60, 50, 102, 45, 50, 144, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.DRAGAPULT, 8, false, false, false, "Stealth Pokémon", PokemonType.DRAGON, PokemonType.GHOST, 3, 50, AbilityId.CLEAR_BODY, AbilityId.INFILTRATOR, AbilityId.CURSED_BODY, 600, 88, 120, 75, 100, 75, 142, 45, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.ZACIAN, 8, false, true, false, "Warrior Pokémon", PokemonType.FAIRY, null, 2.8, 110, AbilityId.INTREPID_SWORD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hero of Many Battles", "hero-of-many-battles", PokemonType.FAIRY, null, 2.8, 110, AbilityId.INTREPID_SWORD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), - new PokemonForm("Crowned", "crowned", PokemonType.FAIRY, PokemonType.STEEL, 2.8, 355, AbilityId.INTREPID_SWORD, AbilityId.NONE, AbilityId.NONE, 700, 92, 150, 115, 80, 115, 148, 10, 0, 360), - ), - new PokemonSpecies(SpeciesId.ZAMAZENTA, 8, false, true, false, "Warrior Pokémon", PokemonType.FIGHTING, null, 2.9, 210, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Hero of Many Battles", "hero-of-many-battles", PokemonType.FIGHTING, null, 2.9, 210, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 660, 92, 120, 115, 80, 115, 138, 10, 0, 335, false, "", true), - new PokemonForm("Crowned", "crowned", PokemonType.FIGHTING, PokemonType.STEEL, 2.9, 785, AbilityId.DAUNTLESS_SHIELD, AbilityId.NONE, AbilityId.NONE, 700, 92, 120, 140, 80, 140, 128, 10, 0, 360), - ), - new PokemonSpecies(SpeciesId.ETERNATUS, 8, false, true, false, "Gigantic Pokémon", PokemonType.POISON, PokemonType.DRAGON, 20, 950, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.POISON, PokemonType.DRAGON, 20, 950, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 690, 140, 85, 95, 145, 95, 130, 255, 0, 345, false, null, true), - new PokemonForm("E-Max", "eternamax", PokemonType.POISON, PokemonType.DRAGON, 100, 999.9, AbilityId.PRESSURE, AbilityId.NONE, AbilityId.NONE, 1125, 255, 115, 250, 125, 250, 130, 255, 0, 345), - ), - new PokemonSpecies(SpeciesId.KUBFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, null, 0.6, 12, AbilityId.INNER_FOCUS, AbilityId.NONE, AbilityId.NONE, 385, 60, 90, 60, 53, 50, 72, 3, 50, 77, GrowthRate.SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.URSHIFU, 8, true, false, false, "Wushu Pokémon", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, GrowthRate.SLOW, 87.5, false, true, - new PokemonForm("Single Strike Style", "single-strike", PokemonType.FIGHTING, PokemonType.DARK, 1.9, 105, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, "", true), - new PokemonForm("Rapid Strike Style", "rapid-strike", PokemonType.FIGHTING, PokemonType.WATER, 1.9, 105, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 550, 100, 130, 100, 63, 60, 97, 3, 50, 275, false, null, true), - new PokemonForm("G-Max Single Strike Style", SpeciesFormKey.GIGANTAMAX_SINGLE, PokemonType.FIGHTING, PokemonType.DARK, 29, 999.9, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 650, 125, 145, 115, 83, 70, 112, 3, 50, 275), - new PokemonForm("G-Max Rapid Strike Style", SpeciesFormKey.GIGANTAMAX_RAPID, PokemonType.FIGHTING, PokemonType.WATER, 26, 999.9, AbilityId.UNSEEN_FIST, AbilityId.NONE, AbilityId.NONE, 650, 125, 145, 115, 83, 70, 112, 3, 50, 275), - ), - new PokemonSpecies(SpeciesId.ZARUDE, 8, false, false, true, "Rogue Monkey Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, GrowthRate.SLOW, null, false, false, - new PokemonForm("Normal", "", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), - new PokemonForm("Dada", "dada", PokemonType.DARK, PokemonType.GRASS, 1.8, 70, AbilityId.LEAF_GUARD, AbilityId.NONE, AbilityId.NONE, 600, 105, 120, 105, 70, 95, 105, 3, 0, 300, false, null, true), - ), - new PokemonSpecies(SpeciesId.REGIELEKI, 8, true, false, false, "Electron Pokémon", PokemonType.ELECTRIC, null, 1.2, 145, AbilityId.TRANSISTOR, AbilityId.NONE, AbilityId.NONE, 580, 80, 100, 50, 100, 50, 200, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.REGIDRAGO, 8, true, false, false, "Dragon Orb Pokémon", PokemonType.DRAGON, null, 2.1, 200, AbilityId.DRAGONS_MAW, AbilityId.NONE, AbilityId.NONE, 580, 200, 100, 50, 100, 50, 80, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.GLASTRIER, 8, true, false, false, "Wild Horse Pokémon", PokemonType.ICE, null, 2.2, 800, AbilityId.CHILLING_NEIGH, AbilityId.NONE, AbilityId.NONE, 580, 100, 145, 130, 65, 110, 30, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SPECTRIER, 8, true, false, false, "Swift Horse Pokémon", PokemonType.GHOST, null, 2, 44.5, AbilityId.GRIM_NEIGH, AbilityId.NONE, AbilityId.NONE, 580, 100, 65, 60, 145, 80, 130, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.CALYREX, 8, false, true, false, "King Pokémon", PokemonType.PSYCHIC, PokemonType.GRASS, 1.1, 7.7, AbilityId.UNNERVE, AbilityId.NONE, AbilityId.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, GrowthRate.SLOW, null, false, true, - new PokemonForm("Normal", "", PokemonType.PSYCHIC, PokemonType.GRASS, 1.1, 7.7, AbilityId.UNNERVE, AbilityId.NONE, AbilityId.NONE, 500, 100, 80, 80, 80, 80, 80, 3, 100, 250, false, null, true), - new PokemonForm("Ice", "ice", PokemonType.PSYCHIC, PokemonType.ICE, 2.4, 809.1, AbilityId.AS_ONE_GLASTRIER, AbilityId.NONE, AbilityId.NONE, 680, 100, 165, 150, 85, 130, 50, 3, 100, 340), - new PokemonForm("Shadow", "shadow", PokemonType.PSYCHIC, PokemonType.GHOST, 2.4, 53.6, AbilityId.AS_ONE_SPECTRIER, AbilityId.NONE, AbilityId.NONE, 680, 100, 85, 80, 165, 100, 150, 3, 100, 340), - ), - new PokemonSpecies(SpeciesId.WYRDEER, 8, false, false, false, "Big Horn Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 1.8, 95.1, AbilityId.INTIMIDATE, AbilityId.FRISK, AbilityId.SAP_SIPPER, 525, 103, 105, 72, 105, 75, 65, 45, 50, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.KLEAVOR, 8, false, false, false, "Axe Pokémon", PokemonType.BUG, PokemonType.ROCK, 1.8, 89, AbilityId.SWARM, AbilityId.SHEER_FORCE, AbilityId.SHARPNESS, 500, 70, 135, 95, 45, 70, 85, 15, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.URSALUNA, 8, false, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.4, 290, AbilityId.GUTS, AbilityId.BULLETPROOF, AbilityId.UNNERVE, 550, 130, 140, 105, 45, 80, 50, 20, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BASCULEGION, 8, false, false, false, "Big Fish Pokémon", PokemonType.WATER, PokemonType.GHOST, 3, 110, AbilityId.SWIFT_SWIM, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 45, 50, 265, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", PokemonType.WATER, PokemonType.GHOST, 3, 110, AbilityId.SWIFT_SWIM, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 530, 120, 112, 65, 80, 75, 78, 45, 50, 265, false, "", true), - new PokemonForm("Female", "female", PokemonType.WATER, PokemonType.GHOST, 3, 110, AbilityId.SWIFT_SWIM, AbilityId.ADAPTABILITY, AbilityId.MOLD_BREAKER, 530, 120, 92, 65, 100, 75, 78, 45, 50, 265, false, null, true), - ), - new PokemonSpecies(SpeciesId.SNEASLER, 8, false, false, false, "Free Climb Pokémon", PokemonType.FIGHTING, PokemonType.POISON, 1.3, 43, AbilityId.PRESSURE, AbilityId.UNBURDEN, AbilityId.POISON_TOUCH, 510, 80, 130, 60, 40, 80, 120, 20, 50, 102, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.OVERQWIL, 8, false, false, false, "Pin Cluster Pokémon", PokemonType.DARK, PokemonType.POISON, 2.5, 60.5, AbilityId.POISON_POINT, AbilityId.SWIFT_SWIM, AbilityId.INTIMIDATE, 510, 85, 115, 95, 65, 65, 85, 45, 50, 179, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ENAMORUS, 8, true, false, false, "Love-Hate Pokémon", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, AbilityId.CUTE_CHARM, AbilityId.NONE, AbilityId.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, GrowthRate.SLOW, 0, false, true, - new PokemonForm("Incarnate Forme", "incarnate", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, AbilityId.CUTE_CHARM, AbilityId.NONE, AbilityId.CONTRARY, 580, 74, 115, 70, 135, 80, 106, 3, 50, 116, false, null, true), - new PokemonForm("Therian Forme", "therian", PokemonType.FAIRY, PokemonType.FLYING, 1.6, 48, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 580, 74, 115, 110, 135, 100, 46, 3, 50, 116), - ), - new PokemonSpecies(SpeciesId.SPRIGATITO, 9, false, false, false, "Grass Cat Pokémon", PokemonType.GRASS, null, 0.4, 4.1, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.PROTEAN, 310, 40, 61, 54, 45, 45, 65, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.FLORAGATO, 9, false, false, false, "Grass Cat Pokémon", PokemonType.GRASS, null, 0.9, 12.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.PROTEAN, 410, 61, 80, 63, 60, 63, 83, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.MEOWSCARADA, 9, false, false, false, "Magician Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.5, 31.2, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.PROTEAN, 530, 76, 110, 70, 81, 70, 123, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.FUECOCO, 9, false, false, false, "Fire Croc Pokémon", PokemonType.FIRE, null, 0.4, 9.8, AbilityId.BLAZE, AbilityId.NONE, AbilityId.UNAWARE, 310, 67, 45, 59, 63, 40, 36, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.CROCALOR, 9, false, false, false, "Fire Croc Pokémon", PokemonType.FIRE, null, 1, 30.7, AbilityId.BLAZE, AbilityId.NONE, AbilityId.UNAWARE, 411, 81, 55, 78, 90, 58, 49, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.SKELEDIRGE, 9, false, false, false, "Singer Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 326.5, AbilityId.BLAZE, AbilityId.NONE, AbilityId.UNAWARE, 530, 104, 75, 100, 110, 75, 66, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.QUAXLY, 9, false, false, false, "Duckling Pokémon", PokemonType.WATER, null, 0.5, 6.1, AbilityId.TORRENT, AbilityId.NONE, AbilityId.MOXIE, 310, 55, 65, 45, 50, 45, 50, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.QUAXWELL, 9, false, false, false, "Practicing Pokémon", PokemonType.WATER, null, 1.2, 21.5, AbilityId.TORRENT, AbilityId.NONE, AbilityId.MOXIE, 410, 70, 85, 65, 65, 60, 65, 45, 50, 144, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.QUAQUAVAL, 9, false, false, false, "Dancer Pokémon", PokemonType.WATER, PokemonType.FIGHTING, 1.8, 61.9, AbilityId.TORRENT, AbilityId.NONE, AbilityId.MOXIE, 530, 85, 120, 80, 85, 75, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.LECHONK, 9, false, false, false, "Hog Pokémon", PokemonType.NORMAL, null, 0.5, 10.2, AbilityId.AROMA_VEIL, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 254, 54, 45, 40, 35, 45, 35, 255, 50, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.OINKOLOGNE, 9, false, false, false, "Hog Pokémon", PokemonType.NORMAL, null, 1, 120, AbilityId.LINGERING_AROMA, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Male", "male", PokemonType.NORMAL, null, 1, 120, AbilityId.LINGERING_AROMA, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 489, 110, 100, 75, 59, 80, 65, 100, 50, 171, false, "", true), - new PokemonForm("Female", "female", PokemonType.NORMAL, null, 1, 120, AbilityId.AROMA_VEIL, AbilityId.GLUTTONY, AbilityId.THICK_FAT, 489, 115, 90, 70, 59, 90, 65, 100, 50, 171, false, null, true), - ), - new PokemonSpecies(SpeciesId.TAROUNTULA, 9, false, false, false, "String Ball Pokémon", PokemonType.BUG, null, 0.3, 4, AbilityId.INSOMNIA, AbilityId.NONE, AbilityId.STAKEOUT, 210, 35, 41, 45, 29, 40, 20, 255, 50, 42, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.SPIDOPS, 9, false, false, false, "Trap Pokémon", PokemonType.BUG, null, 1, 16.5, AbilityId.INSOMNIA, AbilityId.NONE, AbilityId.STAKEOUT, 404, 60, 79, 92, 52, 86, 35, 120, 50, 141, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.NYMBLE, 9, false, false, false, "Grasshopper Pokémon", PokemonType.BUG, null, 0.2, 1, AbilityId.SWARM, AbilityId.NONE, AbilityId.TINTED_LENS, 210, 33, 46, 40, 21, 25, 45, 190, 20, 42, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.LOKIX, 9, false, false, false, "Grasshopper Pokémon", PokemonType.BUG, PokemonType.DARK, 1, 17.5, AbilityId.SWARM, AbilityId.NONE, AbilityId.TINTED_LENS, 450, 71, 102, 78, 52, 55, 92, 30, 0, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PAWMI, 9, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, null, 0.3, 2.5, AbilityId.STATIC, AbilityId.NATURAL_CURE, AbilityId.IRON_FIST, 240, 45, 50, 20, 40, 25, 60, 190, 50, 48, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PAWMO, 9, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, PokemonType.FIGHTING, 0.4, 6.5, AbilityId.VOLT_ABSORB, AbilityId.NATURAL_CURE, AbilityId.IRON_FIST, 350, 60, 75, 40, 50, 40, 85, 80, 50, 123, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.PAWMOT, 9, false, false, false, "Hands-On Pokémon", PokemonType.ELECTRIC, PokemonType.FIGHTING, 0.9, 41, AbilityId.VOLT_ABSORB, AbilityId.NATURAL_CURE, AbilityId.IRON_FIST, 490, 70, 115, 70, 70, 60, 105, 45, 50, 245, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TANDEMAUS, 9, false, false, false, "Couple Pokémon", PokemonType.NORMAL, null, 0.3, 1.8, AbilityId.RUN_AWAY, AbilityId.PICKUP, AbilityId.OWN_TEMPO, 305, 50, 50, 45, 40, 45, 75, 150, 50, 61, GrowthRate.FAST, null, false), - new PokemonSpecies(SpeciesId.MAUSHOLD, 9, false, false, false, "Family Pokémon", PokemonType.NORMAL, null, 0.3, 2.3, AbilityId.FRIEND_GUARD, AbilityId.CHEEK_POUCH, AbilityId.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165, GrowthRate.FAST, null, false, false, - new PokemonForm("Family of Four", "four", PokemonType.NORMAL, null, 0.3, 2.8, AbilityId.FRIEND_GUARD, AbilityId.CHEEK_POUCH, AbilityId.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), - new PokemonForm("Family of Three", "three", PokemonType.NORMAL, null, 0.3, 2.3, AbilityId.FRIEND_GUARD, AbilityId.CHEEK_POUCH, AbilityId.TECHNICIAN, 470, 74, 75, 70, 65, 75, 111, 75, 50, 165), - ), - new PokemonSpecies(SpeciesId.FIDOUGH, 9, false, false, false, "Puppy Pokémon", PokemonType.FAIRY, null, 0.3, 10.9, AbilityId.OWN_TEMPO, AbilityId.NONE, AbilityId.KLUTZ, 312, 37, 55, 70, 30, 55, 65, 190, 50, 62, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.DACHSBUN, 9, false, false, false, "Dog Pokémon", PokemonType.FAIRY, null, 0.5, 14.9, AbilityId.WELL_BAKED_BODY, AbilityId.NONE, AbilityId.AROMA_VEIL, 477, 57, 80, 115, 50, 80, 95, 90, 50, 167, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SMOLIV, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 0.3, 6.5, AbilityId.EARLY_BIRD, AbilityId.NONE, AbilityId.HARVEST, 260, 41, 35, 45, 58, 51, 30, 255, 50, 52, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.DOLLIV, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 0.6, 11.9, AbilityId.EARLY_BIRD, AbilityId.NONE, AbilityId.HARVEST, 354, 52, 53, 60, 78, 78, 33, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.ARBOLIVA, 9, false, false, false, "Olive Pokémon", PokemonType.GRASS, PokemonType.NORMAL, 1.4, 48.2, AbilityId.SEED_SOWER, AbilityId.NONE, AbilityId.HARVEST, 510, 78, 69, 90, 125, 109, 39, 45, 50, 255, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SQUAWKABILLY, 9, false, false, false, "Parrot Pokémon", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, GrowthRate.ERRATIC, 50, false, false, - new PokemonForm("Green Plumage", "green-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("Blue Plumage", "blue-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.GUTS, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("Yellow Plumage", "yellow-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - new PokemonForm("White Plumage", "white-plumage", PokemonType.NORMAL, PokemonType.FLYING, 0.6, 2.4, AbilityId.INTIMIDATE, AbilityId.HUSTLE, AbilityId.SHEER_FORCE, 417, 82, 96, 51, 45, 51, 92, 190, 50, 146, false, null, true), - ), - new PokemonSpecies(SpeciesId.NACLI, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 0.4, 16, AbilityId.PURIFYING_SALT, AbilityId.STURDY, AbilityId.CLEAR_BODY, 280, 55, 55, 75, 35, 35, 25, 255, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.NACLSTACK, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 0.6, 105, AbilityId.PURIFYING_SALT, AbilityId.STURDY, AbilityId.CLEAR_BODY, 355, 60, 60, 100, 35, 65, 35, 120, 50, 124, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GARGANACL, 9, false, false, false, "Rock Salt Pokémon", PokemonType.ROCK, null, 2.3, 240, AbilityId.PURIFYING_SALT, AbilityId.STURDY, AbilityId.CLEAR_BODY, 500, 100, 100, 130, 45, 90, 35, 45, 50, 250, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CHARCADET, 9, false, false, false, "Fire Child Pokémon", PokemonType.FIRE, null, 0.6, 10.5, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.FLAME_BODY, 255, 40, 50, 40, 50, 40, 35, 90, 50, 51, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.ARMAROUGE, 9, false, false, false, "Fire Warrior Pokémon", PokemonType.FIRE, PokemonType.PSYCHIC, 1.5, 85, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.WEAK_ARMOR, 525, 85, 60, 100, 125, 80, 75, 25, 20, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.CERULEDGE, 9, false, false, false, "Fire Blades Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 62, AbilityId.FLASH_FIRE, AbilityId.NONE, AbilityId.WEAK_ARMOR, 525, 75, 125, 80, 60, 100, 85, 25, 20, 263, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.TADBULB, 9, false, false, false, "EleTadpole Pokémon", PokemonType.ELECTRIC, null, 0.3, 0.4, AbilityId.OWN_TEMPO, AbilityId.STATIC, AbilityId.DAMP, 272, 61, 31, 41, 59, 35, 45, 190, 50, 54, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BELLIBOLT, 9, false, false, false, "EleFrog Pokémon", PokemonType.ELECTRIC, null, 1.2, 113, AbilityId.ELECTROMORPHOSIS, AbilityId.STATIC, AbilityId.DAMP, 495, 109, 64, 91, 103, 83, 45, 50, 50, 173, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WATTREL, 9, false, false, false, "Storm Petrel Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 0.4, 3.6, AbilityId.WIND_POWER, AbilityId.VOLT_ABSORB, AbilityId.COMPETITIVE, 280, 40, 40, 35, 55, 40, 70, 180, 50, 56, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.KILOWATTREL, 9, false, false, false, "Frigatebird Pokémon", PokemonType.ELECTRIC, PokemonType.FLYING, 1.4, 38.6, AbilityId.WIND_POWER, AbilityId.VOLT_ABSORB, AbilityId.COMPETITIVE, 490, 70, 70, 60, 105, 60, 125, 90, 50, 172, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.MASCHIFF, 9, false, false, false, "Rascal Pokémon", PokemonType.DARK, null, 0.5, 16, AbilityId.INTIMIDATE, AbilityId.RUN_AWAY, AbilityId.STAKEOUT, 340, 60, 78, 60, 40, 51, 51, 150, 50, 68, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.MABOSSTIFF, 9, false, false, false, "Boss Pokémon", PokemonType.DARK, null, 1.1, 61, AbilityId.INTIMIDATE, AbilityId.GUARD_DOG, AbilityId.STAKEOUT, 505, 80, 120, 90, 60, 70, 85, 75, 50, 177, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.SHROODLE, 9, false, false, false, "Toxic Mouse Pokémon", PokemonType.POISON, PokemonType.NORMAL, 0.2, 0.7, AbilityId.UNBURDEN, AbilityId.PICKPOCKET, AbilityId.PRANKSTER, 290, 40, 65, 35, 40, 35, 75, 190, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GRAFAIAI, 9, false, false, false, "Toxic Monkey Pokémon", PokemonType.POISON, PokemonType.NORMAL, 0.7, 27.2, AbilityId.UNBURDEN, AbilityId.POISON_TOUCH, AbilityId.PRANKSTER, 485, 63, 95, 65, 80, 72, 110, 90, 50, 170, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.BRAMBLIN, 9, false, false, false, "Tumbleweed Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.6, 0.6, AbilityId.WIND_RIDER, AbilityId.NONE, AbilityId.INFILTRATOR, 275, 40, 65, 30, 45, 35, 60, 190, 50, 55, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BRAMBLEGHAST, 9, false, false, false, "Tumbleweed Pokémon", PokemonType.GRASS, PokemonType.GHOST, 1.2, 6, AbilityId.WIND_RIDER, AbilityId.NONE, AbilityId.INFILTRATOR, 480, 55, 115, 70, 80, 70, 90, 45, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.TOEDSCOOL, 9, false, false, false, "Woodear Pokémon", PokemonType.GROUND, PokemonType.GRASS, 0.9, 33, AbilityId.MYCELIUM_MIGHT, AbilityId.NONE, AbilityId.NONE, 335, 40, 40, 35, 50, 100, 70, 190, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.TOEDSCRUEL, 9, false, false, false, "Woodear Pokémon", PokemonType.GROUND, PokemonType.GRASS, 1.9, 58, AbilityId.MYCELIUM_MIGHT, AbilityId.NONE, AbilityId.NONE, 515, 80, 70, 65, 80, 120, 100, 90, 50, 180, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.KLAWF, 9, false, false, false, "Ambush Pokémon", PokemonType.ROCK, null, 1.3, 79, AbilityId.ANGER_SHELL, AbilityId.SHELL_ARMOR, AbilityId.REGENERATOR, 450, 70, 100, 115, 35, 55, 75, 120, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CAPSAKID, 9, false, false, false, "Spicy Pepper Pokémon", PokemonType.GRASS, null, 0.3, 3, AbilityId.CHLOROPHYLL, AbilityId.INSOMNIA, AbilityId.KLUTZ, 304, 50, 62, 40, 62, 40, 50, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.SCOVILLAIN, 9, false, false, false, "Spicy Pepper Pokémon", PokemonType.GRASS, PokemonType.FIRE, 0.9, 15, AbilityId.CHLOROPHYLL, AbilityId.INSOMNIA, AbilityId.MOODY, 486, 65, 108, 65, 108, 65, 75, 75, 50, 170, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.RELLOR, 9, false, false, false, "Rolling Pokémon", PokemonType.BUG, null, 0.2, 1, AbilityId.COMPOUND_EYES, AbilityId.NONE, AbilityId.SHED_SKIN, 270, 41, 50, 60, 31, 58, 30, 190, 50, 54, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.RABSCA, 9, false, false, false, "Rolling Pokémon", PokemonType.BUG, PokemonType.PSYCHIC, 0.3, 3.5, AbilityId.SYNCHRONIZE, AbilityId.NONE, AbilityId.TELEPATHY, 470, 75, 50, 85, 115, 100, 45, 45, 50, 165, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.FLITTLE, 9, false, false, false, "Frill Pokémon", PokemonType.PSYCHIC, null, 0.2, 1.5, AbilityId.ANTICIPATION, AbilityId.FRISK, AbilityId.SPEED_BOOST, 255, 30, 35, 30, 55, 30, 75, 120, 50, 51, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.ESPATHRA, 9, false, false, false, "Ostrich Pokémon", PokemonType.PSYCHIC, null, 1.9, 90, AbilityId.OPPORTUNIST, AbilityId.FRISK, AbilityId.SPEED_BOOST, 481, 95, 60, 60, 101, 60, 105, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.TINKATINK, 9, false, false, false, "Metalsmith Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.4, 8.9, AbilityId.MOLD_BREAKER, AbilityId.OWN_TEMPO, AbilityId.PICKPOCKET, 297, 50, 45, 45, 35, 64, 58, 190, 50, 59, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.TINKATUFF, 9, false, false, false, "Hammer Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.7, 59.1, AbilityId.MOLD_BREAKER, AbilityId.OWN_TEMPO, AbilityId.PICKPOCKET, 380, 65, 55, 55, 45, 82, 78, 90, 50, 133, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.TINKATON, 9, false, false, false, "Hammer Pokémon", PokemonType.FAIRY, PokemonType.STEEL, 0.7, 112.8, AbilityId.MOLD_BREAKER, AbilityId.OWN_TEMPO, AbilityId.PICKPOCKET, 506, 85, 75, 77, 70, 105, 94, 45, 50, 253, GrowthRate.MEDIUM_SLOW, 0, false), - new PokemonSpecies(SpeciesId.WIGLETT, 9, false, false, false, "Garden Eel Pokémon", PokemonType.WATER, null, 1.2, 1.8, AbilityId.GOOEY, AbilityId.RATTLED, AbilityId.SAND_VEIL, 245, 10, 55, 25, 35, 25, 95, 255, 50, 49, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.WUGTRIO, 9, false, false, false, "Garden Eel Pokémon", PokemonType.WATER, null, 1.2, 5.4, AbilityId.GOOEY, AbilityId.RATTLED, AbilityId.SAND_VEIL, 425, 35, 100, 50, 50, 70, 120, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BOMBIRDIER, 9, false, false, false, "Item Drop Pokémon", PokemonType.FLYING, PokemonType.DARK, 1.5, 42.9, AbilityId.BIG_PECKS, AbilityId.KEEN_EYE, AbilityId.ROCKY_PAYLOAD, 485, 70, 103, 85, 60, 85, 82, 25, 50, 243, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.FINIZEN, 9, false, false, false, "Dolphin Pokémon", PokemonType.WATER, null, 1.3, 60.2, AbilityId.WATER_VEIL, AbilityId.NONE, AbilityId.NONE, 315, 70, 45, 40, 45, 40, 75, 200, 50, 63, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.PALAFIN, 9, false, false, false, "Dolphin Pokémon", PokemonType.WATER, null, 1.3, 60.2, AbilityId.ZERO_TO_HERO, AbilityId.NONE, AbilityId.NONE, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, GrowthRate.SLOW, 50, false, true, - new PokemonForm("Zero Form", "zero", PokemonType.WATER, null, 1.3, 60.2, AbilityId.ZERO_TO_HERO, AbilityId.NONE, AbilityId.ZERO_TO_HERO, 457, 100, 70, 72, 53, 62, 100, 45, 50, 160, false, null, true), - new PokemonForm("Hero Form", "hero", PokemonType.WATER, null, 1.8, 97.4, AbilityId.ZERO_TO_HERO, AbilityId.NONE, AbilityId.ZERO_TO_HERO, 650, 100, 160, 97, 106, 87, 100, 45, 50, 160), - ), - new PokemonSpecies(SpeciesId.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1, 35, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, false, null, true), - new PokemonForm("Segin Starmobile", "segin-starmobile", PokemonType.STEEL, PokemonType.DARK, 1.8, 240, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Schedar Starmobile", "schedar-starmobile", PokemonType.STEEL, PokemonType.FIRE, 1.8, 240, AbilityId.SPEED_BOOST, AbilityId.NONE, AbilityId.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Navi Starmobile", "navi-starmobile", PokemonType.STEEL, PokemonType.POISON, 1.8, 240, AbilityId.TOXIC_DEBRIS, AbilityId.NONE, AbilityId.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", PokemonType.STEEL, PokemonType.FAIRY, 1.8, 240, AbilityId.MISTY_SURGE, AbilityId.NONE, AbilityId.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Caph Starmobile", "caph-starmobile", PokemonType.STEEL, PokemonType.FIGHTING, 1.8, 240, AbilityId.STAMINA, AbilityId.NONE, AbilityId.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - ), - new PokemonSpecies(SpeciesId.CYCLIZAR, 9, false, false, false, "Mount Pokémon", PokemonType.DRAGON, PokemonType.NORMAL, 1.6, 63, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", PokemonType.STEEL, null, 2.5, 310, AbilityId.EARTH_EATER, AbilityId.NONE, AbilityId.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.GLIMMET, 9, false, false, false, "Ore Pokémon", PokemonType.ROCK, PokemonType.POISON, 0.7, 8, AbilityId.TOXIC_DEBRIS, AbilityId.NONE, AbilityId.CORROSION, 350, 48, 35, 42, 105, 60, 60, 70, 50, 70, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GLIMMORA, 9, false, false, false, "Ore Pokémon", PokemonType.ROCK, PokemonType.POISON, 1.5, 45, AbilityId.TOXIC_DEBRIS, AbilityId.NONE, AbilityId.CORROSION, 525, 83, 55, 90, 130, 81, 86, 25, 50, 184, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GREAVARD, 9, false, false, false, "Ghost Dog Pokémon", PokemonType.GHOST, null, 0.6, 35, AbilityId.PICKUP, AbilityId.NONE, AbilityId.FLUFFY, 290, 50, 61, 60, 30, 55, 34, 120, 50, 58, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.HOUNDSTONE, 9, false, false, false, "Ghost Dog Pokémon", PokemonType.GHOST, null, 2, 15, AbilityId.SAND_RUSH, AbilityId.NONE, AbilityId.FLUFFY, 488, 72, 101, 100, 50, 97, 68, 60, 50, 171, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.FLAMIGO, 9, false, false, false, "Synchronize Pokémon", PokemonType.FLYING, PokemonType.FIGHTING, 1.6, 37, AbilityId.SCRAPPY, AbilityId.TANGLED_FEET, AbilityId.COSTAR, 500, 82, 115, 74, 75, 64, 90, 100, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CETODDLE, 9, false, false, false, "Terra Whale Pokémon", PokemonType.ICE, null, 1.2, 45, AbilityId.THICK_FAT, AbilityId.SNOW_CLOAK, AbilityId.SHEER_FORCE, 334, 108, 68, 45, 30, 40, 43, 150, 50, 67, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.CETITAN, 9, false, false, false, "Terra Whale Pokémon", PokemonType.ICE, null, 4.5, 700, AbilityId.THICK_FAT, AbilityId.SLUSH_RUSH, AbilityId.SHEER_FORCE, 521, 170, 113, 65, 45, 55, 73, 50, 50, 182, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.VELUZA, 9, false, false, false, "Jettison Pokémon", PokemonType.WATER, PokemonType.PSYCHIC, 2.5, 90, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.SHARPNESS, 478, 90, 102, 73, 78, 65, 70, 100, 50, 167, GrowthRate.FAST, 50, false), - new PokemonSpecies(SpeciesId.DONDOZO, 9, false, false, false, "Big Catfish Pokémon", PokemonType.WATER, null, 12, 220, AbilityId.UNAWARE, AbilityId.OBLIVIOUS, AbilityId.WATER_VEIL, 530, 150, 100, 115, 65, 65, 35, 25, 50, 265, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.TATSUGIRI, 9, false, false, false, "Mimicry Pokémon", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, AbilityId.COMMANDER, AbilityId.NONE, AbilityId.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, GrowthRate.MEDIUM_SLOW, 50, false, false, - new PokemonForm("Curly Form", "curly", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, AbilityId.COMMANDER, AbilityId.NONE, AbilityId.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - new PokemonForm("Droopy Form", "droopy", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, AbilityId.COMMANDER, AbilityId.NONE, AbilityId.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - new PokemonForm("Stretchy Form", "stretchy", PokemonType.DRAGON, PokemonType.WATER, 0.3, 8, AbilityId.COMMANDER, AbilityId.NONE, AbilityId.STORM_DRAIN, 475, 68, 50, 60, 120, 95, 82, 100, 50, 166, false, null, true), - ), - new PokemonSpecies(SpeciesId.ANNIHILAPE, 9, false, false, false, "Rage Monkey Pokémon", PokemonType.FIGHTING, PokemonType.GHOST, 1.2, 56, AbilityId.VITAL_SPIRIT, AbilityId.INNER_FOCUS, AbilityId.DEFIANT, 535, 110, 115, 80, 50, 90, 90, 45, 50, 268, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.CLODSIRE, 9, false, false, false, "Spiny Fish Pokémon", PokemonType.POISON, PokemonType.GROUND, 1.8, 223, AbilityId.POISON_POINT, AbilityId.WATER_ABSORB, AbilityId.UNAWARE, 430, 130, 75, 60, 45, 100, 20, 90, 50, 151, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.FARIGIRAF, 9, false, false, false, "Long Neck Pokémon", PokemonType.NORMAL, PokemonType.PSYCHIC, 3.2, 160, AbilityId.CUD_CHEW, AbilityId.ARMOR_TAIL, AbilityId.SAP_SIPPER, 520, 120, 90, 70, 110, 70, 60, 45, 50, 260, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.DUDUNSPARCE, 9, false, false, false, "Land Snake Pokémon", PokemonType.NORMAL, null, 3.6, 39.2, AbilityId.SERENE_GRACE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, GrowthRate.MEDIUM_FAST, 50, false, false, - new PokemonForm("Two-Segment Form", "two-segment", PokemonType.NORMAL, null, 3.6, 39.2, AbilityId.SERENE_GRACE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182, false, ""), - new PokemonForm("Three-Segment Form", "three-segment", PokemonType.NORMAL, null, 4.5, 47.4, AbilityId.SERENE_GRACE, AbilityId.RUN_AWAY, AbilityId.RATTLED, 520, 125, 100, 80, 85, 75, 55, 45, 50, 182), - ), - new PokemonSpecies(SpeciesId.KINGAMBIT, 9, false, false, false, "Big Blade Pokémon", PokemonType.DARK, PokemonType.STEEL, 2, 120, AbilityId.DEFIANT, AbilityId.SUPREME_OVERLORD, AbilityId.PRESSURE, 550, 100, 135, 120, 60, 85, 50, 25, 50, 275, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GREAT_TUSK, 9, false, false, false, "Paradox Pokémon", PokemonType.GROUND, PokemonType.FIGHTING, 2.2, 320, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 115, 131, 131, 53, 53, 87, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SCREAM_TAIL, 9, false, false, false, "Paradox Pokémon", PokemonType.FAIRY, PokemonType.PSYCHIC, 1.2, 8, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 115, 65, 99, 65, 115, 111, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.BRUTE_BONNET, 9, false, false, false, "Paradox Pokémon", PokemonType.GRASS, PokemonType.DARK, 1.2, 21, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 111, 127, 99, 79, 99, 55, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.FLUTTER_MANE, 9, false, false, false, "Paradox Pokémon", PokemonType.GHOST, PokemonType.FAIRY, 1.4, 4, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 55, 55, 55, 135, 135, 135, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SLITHER_WING, 9, false, false, false, "Paradox Pokémon", PokemonType.BUG, PokemonType.FIGHTING, 3.2, 92, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 85, 135, 79, 85, 105, 81, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.SANDY_SHOCKS, 9, false, false, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.GROUND, 2.3, 60, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 570, 85, 81, 97, 121, 85, 101, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_TREADS, 9, false, false, false, "Paradox Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.9, 240, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 90, 112, 120, 72, 70, 106, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_BUNDLE, 9, false, false, false, "Paradox Pokémon", PokemonType.ICE, PokemonType.WATER, 0.6, 11, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 56, 80, 114, 124, 60, 136, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_HANDS, 9, false, false, false, "Paradox Pokémon", PokemonType.FIGHTING, PokemonType.ELECTRIC, 1.8, 380.7, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 154, 140, 108, 50, 68, 50, 50, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_JUGULIS, 9, false, false, false, "Paradox Pokémon", PokemonType.DARK, PokemonType.FLYING, 1.3, 111, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 94, 80, 86, 122, 80, 108, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_MOTH, 9, false, false, false, "Paradox Pokémon", PokemonType.FIRE, PokemonType.POISON, 1.2, 36, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 80, 70, 60, 140, 110, 110, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_THORNS, 9, false, false, false, "Paradox Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1.6, 303, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 570, 100, 134, 110, 70, 84, 72, 30, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.FRIGIBAX, 9, false, false, false, "Ice Fin Pokémon", PokemonType.DRAGON, PokemonType.ICE, 0.5, 17, AbilityId.THERMAL_EXCHANGE, AbilityId.NONE, AbilityId.ICE_BODY, 320, 65, 75, 45, 35, 45, 55, 45, 50, 64, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.ARCTIBAX, 9, false, false, false, "Ice Fin Pokémon", PokemonType.DRAGON, PokemonType.ICE, 0.8, 30, AbilityId.THERMAL_EXCHANGE, AbilityId.NONE, AbilityId.ICE_BODY, 423, 90, 95, 66, 45, 65, 62, 25, 50, 148, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.BAXCALIBUR, 9, false, false, false, "Ice Dragon Pokémon", PokemonType.DRAGON, PokemonType.ICE, 2.1, 210, AbilityId.THERMAL_EXCHANGE, AbilityId.NONE, AbilityId.ICE_BODY, 600, 115, 145, 92, 75, 86, 87, 10, 50, 300, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.GIMMIGHOUL, 9, false, false, false, "Coin Chest Pokémon", PokemonType.GHOST, null, 0.3, 5, AbilityId.RATTLED, AbilityId.NONE, AbilityId.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, GrowthRate.SLOW, null, false, false, - new PokemonForm("Chest Form", "chest", PokemonType.GHOST, null, 0.3, 5, AbilityId.RATTLED, AbilityId.NONE, AbilityId.NONE, 300, 45, 30, 70, 75, 70, 10, 45, 50, 60, false, "", true), - new PokemonForm("Roaming Form", "roaming", PokemonType.GHOST, null, 0.1, 1, AbilityId.RUN_AWAY, AbilityId.NONE, AbilityId.NONE, 300, 45, 30, 25, 75, 45, 80, 45, 50, 60, false, null, true), - ), - new PokemonSpecies(SpeciesId.GHOLDENGO, 9, false, false, false, "Coin Entity Pokémon", PokemonType.STEEL, PokemonType.GHOST, 1.2, 30, AbilityId.GOOD_AS_GOLD, AbilityId.NONE, AbilityId.NONE, 550, 87, 60, 95, 133, 91, 84, 45, 50, 275, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.WO_CHIEN, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.GRASS, 1.5, 74.2, AbilityId.TABLETS_OF_RUIN, AbilityId.NONE, AbilityId.NONE, 570, 85, 85, 100, 95, 135, 70, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.CHIEN_PAO, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.ICE, 1.9, 152.2, AbilityId.SWORD_OF_RUIN, AbilityId.NONE, AbilityId.NONE, 570, 80, 120, 80, 90, 65, 135, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.TING_LU, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.GROUND, 2.7, 699.7, AbilityId.VESSEL_OF_RUIN, AbilityId.NONE, AbilityId.NONE, 570, 155, 110, 125, 55, 80, 45, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.CHI_YU, 9, true, false, false, "Ruinous Pokémon", PokemonType.DARK, PokemonType.FIRE, 0.4, 4.9, AbilityId.BEADS_OF_RUIN, AbilityId.NONE, AbilityId.NONE, 570, 55, 80, 80, 135, 120, 100, 6, 0, 285, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ROARING_MOON, 9, false, false, false, "Paradox Pokémon", PokemonType.DRAGON, PokemonType.DARK, 2, 380, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 590, 105, 139, 71, 55, 101, 119, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_VALIANT, 9, false, false, false, "Paradox Pokémon", PokemonType.FAIRY, PokemonType.FIGHTING, 1.4, 35, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 590, 74, 130, 90, 120, 60, 116, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.KORAIDON, 9, false, true, false, "Paradox Pokémon", PokemonType.FIGHTING, PokemonType.DRAGON, 2.5, 303, AbilityId.ORICHALCUM_PULSE, AbilityId.NONE, AbilityId.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Apex Build", "apex-build", PokemonType.FIGHTING, PokemonType.DRAGON, 2.5, 303, AbilityId.ORICHALCUM_PULSE, AbilityId.NONE, AbilityId.NONE, 670, 100, 135, 115, 85, 100, 135, 3, 0, 335, false, null, true), - ), - new PokemonSpecies(SpeciesId.MIRAIDON, 9, false, true, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 3.5, 240, AbilityId.HADRON_ENGINE, AbilityId.NONE, AbilityId.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, GrowthRate.SLOW, null, false, false, - new PokemonForm("Ultimate Mode", "ultimate-mode", PokemonType.ELECTRIC, PokemonType.DRAGON, 3.5, 240, AbilityId.HADRON_ENGINE, AbilityId.NONE, AbilityId.NONE, 670, 100, 85, 100, 135, 115, 135, 3, 0, 335, false, null, true), - ), - new PokemonSpecies(SpeciesId.WALKING_WAKE, 9, false, false, false, "Paradox Pokémon", PokemonType.WATER, PokemonType.DRAGON, 3.5, 280, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 590, 99, 83, 91, 125, 83, 109, 10, 0, 295, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Gouging Fire and Raging Bolt - new PokemonSpecies(SpeciesId.IRON_LEAVES, 9, false, false, false, "Paradox Pokémon", PokemonType.GRASS, PokemonType.PSYCHIC, 1.5, 125, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 590, 90, 130, 88, 70, 108, 104, 10, 0, 295, GrowthRate.SLOW, null, false), //Custom Catchrate, matching Iron Boulder and Iron Crown - new PokemonSpecies(SpeciesId.DIPPLIN, 9, false, false, false, "Candy Apple Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 0.4, 4.4, AbilityId.SUPERSWEET_SYRUP, AbilityId.GLUTTONY, AbilityId.STICKY_HOLD, 485, 80, 80, 110, 95, 80, 40, 45, 50, 170, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.POLTCHAGEIST, 9, false, false, false, "Matcha Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, GrowthRate.SLOW, null, false, false, - new PokemonForm("Counterfeit Form", "counterfeit", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, null, true), - new PokemonForm("Artisan Form", "artisan", PokemonType.GRASS, PokemonType.GHOST, 0.1, 1.1, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 308, 40, 45, 45, 74, 54, 50, 120, 50, 62, false, "counterfeit", true), - ), - new PokemonSpecies(SpeciesId.SINISTCHA, 9, false, false, false, "Matcha Pokémon", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, GrowthRate.SLOW, null, false, false, - new PokemonForm("Unremarkable Form", "unremarkable", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, false, null, true), - new PokemonForm("Masterpiece Form", "masterpiece", PokemonType.GRASS, PokemonType.GHOST, 0.2, 2.2, AbilityId.HOSPITALITY, AbilityId.NONE, AbilityId.HEATPROOF, 508, 71, 60, 106, 121, 80, 70, 60, 50, 178, false, "unremarkable", true), - ), - new PokemonSpecies(SpeciesId.OKIDOGI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.FIGHTING, 1.8, 92.2, AbilityId.TOXIC_CHAIN, AbilityId.NONE, AbilityId.GUARD_DOG, 555, 88, 128, 115, 58, 86, 80, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(SpeciesId.MUNKIDORI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1, 12.2, AbilityId.TOXIC_CHAIN, AbilityId.NONE, AbilityId.FRISK, 555, 88, 75, 66, 130, 90, 106, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(SpeciesId.FEZANDIPITI, 9, true, false, false, "Retainer Pokémon", PokemonType.POISON, PokemonType.FAIRY, 1.4, 30.1, AbilityId.TOXIC_CHAIN, AbilityId.NONE, AbilityId.TECHNICIAN, 555, 88, 91, 82, 70, 125, 99, 3, 0, 276, GrowthRate.SLOW, 100, false), - new PokemonSpecies(SpeciesId.OGERPON, 9, true, false, false, "Mask Pokémon", PokemonType.GRASS, null, 1.2, 39.8, AbilityId.DEFIANT, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, GrowthRate.SLOW, 0, false, false, - new PokemonForm("Teal Mask", "teal-mask", PokemonType.GRASS, null, 1.2, 39.8, AbilityId.DEFIANT, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275, false, null, true), - new PokemonForm("Wellspring Mask", "wellspring-mask", PokemonType.GRASS, PokemonType.WATER, 1.2, 39.8, AbilityId.WATER_ABSORB, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Hearthflame Mask", "hearthflame-mask", PokemonType.GRASS, PokemonType.FIRE, 1.2, 39.8, AbilityId.MOLD_BREAKER, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Cornerstone Mask", "cornerstone-mask", PokemonType.GRASS, PokemonType.ROCK, 1.2, 39.8, AbilityId.STURDY, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Teal Mask Terastallized", "teal-mask-tera", PokemonType.GRASS, null, 1.2, 39.8, AbilityId.EMBODY_ASPECT_TEAL, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Wellspring Mask Terastallized", "wellspring-mask-tera", PokemonType.GRASS, PokemonType.WATER, 1.2, 39.8, AbilityId.EMBODY_ASPECT_WELLSPRING, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Hearthflame Mask Terastallized", "hearthflame-mask-tera", PokemonType.GRASS, PokemonType.FIRE, 1.2, 39.8, AbilityId.EMBODY_ASPECT_HEARTHFLAME, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - new PokemonForm("Cornerstone Mask Terastallized", "cornerstone-mask-tera", PokemonType.GRASS, PokemonType.ROCK, 1.2, 39.8, AbilityId.EMBODY_ASPECT_CORNERSTONE, AbilityId.NONE, AbilityId.NONE, 550, 80, 120, 84, 60, 96, 110, 5, 50, 275), - ), - new PokemonSpecies(SpeciesId.ARCHALUDON, 9, false, false, false, "Alloy Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 2, 60, AbilityId.STAMINA, AbilityId.STURDY, AbilityId.STALWART, 600, 90, 105, 130, 125, 65, 85, 10, 50, 300, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HYDRAPPLE, 9, false, false, false, "Apple Hydra Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 1.8, 93, AbilityId.SUPERSWEET_SYRUP, AbilityId.REGENERATOR, AbilityId.STICKY_HOLD, 540, 106, 80, 110, 120, 80, 44, 10, 50, 270, GrowthRate.ERRATIC, 50, false), - new PokemonSpecies(SpeciesId.GOUGING_FIRE, 9, false, false, false, "Paradox Pokémon", PokemonType.FIRE, PokemonType.DRAGON, 3.5, 590, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 590, 105, 115, 121, 65, 93, 91, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.RAGING_BOLT, 9, false, false, false, "Paradox Pokémon", PokemonType.ELECTRIC, PokemonType.DRAGON, 5.2, 480, AbilityId.PROTOSYNTHESIS, AbilityId.NONE, AbilityId.NONE, 590, 125, 73, 91, 137, 89, 75, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_BOULDER, 9, false, false, false, "Paradox Pokémon", PokemonType.ROCK, PokemonType.PSYCHIC, 1.5, 162.5, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 590, 90, 120, 80, 68, 108, 124, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.IRON_CROWN, 9, false, false, false, "Paradox Pokémon", PokemonType.STEEL, PokemonType.PSYCHIC, 1.6, 156, AbilityId.QUARK_DRIVE, AbilityId.NONE, AbilityId.NONE, 590, 90, 72, 100, 122, 108, 98, 10, 0, 295, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.TERAPAGOS, 9, false, true, false, "Tera Pokémon", PokemonType.NORMAL, null, 0.2, 6.5, AbilityId.TERA_SHIFT, AbilityId.NONE, AbilityId.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, GrowthRate.SLOW, 50, false, false, - new PokemonForm("Normal Form", "", PokemonType.NORMAL, null, 0.2, 6.5, AbilityId.TERA_SHIFT, AbilityId.NONE, AbilityId.NONE, 450, 90, 65, 85, 65, 85, 60, 5, 50, 90, false, null, true), - new PokemonForm("Terastal Form", "terastal", PokemonType.NORMAL, null, 0.3, 16, AbilityId.TERA_SHELL, AbilityId.NONE, AbilityId.NONE, 600, 95, 95, 110, 105, 110, 85, 5, 50, 120), - new PokemonForm("Stellar Form", "stellar", PokemonType.NORMAL, null, 1.7, 77, AbilityId.TERAFORM_ZERO, AbilityId.NONE, AbilityId.NONE, 700, 160, 105, 110, 130, 110, 85, 5, 50, 140), - ), - new PokemonSpecies(SpeciesId.PECHARUNT, 9, false, false, true, "Subjugation Pokémon", PokemonType.POISON, PokemonType.GHOST, 0.3, 0.3, AbilityId.POISON_PUPPETEER, AbilityId.NONE, AbilityId.NONE, 600, 88, 88, 160, 88, 88, 88, 3, 0, 300, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.ALOLA_RATTATA, 7, false, false, false, "Mouse Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.3, 3.8, AbilityId.GLUTTONY, AbilityId.HUSTLE, AbilityId.THICK_FAT, 253, 30, 56, 35, 25, 35, 72, 255, 70, 51, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_RATICATE, 7, false, false, false, "Mouse Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.7, 25.5, AbilityId.GLUTTONY, AbilityId.HUSTLE, AbilityId.THICK_FAT, 413, 75, 71, 70, 40, 80, 77, 127, 70, 145, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_RAICHU, 7, false, false, false, "Mouse Pokémon", PokemonType.ELECTRIC, PokemonType.PSYCHIC, 0.7, 21, AbilityId.SURGE_SURFER, AbilityId.NONE, AbilityId.NONE, 485, 60, 85, 50, 95, 85, 110, 75, 50, 243, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_SANDSHREW, 7, false, false, false, "Mouse Pokémon", PokemonType.ICE, PokemonType.STEEL, 0.7, 40, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.SLUSH_RUSH, 300, 50, 75, 90, 10, 35, 40, 255, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_SANDSLASH, 7, false, false, false, "Mouse Pokémon", PokemonType.ICE, PokemonType.STEEL, 1.2, 55, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.SLUSH_RUSH, 450, 75, 100, 120, 25, 65, 65, 90, 50, 158, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_VULPIX, 7, false, false, false, "Fox Pokémon", PokemonType.ICE, null, 0.6, 9.9, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.SNOW_WARNING, 299, 38, 41, 40, 50, 65, 65, 190, 50, 60, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(SpeciesId.ALOLA_NINETALES, 7, false, false, false, "Fox Pokémon", PokemonType.ICE, PokemonType.FAIRY, 1.1, 19.9, AbilityId.SNOW_CLOAK, AbilityId.NONE, AbilityId.SNOW_WARNING, 505, 73, 67, 75, 81, 100, 109, 75, 50, 177, GrowthRate.MEDIUM_FAST, 25, false), - new PokemonSpecies(SpeciesId.ALOLA_DIGLETT, 7, false, false, false, "Mole Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.2, 1, AbilityId.SAND_VEIL, AbilityId.TANGLING_HAIR, AbilityId.SAND_FORCE, 265, 10, 55, 30, 35, 45, 90, 255, 50, 53, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_DUGTRIO, 7, false, false, false, "Mole Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 66.6, AbilityId.SAND_VEIL, AbilityId.TANGLING_HAIR, AbilityId.SAND_FORCE, 425, 35, 100, 60, 50, 70, 110, 50, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_MEOWTH, 7, false, false, false, "Scratch Cat Pokémon", PokemonType.DARK, null, 0.4, 4.2, AbilityId.PICKUP, AbilityId.TECHNICIAN, AbilityId.RATTLED, 290, 40, 35, 35, 50, 40, 90, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_PERSIAN, 7, false, false, false, "Classy Cat Pokémon", PokemonType.DARK, null, 1.1, 33, AbilityId.FUR_COAT, AbilityId.TECHNICIAN, AbilityId.RATTLED, 440, 65, 60, 60, 75, 65, 115, 90, 50, 154, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_GEODUDE, 7, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 0.4, 20.3, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.GALVANIZE, 300, 40, 80, 100, 30, 30, 20, 255, 70, 60, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_GRAVELER, 7, false, false, false, "Rock Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1, 110, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.GALVANIZE, 390, 55, 95, 115, 45, 45, 35, 120, 70, 137, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_GOLEM, 7, false, false, false, "Megaton Pokémon", PokemonType.ROCK, PokemonType.ELECTRIC, 1.7, 316, AbilityId.MAGNET_PULL, AbilityId.STURDY, AbilityId.GALVANIZE, 495, 80, 120, 130, 55, 65, 45, 45, 70, 223, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_GRIMER, 7, false, false, false, "Sludge Pokémon", PokemonType.POISON, PokemonType.DARK, 0.7, 42, AbilityId.POISON_TOUCH, AbilityId.GLUTTONY, AbilityId.POWER_OF_ALCHEMY, 325, 80, 80, 50, 40, 50, 25, 190, 70, 65, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_MUK, 7, false, false, false, "Sludge Pokémon", PokemonType.POISON, PokemonType.DARK, 1, 52, AbilityId.POISON_TOUCH, AbilityId.GLUTTONY, AbilityId.POWER_OF_ALCHEMY, 500, 105, 105, 75, 65, 100, 50, 75, 70, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_EXEGGUTOR, 7, false, false, false, "Coconut Pokémon", PokemonType.GRASS, PokemonType.DRAGON, 10.9, 415.6, AbilityId.FRISK, AbilityId.NONE, AbilityId.HARVEST, 530, 95, 105, 85, 125, 75, 45, 45, 50, 186, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.ALOLA_MAROWAK, 7, false, false, false, "Bone Keeper Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1, 34, AbilityId.CURSED_BODY, AbilityId.LIGHTNING_ROD, AbilityId.ROCK_HEAD, 425, 60, 80, 110, 50, 80, 45, 75, 50, 149, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.ETERNAL_FLOETTE, 6, true, false, false, "Single Bloom Pokémon", PokemonType.FAIRY, null, 0.2, 0.9, AbilityId.FLOWER_VEIL, AbilityId.NONE, AbilityId.SYMBIOSIS, 551, 74, 65, 67, 125, 128, 92, 120, 70, 243, GrowthRate.MEDIUM_FAST, 0, false), //Marked as Sub-Legend, for casing purposes - new PokemonSpecies(SpeciesId.GALAR_MEOWTH, 8, false, false, false, "Scratch Cat Pokémon", PokemonType.STEEL, null, 0.4, 7.5, AbilityId.PICKUP, AbilityId.TOUGH_CLAWS, AbilityId.UNNERVE, 290, 50, 65, 55, 40, 40, 40, 255, 50, 58, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_PONYTA, 8, false, false, false, "Fire Horse Pokémon", PokemonType.PSYCHIC, null, 0.8, 24, AbilityId.RUN_AWAY, AbilityId.PASTEL_VEIL, AbilityId.ANTICIPATION, 410, 50, 85, 55, 65, 65, 90, 190, 50, 82, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_RAPIDASH, 8, false, false, false, "Fire Horse Pokémon", PokemonType.PSYCHIC, PokemonType.FAIRY, 1.7, 80, AbilityId.RUN_AWAY, AbilityId.PASTEL_VEIL, AbilityId.ANTICIPATION, 500, 65, 100, 70, 80, 80, 105, 60, 50, 175, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_SLOWPOKE, 8, false, false, false, "Dopey Pokémon", PokemonType.PSYCHIC, null, 1.2, 36, AbilityId.GLUTTONY, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 315, 90, 65, 65, 40, 40, 15, 190, 50, 63, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_SLOWBRO, 8, false, false, false, "Hermit Crab Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1.6, 70.5, AbilityId.QUICK_DRAW, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 100, 95, 100, 70, 30, 75, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_FARFETCHD, 8, false, false, false, "Wild Duck Pokémon", PokemonType.FIGHTING, null, 0.8, 42, AbilityId.STEADFAST, AbilityId.NONE, AbilityId.SCRAPPY, 377, 52, 95, 55, 58, 62, 55, 45, 50, 132, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_WEEZING, 8, false, false, false, "Poison Gas Pokémon", PokemonType.POISON, PokemonType.FAIRY, 3, 16, AbilityId.LEVITATE, AbilityId.NEUTRALIZING_GAS, AbilityId.MISTY_SURGE, 490, 65, 90, 120, 85, 70, 60, 60, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_MR_MIME, 8, false, false, false, "Barrier Pokémon", PokemonType.ICE, PokemonType.PSYCHIC, 1.4, 56.8, AbilityId.VITAL_SPIRIT, AbilityId.SCREEN_CLEANER, AbilityId.ICE_BODY, 460, 50, 65, 65, 90, 90, 100, 45, 50, 161, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_ARTICUNO, 8, true, false, false, "Freeze Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.7, 50.9, AbilityId.COMPETITIVE, AbilityId.NONE, AbilityId.NONE, 580, 90, 85, 85, 125, 100, 95, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.GALAR_ZAPDOS, 8, true, false, false, "Electric Pokémon", PokemonType.FIGHTING, PokemonType.FLYING, 1.6, 58.2, AbilityId.DEFIANT, AbilityId.NONE, AbilityId.NONE, 580, 90, 125, 90, 85, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.GALAR_MOLTRES, 8, true, false, false, "Flame Pokémon", PokemonType.DARK, PokemonType.FLYING, 2, 66, AbilityId.BERSERK, AbilityId.NONE, AbilityId.NONE, 580, 90, 85, 90, 100, 125, 90, 3, 35, 290, GrowthRate.SLOW, null, false), - new PokemonSpecies(SpeciesId.GALAR_SLOWKING, 8, false, false, false, "Royal Pokémon", PokemonType.POISON, PokemonType.PSYCHIC, 1.8, 79.5, AbilityId.CURIOUS_MEDICINE, AbilityId.OWN_TEMPO, AbilityId.REGENERATOR, 490, 95, 65, 80, 110, 110, 30, 70, 50, 172, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_CORSOLA, 8, false, false, false, "Coral Pokémon", PokemonType.GHOST, null, 0.6, 0.5, AbilityId.WEAK_ARMOR, AbilityId.NONE, AbilityId.CURSED_BODY, 410, 60, 55, 100, 65, 100, 30, 60, 50, 144, GrowthRate.FAST, 25, false), - new PokemonSpecies(SpeciesId.GALAR_ZIGZAGOON, 8, false, false, false, "Tiny Raccoon Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.4, 17.5, AbilityId.PICKUP, AbilityId.GLUTTONY, AbilityId.QUICK_FEET, 240, 38, 30, 41, 30, 41, 60, 255, 50, 56, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_LINOONE, 8, false, false, false, "Rushing Pokémon", PokemonType.DARK, PokemonType.NORMAL, 0.5, 32.5, AbilityId.PICKUP, AbilityId.GLUTTONY, AbilityId.QUICK_FEET, 420, 78, 70, 61, 50, 61, 100, 90, 50, 147, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_DARUMAKA, 8, false, false, false, "Zen Charm Pokémon", PokemonType.ICE, null, 0.7, 40, AbilityId.HUSTLE, AbilityId.NONE, AbilityId.INNER_FOCUS, 315, 70, 90, 45, 15, 45, 50, 120, 50, 63, GrowthRate.MEDIUM_SLOW, 50, false), - new PokemonSpecies(SpeciesId.GALAR_DARMANITAN, 8, false, false, false, "Blazing Pokémon", PokemonType.ICE, null, 1.7, 120, AbilityId.GORILLA_TACTICS, AbilityId.NONE, AbilityId.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, GrowthRate.MEDIUM_SLOW, 50, false, true, - new PokemonForm("Standard Mode", "", PokemonType.ICE, null, 1.7, 120, AbilityId.GORILLA_TACTICS, AbilityId.NONE, AbilityId.ZEN_MODE, 480, 105, 140, 55, 30, 55, 95, 60, 50, 168, false, null, true), - new PokemonForm("Zen Mode", "zen", PokemonType.ICE, PokemonType.FIRE, 1.7, 120, AbilityId.GORILLA_TACTICS, AbilityId.NONE, AbilityId.ZEN_MODE, 540, 105, 160, 55, 30, 55, 135, 60, 50, 189), - ), - new PokemonSpecies(SpeciesId.GALAR_YAMASK, 8, false, false, false, "Spirit Pokémon", PokemonType.GROUND, PokemonType.GHOST, 0.5, 1.5, AbilityId.WANDERING_SPIRIT, AbilityId.NONE, AbilityId.NONE, 303, 38, 55, 85, 30, 65, 30, 190, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.GALAR_STUNFISK, 8, false, false, false, "Trap Pokémon", PokemonType.GROUND, PokemonType.STEEL, 0.7, 20.5, AbilityId.MIMICRY, AbilityId.NONE, AbilityId.NONE, 471, 109, 81, 99, 66, 84, 32, 75, 70, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HISUI_GROWLITHE, 8, false, false, false, "Puppy Pokémon", PokemonType.FIRE, PokemonType.ROCK, 0.8, 22.7, AbilityId.INTIMIDATE, AbilityId.FLASH_FIRE, AbilityId.ROCK_HEAD, 350, 60, 75, 45, 65, 50, 55, 190, 50, 70, GrowthRate.SLOW, 75, false), - new PokemonSpecies(SpeciesId.HISUI_ARCANINE, 8, false, false, false, "Legendary Pokémon", PokemonType.FIRE, PokemonType.ROCK, 2, 168, AbilityId.INTIMIDATE, AbilityId.FLASH_FIRE, AbilityId.ROCK_HEAD, 555, 95, 115, 80, 95, 80, 90, 85, 50, 194, GrowthRate.SLOW, 75, false), - new PokemonSpecies(SpeciesId.HISUI_VOLTORB, 8, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, PokemonType.GRASS, 0.5, 13, AbilityId.SOUNDPROOF, AbilityId.STATIC, AbilityId.AFTERMATH, 330, 40, 30, 50, 55, 55, 100, 190, 80, 66, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.HISUI_ELECTRODE, 8, false, false, false, "Ball Pokémon", PokemonType.ELECTRIC, PokemonType.GRASS, 1.2, 81, AbilityId.SOUNDPROOF, AbilityId.STATIC, AbilityId.AFTERMATH, 490, 60, 50, 70, 80, 80, 150, 60, 70, 172, GrowthRate.MEDIUM_FAST, null, false), - new PokemonSpecies(SpeciesId.HISUI_TYPHLOSION, 8, false, false, false, "Volcano Pokémon", PokemonType.FIRE, PokemonType.GHOST, 1.6, 69.8, AbilityId.BLAZE, AbilityId.NONE, AbilityId.FRISK, 534, 73, 84, 78, 119, 85, 95, 45, 70, 240, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.HISUI_QWILFISH, 8, false, false, false, "Balloon Pokémon", PokemonType.DARK, PokemonType.POISON, 0.5, 3.9, AbilityId.POISON_POINT, AbilityId.SWIFT_SWIM, AbilityId.INTIMIDATE, 440, 65, 95, 85, 55, 55, 85, 45, 50, 88, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HISUI_SNEASEL, 8, false, false, false, "Sharp Claw Pokémon", PokemonType.FIGHTING, PokemonType.POISON, 0.9, 27, AbilityId.INNER_FOCUS, AbilityId.KEEN_EYE, AbilityId.PICKPOCKET, 430, 55, 95, 55, 35, 75, 115, 60, 35, 86, GrowthRate.MEDIUM_SLOW, 50, true), - new PokemonSpecies(SpeciesId.HISUI_SAMUROTT, 8, false, false, false, "Formidable Pokémon", PokemonType.WATER, PokemonType.DARK, 1.5, 58.2, AbilityId.TORRENT, AbilityId.NONE, AbilityId.SHARPNESS, 528, 90, 108, 80, 100, 65, 85, 45, 80, 238, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.HISUI_LILLIGANT, 8, false, false, false, "Flowering Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.2, 19.2, AbilityId.CHLOROPHYLL, AbilityId.HUSTLE, AbilityId.LEAF_GUARD, 480, 70, 105, 75, 50, 75, 105, 75, 50, 168, GrowthRate.MEDIUM_FAST, 0, false), - new PokemonSpecies(SpeciesId.HISUI_ZORUA, 8, false, false, false, "Tricky Fox Pokémon", PokemonType.NORMAL, PokemonType.GHOST, 0.7, 12.5, AbilityId.ILLUSION, AbilityId.NONE, AbilityId.NONE, 330, 35, 60, 40, 85, 40, 70, 75, 50, 66, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.HISUI_ZOROARK, 8, false, false, false, "Illusion Fox Pokémon", PokemonType.NORMAL, PokemonType.GHOST, 1.6, 83, AbilityId.ILLUSION, AbilityId.NONE, AbilityId.NONE, 510, 55, 100, 60, 125, 60, 110, 45, 50, 179, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.HISUI_BRAVIARY, 8, false, false, false, "Valiant Pokémon", PokemonType.PSYCHIC, PokemonType.FLYING, 1.7, 43.4, AbilityId.KEEN_EYE, AbilityId.SHEER_FORCE, AbilityId.TINTED_LENS, 510, 110, 83, 70, 112, 70, 65, 60, 50, 179, GrowthRate.SLOW, 100, false), - new PokemonSpecies(SpeciesId.HISUI_SLIGGOO, 8, false, false, false, "Soft Tissue Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 0.7, 68.5, AbilityId.SAP_SIPPER, AbilityId.SHELL_ARMOR, AbilityId.GOOEY, 452, 58, 75, 83, 83, 113, 40, 45, 35, 158, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.HISUI_GOODRA, 8, false, false, false, "Dragon Pokémon", PokemonType.STEEL, PokemonType.DRAGON, 1.7, 334.1, AbilityId.SAP_SIPPER, AbilityId.SHELL_ARMOR, AbilityId.GOOEY, 600, 80, 100, 100, 110, 150, 60, 45, 35, 270, GrowthRate.SLOW, 50, false), - new PokemonSpecies(SpeciesId.HISUI_AVALUGG, 8, false, false, false, "Iceberg Pokémon", PokemonType.ICE, PokemonType.ROCK, 1.4, 262.4, AbilityId.STRONG_JAW, AbilityId.ICE_BODY, AbilityId.STURDY, 514, 95, 127, 184, 34, 36, 38, 55, 50, 180, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.HISUI_DECIDUEYE, 8, false, false, false, "Arrow Quill Pokémon", PokemonType.GRASS, PokemonType.FIGHTING, 1.6, 37, AbilityId.OVERGROW, AbilityId.NONE, AbilityId.SCRAPPY, 530, 88, 112, 80, 95, 95, 60, 45, 50, 239, GrowthRate.MEDIUM_SLOW, 87.5, false), - new PokemonSpecies(SpeciesId.PALDEA_TAUROS, 9, false, false, false, "Wild Bull Pokémon", PokemonType.FIGHTING, null, 1.4, 115, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, GrowthRate.SLOW, 100, false, false, - new PokemonForm("Combat Breed", "combat", PokemonType.FIGHTING, null, 1.4, 115, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, "", true), - new PokemonForm("Blaze Breed", "blaze", PokemonType.FIGHTING, PokemonType.FIRE, 1.4, 85, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), - new PokemonForm("Aqua Breed", "aqua", PokemonType.FIGHTING, PokemonType.WATER, 1.4, 110, AbilityId.INTIMIDATE, AbilityId.ANGER_POINT, AbilityId.CUD_CHEW, 490, 75, 110, 105, 30, 70, 100, 45, 50, 172, false, null, true), - ), - new PokemonSpecies(SpeciesId.PALDEA_WOOPER, 9, false, false, false, "Water Fish Pokémon", PokemonType.POISON, PokemonType.GROUND, 0.4, 11, AbilityId.POISON_POINT, AbilityId.WATER_ABSORB, AbilityId.UNAWARE, 210, 55, 45, 45, 25, 25, 15, 255, 50, 42, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(SpeciesId.BLOODMOON_URSALUNA, 9, true, false, false, "Peat Pokémon", PokemonType.GROUND, PokemonType.NORMAL, 2.7, 333, AbilityId.MINDS_EYE, AbilityId.NONE, AbilityId.NONE, 555, 113, 70, 120, 135, 65, 52, 75, 50, 278, GrowthRate.MEDIUM_FAST, 50, false), //Marked as Sub-Legend, for casing purposes - ); -} diff --git a/src/data/pokemon/pokemon-data.ts b/src/data/pokemon/pokemon-data.ts index 972d7627bcd..0eabb0d354a 100644 --- a/src/data/pokemon/pokemon-data.ts +++ b/src/data/pokemon/pokemon-data.ts @@ -3,7 +3,7 @@ import { loadBattlerTag, SerializableBattlerTag } from "#data/battler-tags"; import { allSpecies } from "#data/data-lists"; import type { Gender } from "#data/gender"; import { PokemonMove } from "#data/moves/pokemon-move"; -import { getPokemonSpeciesForm, type PokemonSpeciesForm } from "#data/pokemon-species"; +import type { PokemonSpeciesForm } from "#data/pokemon-species"; import type { TypeDamageMultiplier } from "#data/type"; import type { AbilityId } from "#enums/ability-id"; import type { BerryType } from "#enums/berry-type"; @@ -16,6 +16,7 @@ import type { IllusionData } from "#types/illusion-data"; import type { TurnMove } from "#types/turn-move"; import type { CoerceNullPropertiesToUndefined } from "#types/type-helpers"; import { isNullOrUndefined } from "#utils/common"; +import { getPokemonSpeciesForm } from "#utils/pokemon-utils"; /** * The type that {@linkcode PokemonSpeciesForm} is converted to when an object containing it serializes it. diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 7cb6f30c99e..fe78994ce93 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -60,7 +60,7 @@ import { } from "#data/pokemon-data"; import type { SpeciesFormChange } from "#data/pokemon-forms"; import type { PokemonSpeciesForm } from "#data/pokemon-species"; -import { getFusedSpeciesName, getPokemonSpeciesForm, PokemonSpecies } from "#data/pokemon-species"; +import { PokemonSpecies } from "#data/pokemon-species"; import { getRandomStatus, getStatusEffectOverlapText, Status } from "#data/status-effect"; import { getTerrainBlockMessage, TerrainType } from "#data/terrain"; import type { TypeDamageMultiplier } from "#data/type"; @@ -168,7 +168,7 @@ import { toDmgValue, } from "#utils/common"; import { getEnumValues } from "#utils/enums"; -import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; import { argbFromRgba, QuantizerCelebi, rgbaFromArgb } from "@material/material-color-utilities"; import i18next from "i18next"; import Phaser from "phaser"; diff --git a/src/init/init.ts b/src/init/init.ts index 17b991be3a0..ba9738e2be8 100644 --- a/src/init/init.ts +++ b/src/init/init.ts @@ -2,10 +2,10 @@ import { initAbilities } from "#abilities/ability"; import { initBiomes } from "#balance/biomes"; import { initEggMoves } from "#balance/egg-moves"; import { initPokemonPrevolutions, initPokemonStarters } from "#balance/pokemon-evolutions"; +import { initSpecies } from "#balance/pokemon-species"; import { initChallenges } from "#data/challenge"; import { initTrainerTypeDialogue } from "#data/dialogue"; import { initPokemonForms } from "#data/pokemon-forms"; -import { initSpecies } from "#data/pokemon-species"; import { initModifierPools } from "#modifiers/init-modifier-pools"; import { initModifierTypes } from "#modifiers/modifier-type"; import { initMoves } from "#moves/move"; diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 69c1539d944..0ddfedeff84 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -1,7 +1,6 @@ import { globalScene } from "#app/global-scene"; import type { Gender } from "#data/gender"; import { CustomPokemonData, PokemonBattleData, PokemonSummonData } from "#data/pokemon-data"; -import { getPokemonSpeciesForm } from "#data/pokemon-species"; import { Status } from "#data/status-effect"; import { BattleType } from "#enums/battle-type"; import type { BiomeId } from "#enums/biome-id"; @@ -14,7 +13,7 @@ import { TrainerSlot } from "#enums/trainer-slot"; import { EnemyPokemon, Pokemon } from "#field/pokemon"; import { PokemonMove } from "#moves/pokemon-move"; import type { Variant } from "#sprites/variant"; -import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; export class PokemonData { public id: number; diff --git a/src/system/version-migration/versions/v1_7_0.ts b/src/system/version-migration/versions/v1_7_0.ts index 9ba25bcbaac..69c640756ea 100644 --- a/src/system/version-migration/versions/v1_7_0.ts +++ b/src/system/version-migration/versions/v1_7_0.ts @@ -1,11 +1,10 @@ import { globalScene } from "#app/global-scene"; -import { getPokemonSpeciesForm } from "#data/pokemon-species"; import { DexAttr } from "#enums/dex-attr"; import type { SessionSaveData, SystemSaveData } from "#system/game-data"; import type { SessionSaveMigrator } from "#types/session-save-migrator"; import type { SystemSaveMigrator } from "#types/system-save-migrator"; import { isNullOrUndefined } from "#utils/common"; -import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; /** * If a starter is caught, but the only forms registered as caught are not starterSelectable, diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 49ce5b64d9f..227b86c4d4d 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -25,7 +25,7 @@ import { getNatureName } from "#data/nature"; import type { SpeciesFormChange } from "#data/pokemon-forms"; import { pokemonFormChanges } from "#data/pokemon-forms"; import type { PokemonSpecies } from "#data/pokemon-species"; -import { getPokemonSpeciesForm, normalForm } from "#data/pokemon-species"; +import { normalForm } from "#data/pokemon-species"; import { AbilityAttr } from "#enums/ability-attr"; import type { AbilityId } from "#enums/ability-id"; import { BiomeId } from "#enums/biome-id"; @@ -56,7 +56,7 @@ import { addBBCodeTextObject, addTextObject, getTextColor, getTextStyleOptions } import { addWindow } from "#ui/ui-theme"; import { BooleanHolder, getLocalizedSpriteKey, isNullOrUndefined, padInt, rgbHexToRgba } from "#utils/common"; import { getEnumValues } from "#utils/enums"; -import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; import { toTitleCase } from "#utils/strings"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 5d49e867b59..cd1dc312f4d 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -15,7 +15,7 @@ import { import { speciesTmMoves } from "#balance/tms"; import { allAbilities, allMoves, allSpecies } from "#data/data-lists"; import type { PokemonForm, PokemonSpecies } from "#data/pokemon-species"; -import { getPokemonSpeciesForm, getPokerusStarters, normalForm } from "#data/pokemon-species"; +import { normalForm } from "#data/pokemon-species"; import { AbilityAttr } from "#enums/ability-attr"; import { AbilityId } from "#enums/ability-id"; import { BiomeId } from "#enums/biome-id"; @@ -46,6 +46,7 @@ import { addWindow } from "#ui/ui-theme"; import { BooleanHolder, fixedInt, getLocalizedSpriteKey, padInt, randIntRange, rgbHexToRgba } from "#utils/common"; import type { StarterPreferences } from "#utils/data"; import { loadStarterPreferences } from "#utils/data"; +import { getPokemonSpeciesForm, getPokerusStarters } from "#utils/pokemon-utils"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; diff --git a/src/ui/pokemon-hatch-info-container.ts b/src/ui/pokemon-hatch-info-container.ts index 9c223adf837..bb1cc22e9fd 100644 --- a/src/ui/pokemon-hatch-info-container.ts +++ b/src/ui/pokemon-hatch-info-container.ts @@ -5,7 +5,6 @@ import { allMoves } from "#data/data-lists"; import { getEggTierForSpecies } from "#data/egg"; import type { EggHatchData } from "#data/egg-hatch-data"; import { Gender } from "#data/gender"; -import { getPokemonSpeciesForm } from "#data/pokemon-species"; import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; import { TextStyle } from "#enums/text-style"; @@ -13,6 +12,7 @@ import type { PlayerPokemon } from "#field/pokemon"; import { PokemonInfoContainer } from "#ui/pokemon-info-container"; import { addTextObject } from "#ui/text"; import { padInt, rgbHexToRgba } from "#utils/common"; +import { getPokemonSpeciesForm } from "#utils/pokemon-utils"; import { argbFromRgba } from "@material/material-color-utilities"; /** diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 6929d6f818d..dac6bc677a2 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -24,7 +24,6 @@ import { Gender, getGenderColor, getGenderSymbol } from "#data/gender"; import { getNatureName } from "#data/nature"; import { pokemonFormChanges } from "#data/pokemon-forms"; import type { PokemonSpecies } from "#data/pokemon-species"; -import { getPokemonSpeciesForm, getPokerusStarters } from "#data/pokemon-species"; import { AbilityAttr } from "#enums/ability-attr"; import { AbilityId } from "#enums/ability-id"; import { Button } from "#enums/buttons"; @@ -72,6 +71,7 @@ import { } from "#utils/common"; import type { StarterPreferences } from "#utils/data"; import { loadStarterPreferences, saveStarterPreferences } from "#utils/data"; +import { getPokemonSpeciesForm, getPokerusStarters } from "#utils/pokemon-utils"; import { toTitleCase } from "#utils/strings"; import { argbFromRgba } from "@material/material-color-utilities"; import i18next from "i18next"; diff --git a/src/utils/pokemon-utils.ts b/src/utils/pokemon-utils.ts index da39cfe11ad..8de0a3bfcf1 100644 --- a/src/utils/pokemon-utils.ts +++ b/src/utils/pokemon-utils.ts @@ -1,6 +1,9 @@ +import { globalScene } from "#app/global-scene"; +import { POKERUS_STARTER_COUNT, speciesStarterCosts } from "#balance/starters"; import { allSpecies } from "#data/data-lists"; -import type { PokemonSpecies } from "#data/pokemon-species"; +import type { PokemonSpecies, PokemonSpeciesForm } from "#data/pokemon-species"; import type { SpeciesId } from "#enums/species-id"; +import { randSeedItem } from "./common"; /** * Gets the {@linkcode PokemonSpecies} object associated with the {@linkcode SpeciesId} enum given @@ -19,3 +22,104 @@ export function getPokemonSpecies(species: SpeciesId | SpeciesId[]): PokemonSpec } return allSpecies[species - 1]; } + +/** + * Method to get the daily list of starters with Pokerus. + * @returns A list of starters with Pokerus + */ +export function getPokerusStarters(): PokemonSpecies[] { + const pokerusStarters: PokemonSpecies[] = []; + const date = new Date(); + date.setUTCHours(0, 0, 0, 0); + globalScene.executeWithSeedOffset( + () => { + while (pokerusStarters.length < POKERUS_STARTER_COUNT) { + const randomSpeciesId = Number.parseInt(randSeedItem(Object.keys(speciesStarterCosts)), 10); + const species = getPokemonSpecies(randomSpeciesId); + if (!pokerusStarters.includes(species)) { + pokerusStarters.push(species); + } + } + }, + 0, + date.getTime().toString(), + ); + return pokerusStarters; +} + +export function getFusedSpeciesName(speciesAName: string, speciesBName: string): string { + const fragAPattern = /([a-z]{2}.*?[aeiou(?:y$)\-']+)(.*?)$/i; + const fragBPattern = /([a-z]{2}.*?[aeiou(?:y$)\-'])(.*?)$/i; + + const [speciesAPrefixMatch, speciesBPrefixMatch] = [speciesAName, speciesBName].map(n => /^(?:[^ ]+) /.exec(n)); + const [speciesAPrefix, speciesBPrefix] = [speciesAPrefixMatch, speciesBPrefixMatch].map(m => (m ? m[0] : "")); + + if (speciesAPrefix) { + speciesAName = speciesAName.slice(speciesAPrefix.length); + } + if (speciesBPrefix) { + speciesBName = speciesBName.slice(speciesBPrefix.length); + } + + const [speciesASuffixMatch, speciesBSuffixMatch] = [speciesAName, speciesBName].map(n => / (?:[^ ]+)$/.exec(n)); + const [speciesASuffix, speciesBSuffix] = [speciesASuffixMatch, speciesBSuffixMatch].map(m => (m ? m[0] : "")); + + if (speciesASuffix) { + speciesAName = speciesAName.slice(0, -speciesASuffix.length); + } + if (speciesBSuffix) { + speciesBName = speciesBName.slice(0, -speciesBSuffix.length); + } + + const splitNameA = speciesAName.split(/ /g); + const splitNameB = speciesBName.split(/ /g); + + const fragAMatch = fragAPattern.exec(speciesAName); + const fragBMatch = fragBPattern.exec(speciesBName); + + let fragA: string; + let fragB: string; + + fragA = splitNameA.length === 1 ? (fragAMatch ? fragAMatch[1] : speciesAName) : splitNameA[splitNameA.length - 1]; + + if (splitNameB.length === 1) { + if (fragBMatch) { + const lastCharA = fragA.slice(fragA.length - 1); + const prevCharB = fragBMatch[1].slice(fragBMatch.length - 1); + fragB = (/[-']/.test(prevCharB) ? prevCharB : "") + fragBMatch[2] || prevCharB; + if (lastCharA === fragB[0]) { + if (/[aiu]/.test(lastCharA)) { + fragB = fragB.slice(1); + } else { + const newCharMatch = new RegExp(`[^${lastCharA}]`).exec(fragB); + if (newCharMatch?.index !== undefined && newCharMatch.index > 0) { + fragB = fragB.slice(newCharMatch.index); + } + } + } + } else { + fragB = speciesBName; + } + } else { + fragB = splitNameB[splitNameB.length - 1]; + } + + if (splitNameA.length > 1) { + fragA = `${splitNameA.slice(0, splitNameA.length - 1).join(" ")} ${fragA}`; + } + + fragB = `${fragB.slice(0, 1).toLowerCase()}${fragB.slice(1)}`; + + return `${speciesAPrefix || speciesBPrefix}${fragA}${fragB}${speciesBSuffix || speciesASuffix}`; +} + +export function getPokemonSpeciesForm(species: SpeciesId, formIndex: number): PokemonSpeciesForm { + const retSpecies: PokemonSpecies = + species >= 2000 + ? allSpecies.find(s => s.speciesId === species)! // TODO: is the bang correct? + : allSpecies[species - 1]; + if (formIndex < retSpecies.forms?.length) { + return retSpecies.forms[formIndex]; + } + return retSpecies; +} diff --git a/test/test-utils/game-manager-utils.ts b/test/test-utils/game-manager-utils.ts index 7bb8ea57469..89e352cdbdc 100644 --- a/test/test-utils/game-manager-utils.ts +++ b/test/test-utils/game-manager-utils.ts @@ -3,7 +3,6 @@ import type { BattleScene } from "#app/battle-scene"; import { getGameMode } from "#app/game-mode"; import { getDailyRunStarters } from "#data/daily-run"; import { Gender } from "#data/gender"; -import { getPokemonSpeciesForm } from "#data/pokemon-species"; import { BattleType } from "#enums/battle-type"; import { GameModes } from "#enums/game-modes"; import type { MoveId } from "#enums/move-id"; @@ -11,7 +10,7 @@ import type { SpeciesId } from "#enums/species-id"; import { PlayerPokemon } from "#field/pokemon"; import type { StarterMoveset } from "#system/game-data"; import type { Starter } from "#ui/starter-select-ui-handler"; -import { getPokemonSpecies } from "#utils/pokemon-utils"; +import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; /** Function to convert Blob to string */ export function blobToString(blob) { From 0bc78cb715df828994710fcd859d70bb518b214b Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Sat, 2 Aug 2025 23:05:54 -0400 Subject: [PATCH 069/106] [Balance] Prevent MEs on X1 Waves (#6204) * [Balance] Prevent MEs on X1 Waves * Fix Bug-Type Superfan Encounter Test * Fix Unit Tests --- src/battle-scene.ts | 1 + .../teleporting-hijinks-encounter.ts | 2 +- .../berries-abound-encounter.test.ts | 2 +- .../bug-type-superfan-encounter.test.ts | 12 +++++------ .../teleporting-hijinks-encounter.test.ts | 20 +++++++++---------- .../mystery-encounter.test.ts | 12 +++++++++-- test/phases/mystery-encounter-phase.test.ts | 2 +- 7 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index e5a63285ecc..8c8906be2b0 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -3528,6 +3528,7 @@ export class BattleScene extends SceneBase { this.gameMode.hasMysteryEncounters && battleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && + waveIndex % 10 !== 1 && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave ); diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index b547064fd66..d77326837cd 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -59,7 +59,7 @@ export const TeleportingHijinksEncounter: MysteryEncounter = MysteryEncounterBui ) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) - .withSceneRequirement(new WaveModulusRequirement([1, 2, 3], 10)) // Must be in first 3 waves after boss wave + .withSceneRequirement(new WaveModulusRequirement([2, 3, 4], 10)) // Must be in first 3 waves after boss wave .withSceneRequirement(new MoneyRequirement(0, MONEY_COST_MULTIPLIER)) // Must be able to pay teleport cost .withAutoHideIntroVisuals(false) .withCatchAllowed(true) diff --git a/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts index 3d29c04cab7..25116a89ec5 100644 --- a/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -174,7 +174,7 @@ describe("Berries Abound - Mystery Encounter", () => { }); it("should start battle if fastest pokemon is slower than boss below wave 50", async () => { - game.override.startingWave(41); + game.override.startingWave(42); const encounterTextSpy = vi.spyOn(EncounterDialogueUtils, "showEncounterText"); await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); diff --git a/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts index 205bf996815..bed9d48d063 100644 --- a/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -253,7 +253,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should start battle against the Bug-Type Superfan with wave 70 party template", async () => { - game.override.startingWave(61); + game.override.startingWave(63); await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -268,7 +268,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should start battle against the Bug-Type Superfan with wave 100 party template", async () => { - game.override.startingWave(81); + game.override.startingWave(83); await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -284,7 +284,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should start battle against the Bug-Type Superfan with wave 120 party template", async () => { - game.override.startingWave(111); + game.override.startingWave(113); await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -302,7 +302,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should start battle against the Bug-Type Superfan with wave 140 party template", async () => { - game.override.startingWave(131); + game.override.startingWave(133); await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -320,7 +320,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should start battle against the Bug-Type Superfan with wave 160 party template", async () => { - game.override.startingWave(151); + game.override.startingWave(153); await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); @@ -338,7 +338,7 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { }); it("should start battle against the Bug-Type Superfan with wave 180 party template", async () => { - game.override.startingWave(171); + game.override.startingWave(173); await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); diff --git a/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts index 43d497c57bb..ff4f73cfbde 100644 --- a/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -79,14 +79,6 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { expect(TeleportingHijinksEncounter.options.length).toBe(3); }); - it("should run in waves that are X1", async () => { - game.override.startingWave(11).mysteryEncounterTier(MysteryEncounterTier.COMMON); - - await game.runToMysteryEncounter(); - - expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.TELEPORTING_HIJINKS); - }); - it("should run in waves that are X2", async () => { game.override.startingWave(32).mysteryEncounterTier(MysteryEncounterTier.COMMON); @@ -103,8 +95,16 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.TELEPORTING_HIJINKS); }); - it("should NOT run in waves that are not X1, X2, or X3", async () => { - game.override.startingWave(54); + it("should run in waves that are X4", async () => { + game.override.startingWave(54).mysteryEncounterTier(MysteryEncounterTier.COMMON); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.TELEPORTING_HIJINKS); + }); + + it("should NOT run in waves that are not X2, X3, or X4", async () => { + game.override.startingWave(67); await game.runToMysteryEncounter(); diff --git a/test/mystery-encounter/mystery-encounter.test.ts b/test/mystery-encounter/mystery-encounter.test.ts index 71bc9aec008..ec27f7c6a48 100644 --- a/test/mystery-encounter/mystery-encounter.test.ts +++ b/test/mystery-encounter/mystery-encounter.test.ts @@ -24,7 +24,7 @@ describe("Mystery Encounters", () => { beforeEach(() => { game = new GameManager(phaserGame); scene = game.scene; - game.override.startingWave(11).mysteryEncounterChance(100); + game.override.startingWave(12).mysteryEncounterChance(100); }); it("Spawns a mystery encounter", async () => { @@ -37,12 +37,20 @@ describe("Mystery Encounters", () => { expect(game.scene.phaseManager.getCurrentPhase()!.constructor.name).toBe(MysteryEncounterPhase.name); }); + it("Encounters should not run on X1 waves", async () => { + game.override.startingWave(11); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + it("Encounters should not run below wave 10", async () => { game.override.startingWave(9); await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); }); it("Encounters should not run above wave 180", async () => { diff --git a/test/phases/mystery-encounter-phase.test.ts b/test/phases/mystery-encounter-phase.test.ts index ad71a4151ac..2b6105c7034 100644 --- a/test/phases/mystery-encounter-phase.test.ts +++ b/test/phases/mystery-encounter-phase.test.ts @@ -27,7 +27,7 @@ describe("Mystery Encounter Phases", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.startingWave(11).mysteryEncounterChance(100).seed("test"); // Seed guarantees wild encounter to be replaced by ME + game.override.startingWave(12).mysteryEncounterChance(100).seed("test"); // Seed guarantees wild encounter to be replaced by ME }); describe("MysteryEncounterPhase", () => { From 8a2b8889717d68642b2c8c5357551624cac662ae Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Sun, 3 Aug 2025 15:53:10 -0500 Subject: [PATCH 070/106] [Balance] Update and Change Breeder Trainer Class Teams (#6200) * Update Breeder Trainer Class * Update trainer-config.ts * Update trainer-config.ts * Update whirlwind.test.ts * Update src/data/trainers/trainer-config.ts Co-authored-by: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> * Adjust Party Templates and move Wynaut * Update trainer-party-template.ts --------- Co-authored-by: damocleas Co-authored-by: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> --- src/data/trainers/trainer-config.ts | 54 +++++++++++++++++++-- src/data/trainers/trainer-party-template.ts | 1 + test/moves/whirlwind.test.ts | 2 +- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 6b3fcf70f80..5739492f96e 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -1244,12 +1244,58 @@ export const trainerConfigs: TrainerConfigs = { .setHasDouble("Breeders") .setPartyTemplateFunc(() => getWavePartyTemplate( - trainerPartyTemplates.FOUR_WEAKER, - trainerPartyTemplates.FIVE_WEAKER, - trainerPartyTemplates.SIX_WEAKER, + trainerPartyTemplates.FOUR_WEAK, + trainerPartyTemplates.FIVE_WEAK, + trainerPartyTemplates.SIX_WEAK, ), ) - .setSpeciesFilter(s => s.baseTotal < 450), + .setSpeciesPools({ + [TrainerPoolTier.COMMON]: [ + SpeciesId.PICHU, + SpeciesId.CLEFFA, + SpeciesId.IGGLYBUFF, + SpeciesId.TOGEPI, + SpeciesId.TYROGUE, + SpeciesId.SMOOCHUM, + SpeciesId.AZURILL, + SpeciesId.BUDEW, + SpeciesId.CHINGLING, + SpeciesId.BONSLY, + SpeciesId.MIME_JR, + SpeciesId.HAPPINY, + SpeciesId.MANTYKE, + SpeciesId.TOXEL, + ], + [TrainerPoolTier.UNCOMMON]: [ + SpeciesId.DITTO, + SpeciesId.ELEKID, + SpeciesId.MAGBY, + SpeciesId.WYNAUT, + SpeciesId.MUNCHLAX, + SpeciesId.RIOLU, + SpeciesId.AUDINO, + ], + [TrainerPoolTier.RARE]: [ + SpeciesId.ALOLA_RATTATA, + SpeciesId.ALOLA_SANDSHREW, + SpeciesId.ALOLA_VULPIX, + SpeciesId.ALOLA_DIGLETT, + SpeciesId.ALOLA_MEOWTH, + SpeciesId.GALAR_PONYTA, + ], + [TrainerPoolTier.SUPER_RARE]: [ + SpeciesId.ALOLA_GEODUDE, + SpeciesId.ALOLA_GRIMER, + SpeciesId.GALAR_MEOWTH, + SpeciesId.GALAR_SLOWPOKE, + SpeciesId.GALAR_FARFETCHD, + SpeciesId.HISUI_GROWLITHE, + SpeciesId.HISUI_VOLTORB, + SpeciesId.HISUI_QWILFISH, + SpeciesId.HISUI_SNEASEL, + SpeciesId.HISUI_ZORUA, + ], + }), [TrainerType.CLERK]: new TrainerConfig(++t) .setHasGenders("Clerk Female") .setHasDouble("Colleagues") diff --git a/src/data/trainers/trainer-party-template.ts b/src/data/trainers/trainer-party-template.ts index d4e7fe7a261..0ad3d36dcfa 100644 --- a/src/data/trainers/trainer-party-template.ts +++ b/src/data/trainers/trainer-party-template.ts @@ -144,6 +144,7 @@ export const trainerPartyTemplates = { FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true), SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER), SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true), + SIX_WEAK: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK), SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true), SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true), diff --git a/test/moves/whirlwind.test.ts b/test/moves/whirlwind.test.ts index 90bbf722224..2aadb76b019 100644 --- a/test/moves/whirlwind.test.ts +++ b/test/moves/whirlwind.test.ts @@ -206,7 +206,7 @@ describe("Moves - Whirlwind", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.TOTODILE]); // expect the enemy to have at least 4 pokemon, necessary for this check to even work - expect(game.scene.getEnemyParty().length, "enemy must have exactly 4 pokemon").toBe(4); + expect(game.scene.getEnemyParty().length, "enemy must have exactly 4 pokemon").toBeGreaterThanOrEqual(4); const user = game.scene.getPlayerPokemon()!; From 800b8c99052c0394b55eaeb9f48fda62cb5e3a0a Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Mon, 4 Aug 2025 09:10:24 -0600 Subject: [PATCH 071/106] [Bug] [Beta] Fix serialization with transform (#6207) Fix serialization with transform --- src/data/pokemon/pokemon-data.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/data/pokemon/pokemon-data.ts b/src/data/pokemon/pokemon-data.ts index 0eabb0d354a..9c264c4c1bc 100644 --- a/src/data/pokemon/pokemon-data.ts +++ b/src/data/pokemon/pokemon-data.ts @@ -162,6 +162,7 @@ export class PokemonSummonData { if (key === "speciesForm" || key === "fusionSpeciesForm") { this[key] = deserializePokemonSpeciesForm(value); + continue; } if (key === "illusion" && typeof value === "object") { @@ -182,6 +183,7 @@ export class PokemonSummonData { } } this[key] = illusionData as IllusionData; + continue; } if (key === "moveset") { From 40443d2afa985b2ce638018eea182aec274975ea Mon Sep 17 00:00:00 2001 From: Acelynn Zhang <102631387+acelynnzhang@users.noreply.github.com> Date: Mon, 4 Aug 2025 17:33:01 -0400 Subject: [PATCH 072/106] [Bug] Fix override move animations not loading for enemy Pokemon https://github.com/pagefaultgames/pokerogue/pull/6214 --- src/field/pokemon.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index fe78994ce93..0523671ee5f 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1821,8 +1821,6 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @returns An array of {@linkcode PokemonMove}, as described above. */ getMoveset(ignoreOverride = false): PokemonMove[] { - const ret = !ignoreOverride && this.summonData.moveset ? this.summonData.moveset : this.moveset; - // Overrides moveset based on arrays specified in overrides.ts let overrideArray: MoveId | Array = this.isPlayer() ? Overrides.MOVESET_OVERRIDE @@ -1838,7 +1836,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { }); } - return ret; + return !ignoreOverride && this.summonData.moveset ? this.summonData.moveset : this.moveset; } /** From 5bfcb1d3790e3a013ed353034264b145920ce4e2 Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:55:36 -0400 Subject: [PATCH 073/106] =?UTF-8?q?[Bug]=20Release=20Fainted=20Pok=C3=A9mo?= =?UTF-8?q?n=20in=20Switch=20Menu=20(#6215)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Bug] Release Fainted Pokémon in Switch Menu * Add Kev's Suggestions --- src/ui/party-ui-handler.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index b259316f6fa..0337e487200 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -827,6 +827,11 @@ export class PartyUiHandler extends MessageUiHandler { globalScene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger, false, true); } + // This is processed before the filter result since releasing does not depend on status. + if (option === PartyOption.RELEASE) { + return this.processReleaseOption(pokemon); + } + // If the pokemon is filtered out for this option, we cannot continue const filterResult = this.getFilterResult(option, pokemon); if (filterResult) { @@ -850,10 +855,6 @@ export class PartyUiHandler extends MessageUiHandler { // PartyUiMode.POST_BATTLE_SWITCH (SEND_OUT) // These are the options that need a callback - if (option === PartyOption.RELEASE) { - return this.processReleaseOption(pokemon); - } - if (this.partyUiMode === PartyUiMode.SPLICE) { if (option === PartyOption.SPLICE) { (this.selectCallback as PartyModifierSpliceSelectCallback)(this.transferCursor, this.cursor); From 8da02bad50995077243c8036aeef215ef42b42d4 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Tue, 5 Aug 2025 00:19:57 -0400 Subject: [PATCH 074/106] [Test] Replace game.scene.getXPokemon()! with game.field.getXPokemon() https://github.com/pagefaultgames/pokerogue/pull/6178 * Replaced all instances of `game.scene.getXXXPokemon()!` inside tests with `game.field.getXXXPokemon()` * Fixed tests * Fixed oblivious test * Fix Grudge test --- test/abilities/analytic.test.ts | 2 +- test/abilities/anger-point.test.ts | 6 +- test/abilities/beast-boost.test.ts | 6 +- test/abilities/competitive.test.ts | 6 +- test/abilities/contrary.test.ts | 6 +- test/abilities/cud-chew.test.ts | 24 +++--- test/abilities/dancer.test.ts | 2 +- test/abilities/defiant.test.ts | 6 +- test/abilities/desolate-land.test.ts | 2 +- test/abilities/disguise.test.ts | 20 ++--- test/abilities/dry-skin.test.ts | 14 ++-- test/abilities/early-bird.test.ts | 6 +- test/abilities/flash-fire.test.ts | 16 ++-- test/abilities/flower-gift.test.ts | 8 +- test/abilities/flower-veil.test.ts | 8 +- test/abilities/forecast.test.ts | 16 ++-- test/abilities/good-as-gold.test.ts | 2 +- test/abilities/gorilla-tactics.test.ts | 4 +- test/abilities/gulp-missile.test.ts | 40 +++++----- test/abilities/harvest.test.ts | 40 +++++----- test/abilities/healer.test.ts | 2 +- test/abilities/heatproof.test.ts | 4 +- test/abilities/honey-gather.test.ts | 2 +- test/abilities/hustle.test.ts | 10 +-- test/abilities/hyper-cutter.test.ts | 2 +- test/abilities/ice-face.test.ts | 30 +++---- test/abilities/illuminate.test.ts | 2 +- test/abilities/illusion.test.ts | 22 ++--- test/abilities/infiltrator.test.ts | 16 ++-- test/abilities/intrepid-sword.test.ts | 4 +- test/abilities/magic-bounce.test.ts | 46 +++++------ test/abilities/mimicry.test.ts | 30 +++---- test/abilities/mirror-armor.test.ts | 40 +++++----- test/abilities/moody.test.ts | 6 +- test/abilities/moxie.test.ts | 2 +- test/abilities/mummy.test.ts | 4 +- test/abilities/mycelium-might.test.ts | 26 +++--- test/abilities/neutralizing-gas.test.ts | 28 +++---- .../abilities/normal-move-type-change.test.ts | 16 ++-- test/abilities/oblivious.test.ts | 19 ++--- test/abilities/parental-bond.test.ts | 50 ++++++------ test/abilities/perish-body.test.ts | 44 +++++----- test/abilities/protosynthesis.test.ts | 4 +- test/abilities/quick-draw.test.ts | 12 +-- test/abilities/sap-sipper.test.ts | 14 ++-- test/abilities/shield-dust.test.ts | 4 +- test/abilities/shields-down.test.ts | 22 ++--- test/abilities/simple.test.ts | 2 +- test/abilities/speed-boost.test.ts | 12 +-- test/abilities/stall.test.ts | 12 +-- test/abilities/steely-spirit.test.ts | 6 +- test/abilities/super-luck.test.ts | 2 +- test/abilities/synchronize.test.ts | 18 ++--- test/abilities/tera-shell.test.ts | 10 +-- test/abilities/trace.test.ts | 4 +- test/abilities/unburden.test.ts | 32 ++++---- test/abilities/unseen-fist.test.ts | 6 +- test/abilities/volt-absorb.test.ts | 6 +- test/abilities/wandering-spirit.test.ts | 10 +-- test/abilities/wimp-out.test.ts | 64 +++++++-------- test/abilities/wind-power.test.ts | 10 +-- test/abilities/wind-rider.test.ts | 14 ++-- test/abilities/zen-mode.test.ts | 6 +- test/abilities/zero-to-hero.test.ts | 6 +- test/arena/arena-gravity.test.ts | 8 +- test/arena/psychic-terrain.test.ts | 2 +- test/arena/weather-hail.test.ts | 8 +- test/arena/weather-sandstorm.test.ts | 8 +- test/arena/weather-strong-winds.test.ts | 18 ++--- test/battle/ability-swap.test.ts | 12 +-- test/battle/battle-order.test.ts | 8 +- test/battle/battle.test.ts | 2 +- test/battle/damage-calculation.test.ts | 20 ++--- test/battle/inverse-battle.test.ts | 28 +++---- test/boss-pokemon.test.ts | 4 +- test/data/status-effect.test.ts | 8 +- test/endless-boss.test.ts | 34 ++++---- test/enemy-command.test.ts | 4 +- test/evolution.test.ts | 14 ++-- test/field/pokemon.test.ts | 8 +- test/final-boss.test.ts | 12 +-- test/internals.test.ts | 4 +- test/items/dire-hit.test.ts | 2 +- test/items/eviolite.test.ts | 6 +- test/items/exp-booster.test.ts | 2 +- test/items/leek.test.ts | 12 +-- test/items/leftovers.test.ts | 2 +- test/items/multi-lens.test.ts | 20 ++--- test/items/reviver-seed.test.ts | 12 +-- test/items/scope-lens.test.ts | 2 +- test/items/temp-stat-stage-booster.test.ts | 8 +- test/items/toxic-orb.test.ts | 2 +- test/moves/ability-ignore-moves.test.ts | 2 +- test/moves/alluring-voice.test.ts | 2 +- test/moves/assist.test.ts | 10 +-- test/moves/astonish.test.ts | 4 +- test/moves/autotomize.test.ts | 6 +- test/moves/baneful-bunker.test.ts | 12 +-- test/moves/baton-pass.test.ts | 8 +- test/moves/beak-blast.test.ts | 24 +++--- test/moves/beat-up.test.ts | 6 +- test/moves/belly-drum.test.ts | 8 +- test/moves/burning-jealousy.test.ts | 6 +- test/moves/camouflage.test.ts | 2 +- test/moves/ceaseless-edge.test.ts | 4 +- test/moves/chilly-reception.test.ts | 12 +-- test/moves/clangorous-soul.test.ts | 8 +- test/moves/copycat.test.ts | 8 +- test/moves/destiny-bond.test.ts | 80 +++++++++---------- test/moves/diamond-storm.test.ts | 2 +- test/moves/dig.test.ts | 16 ++-- test/moves/disable.test.ts | 4 +- test/moves/dive.test.ts | 18 ++--- test/moves/doodle.test.ts | 4 +- test/moves/double-team.test.ts | 4 +- test/moves/dragon-rage.test.ts | 2 +- test/moves/dragon-tail.test.ts | 14 ++-- test/moves/electrify.test.ts | 8 +- test/moves/electro-shot.test.ts | 10 +-- test/moves/encore.test.ts | 14 ++-- test/moves/endure.test.ts | 8 +- test/moves/entrainment.test.ts | 4 +- test/moves/fake-out.test.ts | 12 +-- test/moves/false-swipe.test.ts | 4 +- test/moves/fell-stinger.test.ts | 20 ++--- test/moves/fillet-away.test.ts | 8 +- test/moves/fissure.test.ts | 2 +- test/moves/flower-shield.test.ts | 12 +-- test/moves/fly.test.ts | 14 ++-- test/moves/focus-punch.test.ts | 12 +-- test/moves/foresight.test.ts | 4 +- test/moves/forests-curse.test.ts | 6 +- test/moves/freeze-dry.test.ts | 38 ++++----- test/moves/freezy-frost.test.ts | 6 +- test/moves/fusion-bolt.test.ts | 2 +- test/moves/fusion-flare.test.ts | 2 +- test/moves/geomancy.test.ts | 4 +- test/moves/gigaton-hammer.test.ts | 8 +- test/moves/glaive-rush.test.ts | 20 ++--- test/moves/growth.test.ts | 2 +- test/moves/grudge.test.ts | 3 + test/moves/guard-split.test.ts | 8 +- test/moves/guard-swap.test.ts | 4 +- test/moves/hard-press.test.ts | 6 +- test/moves/haze.test.ts | 4 +- test/moves/heal-block.test.ts | 18 ++--- test/moves/heart-swap.test.ts | 4 +- test/moves/hyper-beam.test.ts | 4 +- test/moves/imprison.test.ts | 10 +-- test/moves/instruct.test.ts | 42 +++++----- test/moves/jaw-lock.test.ts | 16 ++-- test/moves/last-resort.test.ts | 14 ++-- test/moves/light-screen.test.ts | 16 ++-- test/moves/lucky-chant.test.ts | 6 +- test/moves/magic-coat.test.ts | 36 ++++----- test/moves/make-it-rain.test.ts | 10 +-- test/moves/metronome.test.ts | 10 +-- test/moves/miracle-eye.test.ts | 2 +- test/moves/mirror-move.test.ts | 6 +- test/moves/nightmare.test.ts | 2 +- test/moves/obstruct.test.ts | 16 ++-- test/moves/octolock.test.ts | 14 ++-- test/moves/parting-shot.test.ts | 14 ++-- test/moves/plasma-fists.test.ts | 8 +- test/moves/pledge-moves.test.ts | 4 +- test/moves/pollen-puff.test.ts | 2 +- test/moves/powder.test.ts | 32 ++++---- test/moves/power-shift.test.ts | 2 +- test/moves/power-split.test.ts | 8 +- test/moves/power-swap.test.ts | 4 +- test/moves/power-trick.test.ts | 12 +-- test/moves/protect.test.ts | 14 ++-- test/moves/psycho-shift.test.ts | 11 +-- test/moves/purify.test.ts | 6 +- test/moves/quick-guard.test.ts | 4 +- test/moves/rage-fist.test.ts | 14 ++-- test/moves/reflect.test.ts | 20 ++--- test/moves/relic-song.test.ts | 6 +- test/moves/revival-blessing.test.ts | 4 +- test/moves/role-play.test.ts | 4 +- test/moves/roost.test.ts | 14 ++-- test/moves/safeguard.test.ts | 12 +-- test/moves/scale-shot.test.ts | 4 +- test/moves/secret-power.test.ts | 2 +- test/moves/shed-tail.test.ts | 6 +- test/moves/shell-trap.test.ts | 4 +- test/moves/simple-beam.test.ts | 2 +- test/moves/sketch.test.ts | 8 +- test/moves/skill-swap.test.ts | 6 +- test/moves/sleep-talk.test.ts | 8 +- test/moves/solar-beam.test.ts | 8 +- test/moves/sparkly-swirl.test.ts | 2 +- test/moves/spectral-thief.test.ts | 36 ++++----- test/moves/speed-swap.test.ts | 4 +- test/moves/spit-up.test.ts | 18 ++--- test/moves/steamroller.test.ts | 4 +- test/moves/stockpile.test.ts | 4 +- test/moves/struggle.test.ts | 4 +- test/moves/substitute.test.ts | 62 +++++++------- test/moves/swallow.test.ts | 12 +-- test/moves/synchronoise.test.ts | 4 +- test/moves/syrup-bomb.test.ts | 6 +- test/moves/tail-whip.test.ts | 2 +- test/moves/tailwind.test.ts | 4 +- test/moves/tar-shot.test.ts | 8 +- test/moves/taunt.test.ts | 2 +- test/moves/telekinesis.test.ts | 14 ++-- test/moves/tera-blast.test.ts | 26 +++--- test/moves/tera-starstorm.test.ts | 2 +- test/moves/thousand-arrows.test.ts | 6 +- test/moves/throat-chop.test.ts | 2 +- test/moves/thunder-wave.test.ts | 10 +-- test/moves/tidy-up.test.ts | 4 +- test/moves/torment.test.ts | 2 +- test/moves/toxic-spikes.test.ts | 2 +- test/moves/toxic.test.ts | 10 +-- test/moves/trick-or-treat.test.ts | 6 +- test/moves/u-turn.test.ts | 18 ++--- test/moves/upper-hand.test.ts | 12 +-- test/moves/whirlwind.test.ts | 12 +-- test/moves/will-o-wisp.test.ts | 2 +- .../fiery-fallout-encounter.test.ts | 2 +- .../fun-and-games-encounter.test.ts | 12 +-- test/phases/frenzy-move-reset.test.ts | 2 +- test/phases/learn-move-phase.test.ts | 6 +- 225 files changed, 1246 insertions(+), 1241 deletions(-) diff --git a/test/abilities/analytic.test.ts b/test/abilities/analytic.test.ts index d1b9ba4cbbb..cf5a501bbc5 100644 --- a/test/abilities/analytic.test.ts +++ b/test/abilities/analytic.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Analytic", () => { it("should increase damage if the user moves last", async () => { await game.classicMode.startBattle([SpeciesId.ARCEUS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.TACKLE); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); diff --git a/test/abilities/anger-point.test.ts b/test/abilities/anger-point.test.ts index 84a22449dae..4031ff702a9 100644 --- a/test/abilities/anger-point.test.ts +++ b/test/abilities/anger-point.test.ts @@ -36,7 +36,7 @@ describe("Ability - Anger Point", () => { it("should set the user's attack stage to +6 when hit by a critical hit", async () => { game.override.enemyAbility(AbilityId.ANGER_POINT).moveset(MoveId.FALSE_SWIPE); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); // minimize the enemy's attack stage to ensure it is always set to +6 enemy.setStatStage(Stat.ATK, -6); @@ -53,7 +53,7 @@ describe("Ability - Anger Point", () => { .enemyAbility(AbilityId.ANGER_POINT) .ability(AbilityId.SKILL_LINK); await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getCriticalHitResult").mockReturnValueOnce(true); const angerPointSpy = vi.spyOn(PostReceiveCritStatStageChangeAbAttr.prototype, "apply"); game.move.select(MoveId.BULLET_SEED); @@ -68,7 +68,7 @@ describe("Ability - Anger Point", () => { .enemyHasPassiveAbility(true) .moveset(MoveId.FALSE_SWIPE); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getCriticalHitResult").mockReturnValueOnce(true); enemy.setStatStage(Stat.ATK, 6); game.move.select(MoveId.FALSE_SWIPE); diff --git a/test/abilities/beast-boost.test.ts b/test/abilities/beast-boost.test.ts index 193de9b7669..aeb4d854b1a 100644 --- a/test/abilities/beast-boost.test.ts +++ b/test/abilities/beast-boost.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Beast Boost", () => { it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async () => { await game.classicMode.startBattle([SpeciesId.SLOWBRO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // Set the pokemon's highest stat to DEF, so it should be picked by Beast Boost vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 100, 1000, 200, 100, 100]); console.log(playerPokemon.stats); @@ -54,7 +54,7 @@ describe("Abilities - Beast Boost", () => { await game.classicMode.startBattle([SpeciesId.SLOWBRO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // If the opponent uses Guard Split, the pokemon's second highest stat (SPATK) should be chosen vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 100, 201, 200, 100, 100]); @@ -72,7 +72,7 @@ describe("Abilities - Beast Boost", () => { // Order preference follows the order of EFFECTIVE_STAT await game.classicMode.startBattle([SpeciesId.SLOWBRO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // Set up tie between SPATK, SPDEF, and SPD, where SPATK should win vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([10000, 1, 1, 100, 100, 100]); diff --git a/test/abilities/competitive.test.ts b/test/abilities/competitive.test.ts index 1a083705e5c..3c511b85b14 100644 --- a/test/abilities/competitive.test.ts +++ b/test/abilities/competitive.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Competitive", () => { it("lower atk and def by 1 via tickle, then increase spatk by 4 via competitive", async () => { await game.classicMode.startBattle([SpeciesId.FLYGON]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to(TurnInitPhase); @@ -49,7 +49,7 @@ describe("Abilities - Competitive", () => { game.override.enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.FLYGON]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.CLOSE_COMBAT); await game.phaseInterceptor.to(TurnInitPhase); @@ -62,7 +62,7 @@ describe("Abilities - Competitive", () => { game.override.startingHeldItems([{ name: "WHITE_HERB" }]); await game.classicMode.startBattle([SpeciesId.FLYGON]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to(TurnInitPhase); diff --git a/test/abilities/contrary.test.ts b/test/abilities/contrary.test.ts index df72c25054a..e7a1ae1e3d0 100644 --- a/test/abilities/contrary.test.ts +++ b/test/abilities/contrary.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Contrary", () => { it("should invert stat changes when applied", async () => { await game.classicMode.startBattle([SpeciesId.SLOWBRO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); }); @@ -43,7 +43,7 @@ describe("Abilities - Contrary", () => { game.override.enemyPassiveAbility(AbilityId.CLEAR_BODY).moveset([MoveId.TAIL_WHIP]); await game.classicMode.startBattle([SpeciesId.SLOWBRO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); @@ -57,7 +57,7 @@ describe("Abilities - Contrary", () => { game.override.enemyPassiveAbility(AbilityId.CLEAR_BODY).enemyMoveset(MoveId.HOWL).moveset([MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.SLOWBRO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); diff --git a/test/abilities/cud-chew.test.ts b/test/abilities/cud-chew.test.ts index 5f15de04cae..f68141096eb 100644 --- a/test/abilities/cud-chew.test.ts +++ b/test/abilities/cud-chew.test.ts @@ -43,7 +43,7 @@ describe("Abilities - Cud Chew", () => { it("stores inside summonData at end of turn", async () => { await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = 1; // needed to allow sitrus procs game.move.select(MoveId.SPLASH); @@ -71,7 +71,7 @@ describe("Abilities - Cud Chew", () => { game.override.enemyMoveset([MoveId.SPLASH, MoveId.HEAL_PULSE]); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); // Dip below half to eat berry farigiraf.hp = farigiraf.getMaxHp() / 2 - 1; @@ -120,7 +120,7 @@ describe("Abilities - Cud Chew", () => { .enemyMoveset(MoveId.TEATIME); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = 1; // needed to allow berry procs game.move.select(MoveId.STUFF_CHEEKS); @@ -148,7 +148,7 @@ describe("Abilities - Cud Chew", () => { it("should reset both arrays on switch", async () => { await game.classicMode.startBattle([SpeciesId.FARIGIRAF, SpeciesId.GIRAFARIG]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = 1; // eat berry turn 1, switch out turn 2 @@ -177,7 +177,7 @@ describe("Abilities - Cud Chew", () => { game.override.enemyAbility(AbilityId.NEUTRALIZING_GAS); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = 1; game.move.select(MoveId.SPLASH); @@ -199,7 +199,7 @@ describe("Abilities - Cud Chew", () => { const apply = vi.spyOn(CudChewConsumeBerryAbAttr.prototype, "apply"); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = 1; game.move.select(MoveId.SPLASH); @@ -225,7 +225,7 @@ describe("Abilities - Cud Chew", () => { game.override.enemyAbility(AbilityId.UNNERVE); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = 1; game.move.select(MoveId.SPLASH); @@ -243,7 +243,7 @@ describe("Abilities - Cud Chew", () => { game.override.enemyMoveset(MoveId.INCINERATE); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = farigiraf.getMaxHp() / 4; game.move.select(MoveId.SPLASH); @@ -262,7 +262,7 @@ describe("Abilities - Cud Chew", () => { .startingHeldItems([]); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); game.move.select(MoveId.BUG_BITE); await game.toNextTurn(); @@ -278,7 +278,7 @@ describe("Abilities - Cud Chew", () => { game.override.passiveAbility(AbilityId.RIPEN); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = 1; game.move.select(MoveId.SPLASH); @@ -294,7 +294,7 @@ describe("Abilities - Cud Chew", () => { game.override.enemyLevel(1); await game.classicMode.startBattle([SpeciesId.FARIGIRAF]); - const farigiraf = game.scene.getPlayerPokemon()!; + const farigiraf = game.field.getPlayerPokemon(); farigiraf.hp = 1; game.move.select(MoveId.HYPER_VOICE); @@ -307,7 +307,7 @@ describe("Abilities - Cud Chew", () => { // reload and the berry should still be there await game.reload.reloadSession(); - const farigirafReloaded = game.scene.getPlayerPokemon()!; + const farigirafReloaded = game.field.getPlayerPokemon(); expect(farigirafReloaded.summonData.berriesEatenLast).toEqual([BerryType.SITRUS]); const wave1Hp = farigirafReloaded.hp; diff --git a/test/abilities/dancer.test.ts b/test/abilities/dancer.test.ts index bbf1a368573..c651a341c42 100644 --- a/test/abilities/dancer.test.ts +++ b/test/abilities/dancer.test.ts @@ -125,7 +125,7 @@ describe("Abilities - Dancer", () => { game.override.battleStyle("double").moveset(MoveId.SPLASH).enemyMoveset([MoveId.SWORDS_DANCE, MoveId.FAKE_OUT]); await game.classicMode.startBattle([SpeciesId.ORICORIO]); - const oricorio = game.scene.getPlayerPokemon()!; + const oricorio = game.field.getPlayerPokemon(); expect(oricorio).toBeDefined(); // get faked out and copy swords dance diff --git a/test/abilities/defiant.test.ts b/test/abilities/defiant.test.ts index 29c386ff093..f1e62701b9d 100644 --- a/test/abilities/defiant.test.ts +++ b/test/abilities/defiant.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Defiant", () => { it("lower atk and def by 1 via tickle, then increase atk by 4 via defiant", async () => { await game.classicMode.startBattle([SpeciesId.FLYGON]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to(TurnInitPhase); @@ -48,7 +48,7 @@ describe("Abilities - Defiant", () => { game.override.enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.FLYGON]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.CLOSE_COMBAT); await game.phaseInterceptor.to(TurnInitPhase); @@ -61,7 +61,7 @@ describe("Abilities - Defiant", () => { game.override.startingHeldItems([{ name: "WHITE_HERB" }]); await game.classicMode.startBattle([SpeciesId.FLYGON]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to(TurnInitPhase); diff --git a/test/abilities/desolate-land.test.ts b/test/abilities/desolate-land.test.ts index c88f7415bb1..15dd1897864 100644 --- a/test/abilities/desolate-land.test.ts +++ b/test/abilities/desolate-land.test.ts @@ -145,7 +145,7 @@ describe("Abilities - Desolate Land", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); - vi.spyOn(game.scene.getPlayerPokemon()!, "randBattleSeedInt").mockReturnValue(0); + vi.spyOn(game.field.getPlayerPokemon(), "randBattleSeedInt").mockReturnValue(0); vi.spyOn(globalScene, "randBattleSeedInt").mockReturnValue(0); const commandPhase = game.scene.phaseManager.getCurrentPhase() as CommandPhase; diff --git a/test/abilities/disguise.test.ts b/test/abilities/disguise.test.ts index bf271c81e4d..4745d6ab609 100644 --- a/test/abilities/disguise.test.ts +++ b/test/abilities/disguise.test.ts @@ -37,7 +37,7 @@ describe("Abilities - Disguise", () => { it("takes no damage from attacking move and transforms to Busted form, takes 1/8 max HP damage from the disguise breaking", async () => { await game.classicMode.startBattle(); - const mimikyu = game.scene.getEnemyPokemon()!; + const mimikyu = game.field.getEnemyPokemon(); const maxHp = mimikyu.getMaxHp(); const disguiseDamage = toDmgValue(maxHp / 8); @@ -54,7 +54,7 @@ describe("Abilities - Disguise", () => { it("doesn't break disguise when attacked with ineffective move", async () => { await game.classicMode.startBattle(); - const mimikyu = game.scene.getEnemyPokemon()!; + const mimikyu = game.field.getEnemyPokemon(); expect(mimikyu.formIndex).toBe(disguisedForm); @@ -69,7 +69,7 @@ describe("Abilities - Disguise", () => { game.override.moveset([MoveId.SURGING_STRIKES]).enemyLevel(5); await game.classicMode.startBattle(); - const mimikyu = game.scene.getEnemyPokemon()!; + const mimikyu = game.field.getEnemyPokemon(); const maxHp = mimikyu.getMaxHp(); const disguiseDamage = toDmgValue(maxHp / 8); @@ -91,7 +91,7 @@ describe("Abilities - Disguise", () => { it("takes effects from status moves and damage from status effects", async () => { await game.classicMode.startBattle(); - const mimikyu = game.scene.getEnemyPokemon()!; + const mimikyu = game.field.getEnemyPokemon(); expect(mimikyu.hp).toBe(mimikyu.getMaxHp()); game.move.select(MoveId.TOXIC_THREAD); @@ -109,7 +109,7 @@ describe("Abilities - Disguise", () => { await game.classicMode.startBattle([SpeciesId.MIMIKYU, SpeciesId.FURRET]); - const mimikyu = game.scene.getPlayerPokemon()!; + const mimikyu = game.field.getPlayerPokemon(); const maxHp = mimikyu.getMaxHp(); const disguiseDamage = toDmgValue(maxHp / 8); @@ -154,7 +154,7 @@ describe("Abilities - Disguise", () => { await game.classicMode.startBattle(); - const mimikyu = game.scene.getPlayerPokemon()!; + const mimikyu = game.field.getPlayerPokemon(); expect(mimikyu.formIndex).toBe(bustedForm); @@ -175,7 +175,7 @@ describe("Abilities - Disguise", () => { await game.classicMode.startBattle([SpeciesId.MIMIKYU, SpeciesId.FURRET]); - const mimikyu1 = game.scene.getPlayerPokemon()!; + const mimikyu1 = game.field.getPlayerPokemon(); expect(mimikyu1.formIndex).toBe(bustedForm); @@ -190,7 +190,7 @@ describe("Abilities - Disguise", () => { game.override.enemyMoveset([MoveId.ENDURE]); await game.classicMode.startBattle(); - const mimikyu = game.scene.getEnemyPokemon()!; + const mimikyu = game.field.getEnemyPokemon(); mimikyu.hp = 1; game.move.select(MoveId.SHADOW_SNEAK); @@ -205,7 +205,7 @@ describe("Abilities - Disguise", () => { await game.classicMode.startBattle(); - const mimikyu = game.scene.getEnemyPokemon()!; + const mimikyu = game.field.getEnemyPokemon(); const maxHp = mimikyu.getMaxHp(); const disguiseDamage = toDmgValue(maxHp / 8); @@ -225,6 +225,6 @@ describe("Abilities - Disguise", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - expect(game.scene.getEnemyPokemon()!.formIndex).toBe(disguisedForm); + expect(game.field.getEnemyPokemon().formIndex).toBe(disguisedForm); }); }); diff --git a/test/abilities/dry-skin.test.ts b/test/abilities/dry-skin.test.ts index 01602150710..ad88c5aa377 100644 --- a/test/abilities/dry-skin.test.ts +++ b/test/abilities/dry-skin.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Dry Skin", () => { it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); // first turn game.move.select(MoveId.SUNNY_DAY); @@ -52,7 +52,7 @@ describe("Abilities - Dry Skin", () => { it("during rain, gain 1/8 of maximum health at the end of each turn", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1; @@ -72,7 +72,7 @@ describe("Abilities - Dry Skin", () => { game.override.moveset([MoveId.FLAMETHROWER]); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); const initialHP = 1000; enemy.hp = initialHP; @@ -95,7 +95,7 @@ describe("Abilities - Dry Skin", () => { it("opposing water attacks heal 1/4 of maximum health and deal no damage", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1; @@ -109,7 +109,7 @@ describe("Abilities - Dry Skin", () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1; @@ -123,7 +123,7 @@ describe("Abilities - Dry Skin", () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1; @@ -145,7 +145,7 @@ describe("Abilities - Dry Skin", () => { it("opposing water moves still heal regardless of accuracy check", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.WATER_GUN); enemy.hp = enemy.hp - 1; diff --git a/test/abilities/early-bird.test.ts b/test/abilities/early-bird.test.ts index 97ce02e5e62..a7318fd8c6e 100644 --- a/test/abilities/early-bird.test.ts +++ b/test/abilities/early-bird.test.ts @@ -37,7 +37,7 @@ describe("Abilities - Early Bird", () => { it("reduces Rest's sleep time to 1 turn", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); game.move.select(MoveId.BELLY_DRUM); await game.toNextTurn(); @@ -62,7 +62,7 @@ describe("Abilities - Early Bird", () => { it("reduces 3-turn sleep to 1 turn", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.status = new Status(StatusEffect.SLEEP, 0, 4); game.move.select(MoveId.SPLASH); @@ -81,7 +81,7 @@ describe("Abilities - Early Bird", () => { it("reduces 1-turn sleep to 0 turns", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.status = new Status(StatusEffect.SLEEP, 0, 2); game.move.select(MoveId.SPLASH); diff --git a/test/abilities/flash-fire.test.ts b/test/abilities/flash-fire.test.ts index d9f0e194d9c..a9d837e6e40 100644 --- a/test/abilities/flash-fire.test.ts +++ b/test/abilities/flash-fire.test.ts @@ -39,7 +39,7 @@ describe("Abilities - Flash Fire", () => { game.override.enemyMoveset([MoveId.EMBER]).moveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.BLISSEY]); - const blissey = game.scene.getPlayerPokemon()!; + const blissey = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); @@ -50,7 +50,7 @@ describe("Abilities - Flash Fire", () => { game.override.enemyMoveset([MoveId.EMBER]).moveset([MoveId.PROTECT]); await game.classicMode.startBattle([SpeciesId.BLISSEY]); - const blissey = game.scene.getPlayerPokemon()!; + const blissey = game.field.getPlayerPokemon(); game.move.select(MoveId.PROTECT); await game.phaseInterceptor.to(TurnEndPhase); @@ -61,7 +61,7 @@ describe("Abilities - Flash Fire", () => { game.override.enemyMoveset([MoveId.WILL_O_WISP]).moveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.BLISSEY]); - const blissey = game.scene.getPlayerPokemon()!; + const blissey = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.move.forceHit(); @@ -76,7 +76,7 @@ describe("Abilities - Flash Fire", () => { game.override.enemyMoveset([MoveId.EMBER]).moveset(MoveId.SPLASH).statusEffect(StatusEffect.FREEZE); await game.classicMode.startBattle([SpeciesId.BLISSEY]); - const blissey = game.scene.getPlayerPokemon()!; + const blissey = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); @@ -95,8 +95,8 @@ describe("Abilities - Flash Fire", () => { game.doSelectPartyPokemon(1); await game.phaseInterceptor.to(TurnEndPhase); - const chansey = game.scene.getPlayerPokemon()!; - expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(SpeciesId.CHANSEY); + const chansey = game.field.getPlayerPokemon(); + expect(game.field.getPlayerPokemon().species.speciesId).toBe(SpeciesId.CHANSEY); expect(chansey!.getTag(BattlerTagType.FIRE_BOOST)).toBeUndefined(); }); @@ -107,7 +107,7 @@ describe("Abilities - Flash Fire", () => { .enemyAbility(AbilityId.FLASH_FIRE) .ability(AbilityId.NONE); await game.classicMode.startBattle([SpeciesId.BLISSEY]); - const blissey = game.scene.getPlayerPokemon()!; + const blissey = game.field.getPlayerPokemon(); const initialHP = 1000; blissey.hp = initialHP; @@ -137,7 +137,7 @@ describe("Abilities - Flash Fire", () => { .enemySpecies(SpeciesId.BLISSEY); await game.classicMode.startBattle([SpeciesId.RATTATA]); - const blissey = game.scene.getEnemyPokemon()!; + const blissey = game.field.getEnemyPokemon(); const initialHP = 1000; blissey.hp = initialHP; diff --git a/test/abilities/flower-gift.test.ts b/test/abilities/flower-gift.test.ts index 2fc67b098b7..01459cd4e1e 100644 --- a/test/abilities/flower-gift.test.ts +++ b/test/abilities/flower-gift.test.ts @@ -27,7 +27,7 @@ describe("Abilities - Flower Gift", () => { game.move.select(MoveId.SPLASH); - expect(game.scene.getPlayerPokemon()?.formIndex).toBe(OVERCAST_FORM); + expect(game.field.getPlayerPokemon().formIndex).toBe(OVERCAST_FORM); }; /** @@ -169,7 +169,7 @@ describe("Abilities - Flower Gift", () => { game.override.weather(WeatherType.HARSH_SUN); await game.classicMode.startBattle([SpeciesId.CHERRIM]); - const cherrim = game.scene.getPlayerPokemon()!; + const cherrim = game.field.getPlayerPokemon(); expect(cherrim.formIndex).toBe(SUNSHINE_FORM); game.move.select(MoveId.SPLASH); @@ -188,7 +188,7 @@ describe("Abilities - Flower Gift", () => { await game.classicMode.startBattle([SpeciesId.CHERRIM, SpeciesId.MAGIKARP]); - const cherrim = game.scene.getPlayerPokemon()!; + const cherrim = game.field.getPlayerPokemon(); expect(cherrim.formIndex).toBe(SUNSHINE_FORM); @@ -215,7 +215,7 @@ describe("Abilities - Flower Gift", () => { game.override.weather(WeatherType.SUNNY); await game.classicMode.startBattle([SpeciesId.CASTFORM, SpeciesId.MAGIKARP]); - const cherrim = game.scene.getPlayerPokemon()!; + const cherrim = game.field.getPlayerPokemon(); expect(cherrim.formIndex).toBe(SUNSHINE_FORM); diff --git a/test/abilities/flower-veil.test.ts b/test/abilities/flower-veil.test.ts index 46478a3dd9c..44274d86a1b 100644 --- a/test/abilities/flower-veil.test.ts +++ b/test/abilities/flower-veil.test.ts @@ -46,7 +46,7 @@ describe("Abilities - Flower Veil", () => { .moveset([MoveId.REST, MoveId.SPLASH]) .startingHeldItems([{ name: "FLAME_ORB" }]); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); game.move.select(MoveId.REST); await game.move.selectEnemyMove(MoveId.TACKLE); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -74,7 +74,7 @@ describe("Abilities - Flower Veil", () => { await game.move.selectEnemyMove(MoveId.YAWN, BattlerIndex.PLAYER_2); await game.phaseInterceptor.to("BerryPhase"); - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); expect(user.getTag(BattlerTagType.DROWSY)).toBeFalsy(); expect(ally.getTag(BattlerTagType.DROWSY)).toBeFalsy(); }); @@ -87,7 +87,7 @@ describe("Abilities - Flower Veil", () => { game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.THUNDER_WAVE); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + expect(game.field.getPlayerPokemon().status).toBeUndefined(); }); it("should not prevent status conditions for a non-grass user and its non-grass allies", async () => { @@ -155,7 +155,7 @@ describe("Abilities - Flower Veil", () => { it("should prevent the drops while retaining the boosts from spicy extract", async () => { game.override.enemyMoveset([MoveId.SPICY_EXTRACT]).moveset([MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); expect(user.getStatStage(Stat.ATK)).toBe(2); diff --git a/test/abilities/forecast.test.ts b/test/abilities/forecast.test.ts index 644927186f4..87d1d20acdb 100644 --- a/test/abilities/forecast.test.ts +++ b/test/abilities/forecast.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Forecast", () => { game.move.select(MoveId.SPLASH); - expect(game.scene.getPlayerPokemon()?.formIndex).toBe(NORMAL_FORM); + expect(game.field.getPlayerPokemon().formIndex).toBe(NORMAL_FORM); }; beforeAll(() => { @@ -186,14 +186,14 @@ describe("Abilities - Forecast", () => { game.move.select(MoveId.RAIN_DANCE); await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()?.formIndex).toBe(RAINY_FORM); - expect(game.scene.getEnemyPokemon()?.formIndex).not.toBe(RAINY_FORM); + expect(game.field.getPlayerPokemon().formIndex).toBe(RAINY_FORM); + expect(game.field.getEnemyPokemon().formIndex).not.toBe(RAINY_FORM); }); it("reverts to Normal Form when Forecast is suppressed, changes form to match the weather when it regains it", async () => { game.override.enemyMoveset([MoveId.GASTRO_ACID]).weather(WeatherType.RAIN); await game.classicMode.startBattle([SpeciesId.CASTFORM, SpeciesId.PIKACHU]); - const castform = game.scene.getPlayerPokemon()!; + const castform = game.field.getPlayerPokemon(); expect(castform.formIndex).toBe(RAINY_FORM); @@ -233,7 +233,7 @@ describe("Abilities - Forecast", () => { game.doSwitchPokemon(1); await game.phaseInterceptor.to(PostSummonPhase); - const castform = game.scene.getPlayerPokemon()!; + const castform = game.field.getPlayerPokemon(); // Damage phase should come first await game.phaseInterceptor.to(DamageAnimPhase); @@ -248,7 +248,7 @@ describe("Abilities - Forecast", () => { game.override.weather(WeatherType.RAIN); await game.classicMode.startBattle([SpeciesId.CASTFORM, SpeciesId.MAGIKARP]); - const castform = game.scene.getPlayerPokemon()!; + const castform = game.field.getPlayerPokemon(); expect(castform.formIndex).toBe(RAINY_FORM); @@ -263,14 +263,14 @@ describe("Abilities - Forecast", () => { it("should trigger player's form change when summoned at the same time as an enemy with a weather changing ability", async () => { game.override.enemyAbility(AbilityId.DROUGHT); await game.classicMode.startBattle([SpeciesId.CASTFORM, SpeciesId.MAGIKARP]); - const castform = game.scene.getPlayerPokemon()!; + const castform = game.field.getPlayerPokemon(); expect(castform.formIndex).toBe(SUNNY_FORM); }); it("should trigger enemy's form change when summoned at the same time as a player with a weather changing ability", async () => { game.override.ability(AbilityId.DROUGHT).enemySpecies(SpeciesId.CASTFORM).enemyAbility(AbilityId.FORECAST); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const castform = game.scene.getEnemyPokemon()!; + const castform = game.field.getEnemyPokemon(); expect(castform.formIndex).toBe(SUNNY_FORM); }); }); diff --git a/test/abilities/good-as-gold.test.ts b/test/abilities/good-as-gold.test.ts index 7fc1ad85b53..c6b6faf8349 100644 --- a/test/abilities/good-as-gold.test.ts +++ b/test/abilities/good-as-gold.test.ts @@ -43,7 +43,7 @@ describe("Abilities - Good As Gold", () => { game.override.enemyMoveset([MoveId.GROWL]); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); diff --git a/test/abilities/gorilla-tactics.test.ts b/test/abilities/gorilla-tactics.test.ts index 83e6cdb156e..01acd2295ab 100644 --- a/test/abilities/gorilla-tactics.test.ts +++ b/test/abilities/gorilla-tactics.test.ts @@ -40,7 +40,7 @@ describe("Abilities - Gorilla Tactics", () => { it("boosts the Pokémon's Attack by 50%, but limits the Pokémon to using only one move", async () => { await game.classicMode.startBattle([SpeciesId.GALAR_DARMANITAN]); - const darmanitan = game.scene.getPlayerPokemon()!; + const darmanitan = game.field.getPlayerPokemon(); const initialAtkStat = darmanitan.getStat(Stat.ATK); game.move.select(MoveId.SPLASH); @@ -86,7 +86,7 @@ describe("Abilities - Gorilla Tactics", () => { vi.spyOn(RandomMoveAttr.prototype, "getMoveOverride").mockReturnValue(MoveId.TACKLE); await game.classicMode.startBattle([SpeciesId.GALAR_DARMANITAN]); - const darmanitan = game.scene.getPlayerPokemon()!; + const darmanitan = game.field.getPlayerPokemon(); game.move.select(MoveId.METRONOME); await game.phaseInterceptor.to("TurnEndPhase"); diff --git a/test/abilities/gulp-missile.test.ts b/test/abilities/gulp-missile.test.ts index faf30adae33..865a319251f 100644 --- a/test/abilities/gulp-missile.test.ts +++ b/test/abilities/gulp-missile.test.ts @@ -52,7 +52,7 @@ describe("Abilities - Gulp Missile", () => { it("changes to Gulping Form if HP is over half when Surf or Dive is used", async () => { await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); game.move.select(MoveId.DIVE); await game.toNextTurn(); @@ -66,7 +66,7 @@ describe("Abilities - Gulp Missile", () => { it("changes to Gorging Form if HP is under half when Surf or Dive is used", async () => { await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.49); expect(cramorant.getHpRatio()).toBe(0.49); @@ -80,7 +80,7 @@ describe("Abilities - Gulp Missile", () => { it("changes to base form when switched out after Surf or Dive is used", async () => { await game.classicMode.startBattle([SpeciesId.CRAMORANT, SpeciesId.MAGIKARP]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); game.move.select(MoveId.SURF); await game.toNextTurn(); @@ -95,7 +95,7 @@ describe("Abilities - Gulp Missile", () => { it("changes form during Dive's charge turn", async () => { await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); game.move.select(MoveId.DIVE); await game.phaseInterceptor.to("MoveEndPhase"); @@ -108,7 +108,7 @@ describe("Abilities - Gulp Missile", () => { game.override.enemyMoveset(MoveId.TACKLE); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "damageAndUpdate"); game.move.select(MoveId.SURF); @@ -121,7 +121,7 @@ describe("Abilities - Gulp Missile", () => { game.override.enemyMoveset(MoveId.TAIL_WHIP); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(MoveId.SURF); @@ -140,8 +140,8 @@ describe("Abilities - Gulp Missile", () => { game.override.enemyMoveset(MoveId.TACKLE); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const cramorant = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "damageAndUpdate"); vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); @@ -164,8 +164,8 @@ describe("Abilities - Gulp Missile", () => { game.override.enemyMoveset(MoveId.TACKLE); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const cramorant = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "damageAndUpdate"); vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.45); @@ -188,7 +188,7 @@ describe("Abilities - Gulp Missile", () => { game.override.enemyMoveset(MoveId.SURF); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); game.move.select(MoveId.DIVE); await game.phaseInterceptor.to("BerryPhase", false); @@ -201,8 +201,8 @@ describe("Abilities - Gulp Missile", () => { game.override.enemyMoveset(MoveId.TACKLE).enemyAbility(AbilityId.MAGIC_GUARD); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const cramorant = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); @@ -225,7 +225,7 @@ describe("Abilities - Gulp Missile", () => { game.override.enemyMoveset(MoveId.THUNDERBOLT); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); game.move.select(MoveId.SURF); await game.phaseInterceptor.to("FaintPhase"); @@ -233,7 +233,7 @@ describe("Abilities - Gulp Missile", () => { expect(cramorant.hp).toBe(0); expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeUndefined(); expect(cramorant.formIndex).toBe(NORMAL_FORM); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.DEF)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.DEF)).toBe(-1); }); it("doesn't trigger if user is behind a substitute", async () => { @@ -244,21 +244,21 @@ describe("Abilities - Gulp Missile", () => { await game.move.selectEnemyMove(MoveId.SPLASH); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.formIndex).toBe(GULPING_FORM); + expect(game.field.getPlayerPokemon().formIndex).toBe(GULPING_FORM); game.move.select(MoveId.SUBSTITUTE); await game.move.selectEnemyMove(MoveId.POWER_TRIP); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.formIndex).toBe(GULPING_FORM); + expect(game.field.getPlayerPokemon().formIndex).toBe(GULPING_FORM); }); it("cannot be suppressed", async () => { game.override.enemyMoveset(MoveId.GASTRO_ACID); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(MoveId.SURF); @@ -278,7 +278,7 @@ describe("Abilities - Gulp Missile", () => { game.override.enemyMoveset(MoveId.SKILL_SWAP); await game.classicMode.startBattle([SpeciesId.CRAMORANT]); - const cramorant = game.scene.getPlayerPokemon()!; + const cramorant = game.field.getPlayerPokemon(); vi.spyOn(cramorant, "getHpRatio").mockReturnValue(0.55); game.move.select(MoveId.SURF); @@ -301,6 +301,6 @@ describe("Abilities - Gulp Missile", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("TurnStartPhase"); - expect(game.scene.getEnemyPokemon()?.hasAbility(AbilityId.GULP_MISSILE)).toBe(false); + expect(game.field.getEnemyPokemon().hasAbility(AbilityId.GULP_MISSILE)).toBe(false); }); }); diff --git a/test/abilities/harvest.test.ts b/test/abilities/harvest.test.ts index d27ee491fed..ec4c02c7b91 100644 --- a/test/abilities/harvest.test.ts +++ b/test/abilities/harvest.test.ts @@ -19,7 +19,7 @@ describe("Abilities - Harvest", () => { let game: GameManager; const getPlayerBerries = () => - game.scene.getModifiers(BerryModifier, true).filter(b => b.pokemonId === game.scene.getPlayerPokemon()?.id); + game.scene.getModifiers(BerryModifier, true).filter(b => b.pokemonId === game.field.getPlayerPokemon().id); /** Check whether the player's Modifiers contains the specified berries and nothing else. */ function expectBerriesContaining(...berries: ModifierOverride[]): void { @@ -64,11 +64,11 @@ describe("Abilities - Harvest", () => { await game.move.selectEnemyMove(MoveId.NUZZLE); await game.phaseInterceptor.to("BerryPhase"); expect(getPlayerBerries()).toHaveLength(0); - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toHaveLength(1); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toHaveLength(1); await game.phaseInterceptor.to("TurnEndPhase"); expectBerriesContaining({ name: "BERRY", type: BerryType.LUM, count: 1 }); - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toEqual([]); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toEqual([]); }); it("tracks berries eaten while disabled/not present", async () => { @@ -82,7 +82,7 @@ describe("Abilities - Harvest", () => { .enemyAbility(AbilityId.NEUTRALIZING_GAS); await game.classicMode.startBattle([SpeciesId.MILOTIC]); - const milotic = game.scene.getPlayerPokemon()!; + const milotic = game.field.getPlayerPokemon(); expect(milotic).toBeDefined(); // Chug a few berries without harvest (should get tracked) @@ -122,7 +122,7 @@ describe("Abilities - Harvest", () => { .ability(AbilityId.BALL_FETCH); // don't actually need harvest for this test await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const regieleki = game.scene.getPlayerPokemon()!; + const regieleki = game.field.getPlayerPokemon(); regieleki.hp = 1; game.move.select(MoveId.SPLASH); @@ -150,7 +150,7 @@ describe("Abilities - Harvest", () => { .enemyAbility(AbilityId.COMPOUND_EYES); await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const regieleki = game.scene.getPlayerPokemon()!; + const regieleki = game.field.getPlayerPokemon(); regieleki.hp = regieleki.getMaxHp() / 4 + 1; game.move.select(MoveId.SPLASH); @@ -161,7 +161,7 @@ describe("Abilities - Harvest", () => { // ate 1 berry and recovered it expect(regieleki.battleData.berriesEaten).toEqual([]); expect(getPlayerBerries()).toEqual([expect.objectContaining({ berryType: BerryType.PETAYA, stackCount: 1 })]); - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.SPATK)).toBe(1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.SPATK)).toBe(1); // heal up so harvest doesn't proc and kill enemy game.move.select(MoveId.EARTHQUAKE); @@ -170,13 +170,13 @@ describe("Abilities - Harvest", () => { await game.toNextWave(); expectBerriesContaining({ name: "BERRY", count: 1, type: BerryType.PETAYA }); - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.SPATK)).toBe(1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.SPATK)).toBe(1); await game.reload.reloadSession(); expect(regieleki.battleData.berriesEaten).toEqual([]); expectBerriesContaining({ name: "BERRY", count: 1, type: BerryType.PETAYA }); - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.SPATK)).toBe(1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.SPATK)).toBe(1); }); it("cannot restore capped berries", async () => { @@ -187,7 +187,7 @@ describe("Abilities - Harvest", () => { game.override.startingHeldItems(initBerries); await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const feebas = game.scene.getPlayerPokemon()!; + const feebas = game.field.getPlayerPokemon(); feebas.battleData.berriesEaten = [BerryType.LUM, BerryType.STARF]; game.move.select(MoveId.SPLASH); @@ -215,7 +215,7 @@ describe("Abilities - Harvest", () => { game.override.startingHeldItems(initBerries); await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.battleData.berriesEaten = [BerryType.LUM, BerryType.STARF]; game.move.select(MoveId.SPLASH); @@ -234,7 +234,7 @@ describe("Abilities - Harvest", () => { await game.move.selectEnemyMove(MoveId.INCINERATE); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toEqual([]); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toEqual([]); }); it("cannot restore knocked off berries", async () => { @@ -245,7 +245,7 @@ describe("Abilities - Harvest", () => { await game.move.selectEnemyMove(MoveId.KNOCK_OFF); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toEqual([]); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toEqual([]); }); it("can restore berries eaten by Teatime", async () => { @@ -257,7 +257,7 @@ describe("Abilities - Harvest", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toEqual([]); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toEqual([]); expectBerriesContaining(...initBerries); }); @@ -271,8 +271,8 @@ describe("Abilities - Harvest", () => { await game.phaseInterceptor.to("BerryPhase"); // pluck triggers harvest for neither side - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toEqual([]); - expect(game.scene.getEnemyPokemon()?.battleData.berriesEaten).toEqual([]); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toEqual([]); + expect(game.field.getEnemyPokemon().battleData.berriesEaten).toEqual([]); expect(getPlayerBerries()).toEqual([]); }); @@ -293,7 +293,7 @@ describe("Abilities - Harvest", () => { await game.phaseInterceptor.to("TurnEndPhase", false); // won't trigger harvest since we didn't lose the berry (it just doesn't ever add it to the array) - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toEqual([]); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toEqual([]); expectBerriesContaining(...initBerries); }); @@ -303,7 +303,7 @@ describe("Abilities - Harvest", () => { await game.classicMode.startBattle([SpeciesId.MEOWSCARADA]); // pre damage - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.hp = 1; // steal a sitrus and immediately consume it @@ -326,7 +326,7 @@ describe("Abilities - Harvest", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toBe([]); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toBe([]); expect(getPlayerBerries()).toEqual([]); }); @@ -339,7 +339,7 @@ describe("Abilities - Harvest", () => { game.move.select(MoveId.NATURAL_GIFT); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.battleData.berriesEaten).toHaveLength(0); + expect(game.field.getPlayerPokemon().battleData.berriesEaten).toHaveLength(0); expectBerriesContaining(...initBerries); }); }); diff --git a/test/abilities/healer.test.ts b/test/abilities/healer.test.ts index c151836d76d..52f47535bf4 100644 --- a/test/abilities/healer.test.ts +++ b/test/abilities/healer.test.ts @@ -46,7 +46,7 @@ describe("Abilities - Healer", () => { game.override.moveset([MoveId.SPLASH, MoveId.LUNAR_DANCE]); await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.MAGIKARP]); - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); // Only want one magikarp to have the ability vi.spyOn(user, "getAbility").mockReturnValue(allAbilities[AbilityId.HEALER]); game.move.select(MoveId.SPLASH); diff --git a/test/abilities/heatproof.test.ts b/test/abilities/heatproof.test.ts index 63f877a3567..25e9be12809 100644 --- a/test/abilities/heatproof.test.ts +++ b/test/abilities/heatproof.test.ts @@ -40,7 +40,7 @@ describe("Abilities - Heatproof", () => { it("reduces Fire type damage by half", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); const initialHP = 1000; enemy.hp = initialHP; @@ -63,7 +63,7 @@ describe("Abilities - Heatproof", () => { game.override.enemyStatusEffect(StatusEffect.BURN).enemySpecies(SpeciesId.ABRA); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.SPLASH); await game.toNextTurn(); diff --git a/test/abilities/honey-gather.test.ts b/test/abilities/honey-gather.test.ts index 8dfd2c189f8..e2f356470ae 100644 --- a/test/abilities/honey-gather.test.ts +++ b/test/abilities/honey-gather.test.ts @@ -62,7 +62,7 @@ describe("Abilities - Honey Gather", () => { game.scene.money = 1000; // something weird is going on with the test framework, so this is required to prevent a crash - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "scene", "get").mockReturnValue(game.scene); // Expects next wave so run must succeed vi.spyOn(Overrides, "RUN_SUCCESS_OVERRIDE", "get").mockReturnValue(true); diff --git a/test/abilities/hustle.test.ts b/test/abilities/hustle.test.ts index 74ee01f02ef..5280df7b9de 100644 --- a/test/abilities/hustle.test.ts +++ b/test/abilities/hustle.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Hustle", () => { it("increases the user's Attack stat by 50%", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pikachu = game.scene.getPlayerPokemon()!; + const pikachu = game.field.getPlayerPokemon(); const atk = pikachu.stats[Stat.ATK]; vi.spyOn(pikachu, "getEffectiveStat"); @@ -49,7 +49,7 @@ describe("Abilities - Hustle", () => { it("lowers the accuracy of the user's physical moves by 20%", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pikachu = game.scene.getPlayerPokemon()!; + const pikachu = game.field.getPlayerPokemon(); vi.spyOn(pikachu, "getAccuracyMultiplier"); @@ -61,7 +61,7 @@ describe("Abilities - Hustle", () => { it("does not affect non-physical moves", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pikachu = game.scene.getPlayerPokemon()!; + const pikachu = game.field.getPlayerPokemon(); const spatk = pikachu.stats[Stat.SPATK]; vi.spyOn(pikachu, "getEffectiveStat"); @@ -78,8 +78,8 @@ describe("Abilities - Hustle", () => { game.override.startingLevel(100).enemyLevel(30); await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pikachu = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const pikachu = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(pikachu, "getAccuracyMultiplier"); vi.spyOn(allMoves[MoveId.FISSURE], "calculateBattleAccuracy"); diff --git a/test/abilities/hyper-cutter.test.ts b/test/abilities/hyper-cutter.test.ts index 8a509d026b6..51244532c79 100644 --- a/test/abilities/hyper-cutter.test.ts +++ b/test/abilities/hyper-cutter.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Hyper Cutter", () => { it("only prevents ATK drops", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.OCTOLOCK); await game.toNextTurn(); diff --git a/test/abilities/ice-face.test.ts b/test/abilities/ice-face.test.ts index 9b3020b67a7..2410cd8492f 100644 --- a/test/abilities/ice-face.test.ts +++ b/test/abilities/ice-face.test.ts @@ -44,7 +44,7 @@ describe("Abilities - Ice Face", () => { await game.phaseInterceptor.to(MoveEndPhase); - const eiscue = game.scene.getEnemyPokemon()!; + const eiscue = game.field.getEnemyPokemon(); expect(eiscue.isFullHp()).toBe(true); expect(eiscue.formIndex).toBe(noiceForm); @@ -57,7 +57,7 @@ describe("Abilities - Ice Face", () => { game.move.select(MoveId.SURGING_STRIKES); - const eiscue = game.scene.getEnemyPokemon()!; + const eiscue = game.field.getEnemyPokemon(); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeDefined(); // First hit @@ -85,7 +85,7 @@ describe("Abilities - Ice Face", () => { await game.phaseInterceptor.to(MoveEndPhase); - const eiscue = game.scene.getEnemyPokemon()!; + const eiscue = game.field.getEnemyPokemon(); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); expect(eiscue.formIndex).toBe(icefaceForm); @@ -99,7 +99,7 @@ describe("Abilities - Ice Face", () => { await game.phaseInterceptor.to(MoveEndPhase); - const eiscue = game.scene.getEnemyPokemon()!; + const eiscue = game.field.getEnemyPokemon(); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); expect(eiscue.formIndex).toBe(icefaceForm); @@ -114,7 +114,7 @@ describe("Abilities - Ice Face", () => { await game.phaseInterceptor.to(MoveEndPhase); - const eiscue = game.scene.getEnemyPokemon()!; + const eiscue = game.field.getEnemyPokemon(); expect(eiscue.isFullHp()).toBe(true); expect(eiscue.formIndex).toBe(noiceForm); @@ -134,7 +134,7 @@ describe("Abilities - Ice Face", () => { game.move.select(MoveId.SNOWSCAPE); await game.phaseInterceptor.to(TurnEndPhase); - let eiscue = game.scene.getPlayerPokemon()!; + let eiscue = game.field.getPlayerPokemon(); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); expect(eiscue.formIndex).toBe(noiceForm); @@ -146,7 +146,7 @@ describe("Abilities - Ice Face", () => { game.doSwitchPokemon(1); await game.phaseInterceptor.to(QuietFormChangePhase); - eiscue = game.scene.getPlayerPokemon()!; + eiscue = game.field.getPlayerPokemon(); expect(eiscue.formIndex).toBe(icefaceForm); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); @@ -158,7 +158,7 @@ describe("Abilities - Ice Face", () => { await game.classicMode.startBattle([SpeciesId.EISCUE]); game.move.select(MoveId.HAIL); - const eiscue = game.scene.getPlayerPokemon()!; + const eiscue = game.field.getPlayerPokemon(); await game.phaseInterceptor.to(QuietFormChangePhase); @@ -179,7 +179,7 @@ describe("Abilities - Ice Face", () => { game.move.select(MoveId.ICE_BEAM); await game.phaseInterceptor.to(TurnEndPhase); - let eiscue = game.scene.getPlayerPokemon()!; + let eiscue = game.field.getPlayerPokemon(); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); expect(eiscue.formIndex).toBe(noiceForm); @@ -206,7 +206,7 @@ describe("Abilities - Ice Face", () => { await game.classicMode.startBattle([SpeciesId.EISCUE]); - const eiscue = game.scene.getPlayerPokemon()!; + const eiscue = game.field.getPlayerPokemon(); expect(eiscue.formIndex).toBe(noiceForm); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeUndefined(); @@ -229,7 +229,7 @@ describe("Abilities - Ice Face", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - expect(game.scene.getEnemyPokemon()!.formIndex).toBe(icefaceForm); + expect(game.field.getEnemyPokemon().formIndex).toBe(icefaceForm); }); it("cannot be suppressed", async () => { @@ -241,7 +241,7 @@ describe("Abilities - Ice Face", () => { await game.phaseInterceptor.to(TurnEndPhase); - const eiscue = game.scene.getEnemyPokemon()!; + const eiscue = game.field.getEnemyPokemon(); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).not.toBe(undefined); expect(eiscue.formIndex).toBe(icefaceForm); @@ -257,7 +257,7 @@ describe("Abilities - Ice Face", () => { await game.phaseInterceptor.to(TurnEndPhase); - const eiscue = game.scene.getEnemyPokemon()!; + const eiscue = game.field.getEnemyPokemon(); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeDefined(); expect(eiscue.formIndex).toBe(icefaceForm); @@ -269,10 +269,10 @@ describe("Abilities - Ice Face", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const eiscue = game.scene.getEnemyPokemon()!; + const eiscue = game.field.getEnemyPokemon(); expect(eiscue.getTag(BattlerTagType.ICE_FACE)).toBeDefined(); expect(eiscue.formIndex).toBe(icefaceForm); - expect(game.scene.getPlayerPokemon()!.hasAbility(AbilityId.TRACE)).toBe(true); + expect(game.field.getPlayerPokemon().hasAbility(AbilityId.TRACE)).toBe(true); }); }); diff --git a/test/abilities/illuminate.test.ts b/test/abilities/illuminate.test.ts index 814b7dc64b7..3cf0bc90702 100644 --- a/test/abilities/illuminate.test.ts +++ b/test/abilities/illuminate.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Illuminate", () => { await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); expect(player.getStatStage(Stat.ACC)).toBe(0); diff --git a/test/abilities/illusion.test.ts b/test/abilities/illusion.test.ts index e48cd9e9b78..2343a11cb74 100644 --- a/test/abilities/illusion.test.ts +++ b/test/abilities/illusion.test.ts @@ -35,8 +35,8 @@ describe("Abilities - Illusion", () => { it("creates illusion at the start", async () => { await game.classicMode.startBattle([SpeciesId.ZOROARK, SpeciesId.FEEBAS]); - const zoroark = game.scene.getPlayerPokemon()!; - const zorua = game.scene.getEnemyPokemon()!; + const zoroark = game.field.getPlayerPokemon(); + const zorua = game.field.getEnemyPokemon(); expect(!!zoroark.summonData.illusion).equals(true); expect(!!zorua.summonData.illusion).equals(true); @@ -48,7 +48,7 @@ describe("Abilities - Illusion", () => { await game.phaseInterceptor.to("TurnEndPhase"); - const zorua = game.scene.getEnemyPokemon()!; + const zorua = game.field.getEnemyPokemon(); expect(!!zorua.summonData.illusion).equals(false); expect(zorua.name).equals("Zorua"); @@ -60,7 +60,7 @@ describe("Abilities - Illusion", () => { await game.phaseInterceptor.to("TurnEndPhase"); - const zorua = game.scene.getEnemyPokemon()!; + const zorua = game.field.getEnemyPokemon(); expect(!!zorua.summonData.illusion).equals(false); }); @@ -69,7 +69,7 @@ describe("Abilities - Illusion", () => { game.override.enemyAbility(AbilityId.NEUTRALIZING_GAS); await game.classicMode.startBattle([SpeciesId.KOFFING]); - const zorua = game.scene.getEnemyPokemon()!; + const zorua = game.field.getEnemyPokemon(); expect(!!zorua.summonData.illusion).equals(false); }); @@ -85,15 +85,15 @@ describe("Abilities - Illusion", () => { game.doSwitchPokemon(1); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.summonData.illusion).toBeFalsy(); + expect(game.field.getPlayerPokemon().summonData.illusion).toBeFalsy(); }); it("causes enemy AI to consider the illusion's type instead of the actual type when considering move effectiveness", async () => { game.override.enemyMoveset([MoveId.FLAMETHROWER, MoveId.PSYCHIC, MoveId.TACKLE]); await game.classicMode.startBattle([SpeciesId.ZOROARK, SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon()!; - const zoroark = game.scene.getPlayerPokemon()!; + const enemy = game.field.getEnemyPokemon(); + const zoroark = game.field.getPlayerPokemon(); const flameThrower = enemy.getMoveset()[0]!.getMove(); const psychic = enemy.getMoveset()[1]!.getMove(); @@ -125,7 +125,7 @@ describe("Abilities - Illusion", () => { await game.move.forceEnemyMove(MoveId.WILL_O_WISP); await game.toEndOfTurn(); - const zoroark = game.scene.getPlayerPokemon()!; + const zoroark = game.field.getPlayerPokemon(); expect(!!zoroark.summonData.illusion).equals(true); }); @@ -143,7 +143,7 @@ describe("Abilities - Illusion", () => { await game.phaseInterceptor.to("TurnEndPhase"); - const zoroark = game.scene.getPlayerPokemon()!; + const zoroark = game.field.getPlayerPokemon(); expect(zoroark.summonData.illusion?.name).equals("Axew"); expect(zoroark.getNameToRender(true)).equals("axew nickname"); @@ -155,7 +155,7 @@ describe("Abilities - Illusion", () => { it("breaks when suppressed", async () => { game.override.moveset(MoveId.GASTRO_ACID); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const zorua = game.scene.getEnemyPokemon()!; + const zorua = game.field.getEnemyPokemon(); expect(!!zorua.summonData?.illusion).toBe(true); diff --git a/test/abilities/infiltrator.test.ts b/test/abilities/infiltrator.test.ts index 9f3678850a1..a093fbbe6c6 100644 --- a/test/abilities/infiltrator.test.ts +++ b/test/abilities/infiltrator.test.ts @@ -58,8 +58,8 @@ describe("Abilities - Infiltrator", () => { ])("should bypass the target's $effectName", async ({ tagType, move }) => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); const preScreenDmg = enemy.getAttackDamage({ source: player, move: allMoves[move] }).damage; @@ -74,8 +74,8 @@ describe("Abilities - Infiltrator", () => { it("should bypass the target's Safeguard", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.scene.arena.addTag(ArenaTagType.SAFEGUARD, 1, MoveId.NONE, enemy.id, ArenaTagSide.ENEMY, true); @@ -90,8 +90,8 @@ describe("Abilities - Infiltrator", () => { it.todo("should bypass the target's Mist", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.scene.arena.addTag(ArenaTagType.MIST, 1, MoveId.NONE, enemy.id, ArenaTagSide.ENEMY, true); @@ -105,8 +105,8 @@ describe("Abilities - Infiltrator", () => { it("should bypass the target's Substitute", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.addTag(BattlerTagType.SUBSTITUTE, 1, MoveId.NONE, enemy.id); diff --git a/test/abilities/intrepid-sword.test.ts b/test/abilities/intrepid-sword.test.ts index 75a1ab14e82..4cd8f5e394b 100644 --- a/test/abilities/intrepid-sword.test.ts +++ b/test/abilities/intrepid-sword.test.ts @@ -32,8 +32,8 @@ describe("Abilities - Intrepid Sword", () => { it("should raise ATK stat stage by 1 on entry", async () => { await game.classicMode.runToSummon([SpeciesId.ZACIAN]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); await game.phaseInterceptor.to(CommandPhase, false); diff --git a/test/abilities/magic-bounce.test.ts b/test/abilities/magic-bounce.test.ts index 3b4185e848f..c15690c3f5d 100644 --- a/test/abilities/magic-bounce.test.ts +++ b/test/abilities/magic-bounce.test.ts @@ -42,7 +42,7 @@ describe("Abilities - Magic Bounce", () => { game.move.use(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should not bounce moves while the target is in the semi-invulnerable state", async () => { @@ -53,7 +53,7 @@ describe("Abilities - Magic Bounce", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(0); }); it("should individually bounce back multi-target moves", async () => { @@ -70,12 +70,12 @@ describe("Abilities - Magic Bounce", () => { it("should still bounce back a move that would otherwise fail", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); + game.field.getEnemyPokemon().setStatStage(Stat.ATK, -6); game.move.use(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should not bounce back a move that was just bounced", async () => { @@ -85,7 +85,7 @@ describe("Abilities - Magic Bounce", () => { game.move.select(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should receive the stat change after reflecting a move back to a mirror armor user", async () => { @@ -95,7 +95,7 @@ describe("Abilities - Magic Bounce", () => { game.move.select(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should not bounce back a move from a mold breaker user", async () => { @@ -105,7 +105,7 @@ describe("Abilities - Magic Bounce", () => { game.move.use(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should bounce back a spread status move against both pokemon", async () => { @@ -156,7 +156,7 @@ describe("Abilities - Magic Bounce", () => { game.move.select(MoveId.CURSE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined(); + expect(game.field.getEnemyPokemon().getTag(BattlerTagType.CURSED)).toBeDefined(); }); // TODO: enable when Magic Bounce is fixed to properly reset the hit count @@ -164,8 +164,8 @@ describe("Abilities - Magic Bounce", () => { game.override.moveset([MoveId.SPLASH, MoveId.GROWL, MoveId.ENCORE]).enemyMoveset([MoveId.TACKLE, MoveId.GROWL]); // game.override.ability(AbilityId.MOLD_BREAKER); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); // Give the player MOLD_BREAKER for this turn to bypass Magic Bounce. const playerAbilitySpy = game.field.mockAbility(playerPokemon, AbilityId.MOLD_BREAKER); @@ -194,8 +194,8 @@ describe("Abilities - Magic Bounce", () => { .enemyAbility(AbilityId.MAGIC_BOUNCE); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); // turn 1 game.move.select(MoveId.GROWL); @@ -237,7 +237,7 @@ describe("Abilities - Magic Bounce", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); const stomping_tantrum = allMoves[MoveId.STOMPING_TANTRUM]; - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(stomping_tantrum, "calculateBattlePower"); // Spore gets reflected back onto us @@ -260,35 +260,35 @@ describe("Abilities - Magic Bounce", () => { // Turn 1 - thunder wave immunity test game.move.select(MoveId.THUNDER_WAVE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + expect(game.field.getPlayerPokemon().status).toBeUndefined(); // Turn 2 - soundproof immunity test game.move.select(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(0); }); it("should bounce back a move before the accuracy check", async () => { game.override.moveset([MoveId.SPORE]); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const attacker = game.scene.getPlayerPokemon()!; + const attacker = game.field.getPlayerPokemon(); vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0); game.move.select(MoveId.SPORE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + expect(game.field.getPlayerPokemon().status?.effect).toBe(StatusEffect.SLEEP); }); it("should take the accuracy of the magic bounce user into account", async () => { game.override.moveset([MoveId.SPORE]); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const opponent = game.scene.getEnemyPokemon()!; + const opponent = game.field.getEnemyPokemon(); vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); game.move.select(MoveId.SPORE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + expect(game.field.getPlayerPokemon().status).toBeUndefined(); }); it("should always apply the leftmost available target's magic bounce when bouncing moves like sticky webs in doubles", async () => { @@ -332,14 +332,14 @@ describe("Abilities - Magic Bounce", () => { await game.move.selectEnemyMove(MoveId.FLY); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.TOXIC); - expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + expect(game.field.getEnemyPokemon().status?.effect).toBe(StatusEffect.TOXIC); + expect(game.field.getPlayerPokemon().status).toBeUndefined(); game.override.ability(AbilityId.NO_GUARD); game.move.select(MoveId.CHARM); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-2); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-2); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(0); }); }); diff --git a/test/abilities/mimicry.test.ts b/test/abilities/mimicry.test.ts index c04860d1fcd..44416387f6e 100644 --- a/test/abilities/mimicry.test.ts +++ b/test/abilities/mimicry.test.ts @@ -47,44 +47,44 @@ describe("Abilities - Mimicry", () => { }); it("Pokemon should revert back to its original, root type once terrain ends", async () => { - game.override - .moveset([MoveId.SPLASH, MoveId.TRANSFORM]) - .enemyAbility(AbilityId.MIMICRY) - .enemyMoveset([MoveId.SPLASH, MoveId.PSYCHIC_TERRAIN]); + game.override.enemyAbility(AbilityId.MIMICRY); await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const playerPokemon = game.scene.getPlayerPokemon(); - game.move.select(MoveId.TRANSFORM); - await game.move.selectEnemyMove(MoveId.PSYCHIC_TERRAIN); + const playerPokemon = game.field.getPlayerPokemon(); + + game.move.use(MoveId.SKILL_SWAP); + await game.move.forceEnemyMove(MoveId.PSYCHIC_TERRAIN); await game.toNextTurn(); - expect(playerPokemon?.getTypes().includes(PokemonType.PSYCHIC)).toBe(true); + + expect(playerPokemon.getTypes()).toEqual([PokemonType.PSYCHIC]); if (game.scene.arena.terrain) { game.scene.arena.terrain.turnsLeft = 1; } - game.move.select(MoveId.SPLASH); - await game.move.selectEnemyMove(MoveId.SPLASH); + game.move.use(MoveId.SPLASH); + await game.move.forceEnemyMove(MoveId.SPLASH); await game.toNextTurn(); - expect(playerPokemon?.getTypes().includes(PokemonType.ELECTRIC)).toBe(true); + + expect(playerPokemon.getTypes()).toEqual([PokemonType.ELECTRIC]); }); it("If the Pokemon is under the effect of a type-adding move and an equivalent terrain activates, the move's effect disappears", async () => { game.override.enemyMoveset([MoveId.FORESTS_CURSE, MoveId.GRASSY_TERRAIN]); await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const playerPokemon = game.scene.getPlayerPokemon(); + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.FORESTS_CURSE); await game.toNextTurn(); - expect(playerPokemon?.summonData.addedType).toBe(PokemonType.GRASS); + expect(playerPokemon.summonData.addedType).toBe(PokemonType.GRASS); game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.GRASSY_TERRAIN); await game.phaseInterceptor.to("TurnEndPhase"); - expect(playerPokemon?.summonData.addedType).toBeNull(); - expect(playerPokemon?.getTypes().includes(PokemonType.GRASS)).toBe(true); + expect(playerPokemon.summonData.addedType).toBeNull(); + expect(playerPokemon.getTypes()).toEqual([PokemonType.GRASS]); }); }); diff --git a/test/abilities/mirror-armor.test.ts b/test/abilities/mirror-armor.test.ts index b2f9c9dc8fa..b2bd9be4755 100644 --- a/test/abilities/mirror-armor.test.ts +++ b/test/abilities/mirror-armor.test.ts @@ -40,8 +40,8 @@ describe("Ability - Mirror Armor", () => { game.override.ability(AbilityId.MIRROR_ARMOR).enemyAbility(AbilityId.INTIMIDATE); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); // Enemy has intimidate, enemy should lose -1 atk game.move.select(MoveId.SPLASH); @@ -56,8 +56,8 @@ describe("Ability - Mirror Armor", () => { game.override.enemyAbility(AbilityId.MIRROR_ARMOR).ability(AbilityId.INTIMIDATE); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); // Enemy has intimidate, enemy should lose -1 atk game.move.select(MoveId.SPLASH); @@ -112,8 +112,8 @@ describe("Ability - Mirror Armor", () => { game.override.ability(AbilityId.MIRROR_ARMOR).enemyAbility(AbilityId.INTIMIDATE); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); // Enemy has intimidate and uses tickle, enemy receives -2 atk and -1 defense game.move.select(MoveId.SPLASH); @@ -153,8 +153,8 @@ describe("Ability - Mirror Armor", () => { game.override.enemyAbility(AbilityId.MIRROR_ARMOR).ability(AbilityId.INTIMIDATE); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); // Enemy has intimidate and uses tickle, enemy receives -2 atk and -1 defense game.move.select(MoveId.TICKLE); @@ -171,8 +171,8 @@ describe("Ability - Mirror Armor", () => { game.override.enemyAbility(AbilityId.WHITE_SMOKE).ability(AbilityId.MIRROR_ARMOR); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); // Enemy has intimidate and uses tickle, enemy has white smoke, no one loses stats game.move.select(MoveId.SPLASH); @@ -189,8 +189,8 @@ describe("Ability - Mirror Armor", () => { game.override.ability(AbilityId.WHITE_SMOKE).enemyAbility(AbilityId.MIRROR_ARMOR); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); // Enemy has intimidate and uses tickle, enemy has white smoke, no one loses stats game.move.select(MoveId.TICKLE); @@ -207,8 +207,8 @@ describe("Ability - Mirror Armor", () => { game.override.ability(AbilityId.MIRROR_ARMOR); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); // Enemy uses octolock, player loses stats at end of turn game.move.select(MoveId.SPLASH); @@ -225,8 +225,8 @@ describe("Ability - Mirror Armor", () => { game.override.enemyAbility(AbilityId.MIRROR_ARMOR); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); // Player uses octolock, enemy loses stats at end of turn game.move.select(MoveId.OCTOLOCK); @@ -243,8 +243,8 @@ describe("Ability - Mirror Armor", () => { game.override.enemyAbility(AbilityId.MIRROR_ARMOR).ability(AbilityId.MIRROR_ARMOR).ability(AbilityId.INTIMIDATE); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.SPLASH, BattlerIndex.PLAYER); @@ -258,8 +258,8 @@ describe("Ability - Mirror Armor", () => { game.override.ability(AbilityId.MIRROR_ARMOR); await game.classicMode.startBattle([SpeciesId.BULBASAUR, SpeciesId.CHARMANDER, SpeciesId.SQUIRTLE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const userPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const userPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.STICKY_WEB, BattlerIndex.PLAYER); diff --git a/test/abilities/moody.test.ts b/test/abilities/moody.test.ts index 80879837bce..d1f8aa2e351 100644 --- a/test/abilities/moody.test.ts +++ b/test/abilities/moody.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Moody", () => { it("should increase one stat stage by 2 and decrease a different stat stage by 1", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.toNextTurn(); @@ -52,7 +52,7 @@ describe("Abilities - Moody", () => { it("should only increase one stat stage by 2 if all stat stages are at -6", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // Set all stat stages to -6 vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(-6)); @@ -70,7 +70,7 @@ describe("Abilities - Moody", () => { it("should only decrease one stat stage by 1 stage if all stat stages are at 6", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // Set all stat stages to 6 vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(6)); diff --git a/test/abilities/moxie.test.ts b/test/abilities/moxie.test.ts index 28b90042969..042a8ddd058 100644 --- a/test/abilities/moxie.test.ts +++ b/test/abilities/moxie.test.ts @@ -41,7 +41,7 @@ describe("Abilities - Moxie", () => { const moveToUse = MoveId.AERIAL_ACE; await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.MIGHTYENA]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getStatStage(Stat.ATK)).toBe(0); diff --git a/test/abilities/mummy.test.ts b/test/abilities/mummy.test.ts index e3843f9c112..57105bc3468 100644 --- a/test/abilities/mummy.test.ts +++ b/test/abilities/mummy.test.ts @@ -37,7 +37,7 @@ describe("Abilities - Mummy", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(AbilityId.MUMMY); + expect(game.field.getEnemyPokemon().getAbility().id).toBe(AbilityId.MUMMY); }); it("should not change the enemy's ability hit by a non-contact move", async () => { @@ -47,6 +47,6 @@ describe("Abilities - Mummy", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(AbilityId.BALL_FETCH); + expect(game.field.getEnemyPokemon().getAbility().id).toBe(AbilityId.BALL_FETCH); }); }); diff --git a/test/abilities/mycelium-might.test.ts b/test/abilities/mycelium-might.test.ts index 41da6b5c693..c3b7b4753b6 100644 --- a/test/abilities/mycelium-might.test.ts +++ b/test/abilities/mycelium-might.test.ts @@ -42,12 +42,12 @@ describe("Abilities - Mycelium Might", () => { * https://www.smogon.com/forums/threads/scarlet-violet-battle-mechanics-research.3709545/page-24 */ - it("will move last in its priority bracket and ignore protective abilities", async () => { + it("should move last in its priority bracket and ignore protective abilities", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerIndex = game.scene.getPlayerPokemon()?.getBattlerIndex(); - const enemyIndex = enemyPokemon?.getBattlerIndex(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerIndex = game.field.getPlayerPokemon().getBattlerIndex(); + const enemyIndex = enemyPokemon.getBattlerIndex(); game.move.select(MoveId.BABY_DOLL_EYES); @@ -62,16 +62,16 @@ describe("Abilities - Mycelium Might", () => { await game.phaseInterceptor.to(TurnEndPhase); // Despite the opponent's ability (Clear Body), its ATK stat stage is still reduced. - expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); }); - it("will still go first if a status move that is in a higher priority bracket than the opponent's move is used", async () => { + it("should still go first if a status move that is in a higher priority bracket than the opponent's move is used", async () => { game.override.enemyMoveset(MoveId.TACKLE); await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerIndex = game.scene.getPlayerPokemon()?.getBattlerIndex(); - const enemyIndex = enemyPokemon?.getBattlerIndex(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerIndex = game.field.getPlayerPokemon().getBattlerIndex(); + const enemyIndex = enemyPokemon.getBattlerIndex(); game.move.select(MoveId.BABY_DOLL_EYES); @@ -85,14 +85,14 @@ describe("Abilities - Mycelium Might", () => { expect(commandOrder).toEqual([playerIndex, enemyIndex]); await game.phaseInterceptor.to(TurnEndPhase); // Despite the opponent's ability (Clear Body), its ATK stat stage is still reduced. - expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); }); - it("will not affect non-status moves", async () => { + it("should not affect non-status moves", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); - const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); + const playerIndex = game.field.getPlayerPokemon().getBattlerIndex(); + const enemyIndex = game.field.getEnemyPokemon().getBattlerIndex(); game.move.select(MoveId.QUICK_ATTACK); diff --git a/test/abilities/neutralizing-gas.test.ts b/test/abilities/neutralizing-gas.test.ts index 560b7af72e7..555e5f8a19c 100644 --- a/test/abilities/neutralizing-gas.test.ts +++ b/test/abilities/neutralizing-gas.test.ts @@ -46,7 +46,7 @@ describe("Abilities - Neutralizing Gas", () => { await game.phaseInterceptor.to("TurnEndPhase"); // Intimidate is suppressed, so the attack stat should not be lowered - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(0); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(0); }); it("should allow the user's passive to activate", async () => { @@ -56,7 +56,7 @@ describe("Abilities - Neutralizing Gas", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(1); }); it.todo("should activate before other abilities", async () => { @@ -68,7 +68,7 @@ describe("Abilities - Neutralizing Gas", () => { await game.phaseInterceptor.to("TurnEndPhase"); // Intimidate is suppressed even when the user's speed is lower - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(0); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(0); }); it("should activate other abilities when removed", async () => { @@ -79,15 +79,15 @@ describe("Abilities - Neutralizing Gas", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(0); - expect(enemyPokemon?.getStatStage(Stat.DEF)).toBe(0); + const enemyPokemon = game.field.getEnemyPokemon(); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); // Enemy removes user's ability, so both abilities are activated - expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(1); - expect(enemyPokemon?.getStatStage(Stat.DEF)).toBe(1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1); + expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(1); }); it("should not activate the user's other ability when removed", async () => { @@ -95,13 +95,13 @@ describe("Abilities - Neutralizing Gas", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); // Neutralising gas user's passive is still active - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + const enemyPokemon = game.field.getEnemyPokemon(); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); // Intimidate did not reactivate after neutralizing gas was removed - expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1); + expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1); }); it("should only deactivate when all setters are off the field", async () => { @@ -164,7 +164,7 @@ describe("Abilities - Neutralizing Gas", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); - vi.spyOn(game.scene.getPlayerPokemon()!, "randBattleSeedInt").mockReturnValue(0); + vi.spyOn(game.field.getPlayerPokemon(), "randBattleSeedInt").mockReturnValue(0); vi.spyOn(globalScene, "randBattleSeedInt").mockReturnValue(0); const commandPhase = game.scene.phaseManager.getCurrentPhase() as CommandPhase; @@ -178,7 +178,7 @@ describe("Abilities - Neutralizing Gas", () => { game.override.battleStyle("single").ability(AbilityId.NEUTRALIZING_GAS).enemyAbility(AbilityId.DELTA_STREAM); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); const weatherChangeAttr = enemy.getAbilityAttrs("PostSummonWeatherChangeAbAttr", false)[0]; const weatherChangeSpy = vi.spyOn(weatherChangeAttr, "apply"); @@ -186,7 +186,7 @@ describe("Abilities - Neutralizing Gas", () => { game.move.select(MoveId.SPLASH); await game.killPokemon(enemy); - await game.killPokemon(game.scene.getPlayerPokemon()!); + await game.killPokemon(game.field.getPlayerPokemon()); expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeUndefined(); expect(weatherChangeSpy).not.toHaveBeenCalled(); diff --git a/test/abilities/normal-move-type-change.test.ts b/test/abilities/normal-move-type-change.test.ts index fdf9ef0f9f2..11ea7a2e5f0 100644 --- a/test/abilities/normal-move-type-change.test.ts +++ b/test/abilities/normal-move-type-change.test.ts @@ -58,10 +58,10 @@ describe.each([ it(`should change Normal-type attacks to ${tyName} type and boost their power`, async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const typeSpy = vi.spyOn(playerPokemon, "getMoveType"); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemySpy = vi.spyOn(enemyPokemon, "getMoveEffectiveness"); const powerSpy = vi.spyOn(allMoves[MoveId.TACKLE], "calculateBattlePower"); @@ -103,10 +103,10 @@ describe.each([ await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const tySpy = vi.spyOn(playerPokemon, "getMoveType"); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyEffectivenessSpy = vi.spyOn(enemyPokemon, "getMoveEffectiveness"); enemyPokemon.hp = Math.floor(enemyPokemon.getMaxHp() * 0.8); @@ -137,7 +137,7 @@ describe.each([ await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const tySpy = vi.spyOn(playerPokemon, "getMoveType"); game.move.select(move); @@ -149,10 +149,10 @@ describe.each([ it("should affect all hits of a Normal-type multi-hit move", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const tySpy = vi.spyOn(playerPokemon, "getMoveType"); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.FURY_SWIPES); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -183,7 +183,7 @@ describe.each([ expect(boost, "power boost should be defined").toBeDefined(); const powerSpy = vi.spyOn(testMoveInstance, "calculateBattlePower"); - const typeSpy = vi.spyOn(game.scene.getPlayerPokemon()!, "getMoveType"); + const typeSpy = vi.spyOn(game.field.getPlayerPokemon(), "getMoveType"); game.move.select(MoveId.TACKLE); await game.phaseInterceptor.to("BerryPhase", false); expect(typeSpy, "type was not changed").toHaveLastReturnedWith(ty); diff --git a/test/abilities/oblivious.test.ts b/test/abilities/oblivious.test.ts index 6b9598903c5..02056251992 100644 --- a/test/abilities/oblivious.test.ts +++ b/test/abilities/oblivious.test.ts @@ -39,14 +39,14 @@ describe("Abilities - Oblivious", () => { .moveset(MoveId.SKILL_SWAP) .enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon(); - enemy?.addTag(BattlerTagType.TAUNT); - expect(enemy?.getTag(BattlerTagType.TAUNT)).toBeTruthy(); + const enemy = game.field.getEnemyPokemon(); + enemy.addTag(BattlerTagType.TAUNT); + expect(enemy.getTag(BattlerTagType.TAUNT)).toBeDefined(); game.move.select(MoveId.SKILL_SWAP); await game.phaseInterceptor.to("BerryPhase"); - expect(enemy?.getTag(BattlerTagType.TAUNT)).toBeFalsy(); + expect(enemy.getTag(BattlerTagType.TAUNT)).toBeUndefined(); }); it("should remove infatuation when gained", async () => { @@ -56,14 +56,15 @@ describe("Abilities - Oblivious", () => { .moveset(MoveId.SKILL_SWAP) .enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon(); - vi.spyOn(enemy!, "isOppositeGender").mockReturnValue(true); - enemy?.addTag(BattlerTagType.INFATUATED, 5, MoveId.JUDGMENT, game.scene.getPlayerPokemon()?.id); // sourceID needs to be defined - expect(enemy?.getTag(BattlerTagType.INFATUATED)).toBeTruthy(); + + const enemy = game.field.getEnemyPokemon(); + vi.spyOn(enemy, "isOppositeGender").mockReturnValue(true); + enemy.addTag(BattlerTagType.INFATUATED, 5, MoveId.JUDGMENT, game.field.getPlayerPokemon().id); // sourceID needs to be defined + expect(enemy.getTag(BattlerTagType.INFATUATED)).toBeTruthy(); game.move.select(MoveId.SKILL_SWAP); await game.phaseInterceptor.to("BerryPhase"); - expect(enemy?.getTag(BattlerTagType.INFATUATED)).toBeFalsy(); + expect(enemy.getTag(BattlerTagType.INFATUATED)).toBeFalsy(); }); }); diff --git a/test/abilities/parental-bond.test.ts b/test/abilities/parental-bond.test.ts index 51c15ea32b1..a72fc82260f 100644 --- a/test/abilities/parental-bond.test.ts +++ b/test/abilities/parental-bond.test.ts @@ -42,8 +42,8 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); let enemyStartingHp = enemyPokemon.hp; @@ -66,7 +66,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.POWER_UP_PUNCH); @@ -81,7 +81,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.BABY_DOLL_EYES); @@ -95,7 +95,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.DOUBLE_HIT); await game.move.forceHit(); @@ -110,7 +110,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SELF_DESTRUCT); @@ -124,7 +124,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.ROLLOUT); await game.move.forceHit(); @@ -139,7 +139,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DRAGON_RAGE); await game.phaseInterceptor.to("BerryPhase", false); @@ -152,8 +152,8 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.COUNTER); await game.phaseInterceptor.to("DamageAnimPhase"); @@ -185,7 +185,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.EARTHQUAKE); await game.phaseInterceptor.to("DamageAnimPhase", false); @@ -199,7 +199,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.MIND_BLOWN); @@ -218,8 +218,8 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.BURN_UP); @@ -239,7 +239,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.HYPER_BEAM); await game.move.forceHit(); @@ -259,8 +259,8 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.ANCHOR_SHOT); await game.move.forceHit(); @@ -283,8 +283,8 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SMACK_DOWN); await game.move.forceHit(); @@ -304,7 +304,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.U_TURN); await game.move.forceHit(); @@ -321,8 +321,8 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.WAKE_UP_SLAP); await game.move.forceHit(); @@ -342,7 +342,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.TACKLE); @@ -356,7 +356,7 @@ describe("Abilities - Parental Bond", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.WATER_GUN); @@ -369,7 +369,7 @@ describe("Abilities - Parental Bond", () => { game.override.enemyLevel(1000).moveset(MoveId.FUTURE_SIGHT); await game.classicMode.startBattle([SpeciesId.BULBASAUR, SpeciesId.CHARMANDER, SpeciesId.SQUIRTLE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(enemyPokemon, "damageAndUpdate"); game.move.select(MoveId.FUTURE_SIGHT); diff --git a/test/abilities/perish-body.test.ts b/test/abilities/perish-body.test.ts index 251d29abe36..50ba2f86c39 100644 --- a/test/abilities/perish-body.test.ts +++ b/test/abilities/perish-body.test.ts @@ -34,55 +34,55 @@ describe("Abilities - Perish Song", () => { it("should trigger when hit with damaging move", async () => { await game.classicMode.startBattle(); - const cursola = game.scene.getPlayerPokemon(); - const magikarp = game.scene.getEnemyPokemon(); + const cursola = game.field.getPlayerPokemon(); + const magikarp = game.field.getEnemyPokemon(); game.move.select(MoveId.SPLASH); await game.toNextTurn(); - expect(cursola?.summonData.tags[0].turnCount).toBe(3); - expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + expect(cursola.summonData.tags[0].turnCount).toBe(3); + expect(magikarp.summonData.tags[0].turnCount).toBe(3); }); it("should trigger even when fainting", async () => { game.override.enemyLevel(100).startingLevel(1); await game.classicMode.startBattle([SpeciesId.CURSOLA, SpeciesId.FEEBAS]); - const magikarp = game.scene.getEnemyPokemon(); + const magikarp = game.field.getEnemyPokemon(); game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); await game.toNextTurn(); - expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + expect(magikarp.summonData.tags[0].turnCount).toBe(3); }); it("should not activate if attacker already has perish song", async () => { game.override.enemyMoveset([MoveId.PERISH_SONG, MoveId.AQUA_JET, MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.FEEBAS, SpeciesId.CURSOLA]); - const feebas = game.scene.getPlayerPokemon(); - const magikarp = game.scene.getEnemyPokemon(); + const feebas = game.field.getPlayerPokemon(); + const magikarp = game.field.getEnemyPokemon(); game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.PERISH_SONG); await game.toNextTurn(); - expect(feebas?.summonData.tags[0].turnCount).toBe(3); - expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + expect(feebas.summonData.tags[0].turnCount).toBe(3); + expect(magikarp.summonData.tags[0].turnCount).toBe(3); game.doSwitchPokemon(1); await game.move.selectEnemyMove(MoveId.SPLASH); await game.toNextTurn(); - const cursola = game.scene.getPlayerPokemon(); - expect(cursola?.summonData.tags.length).toBe(0); - expect(magikarp?.summonData.tags[0].turnCount).toBe(2); + const cursola = game.field.getPlayerPokemon(); + expect(cursola.summonData.tags.length).toBe(0); + expect(magikarp.summonData.tags[0].turnCount).toBe(2); game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.AQUA_JET); await game.toNextTurn(); - expect(cursola?.summonData.tags.length).toBe(0); - expect(magikarp?.summonData.tags[0].turnCount).toBe(1); + expect(cursola.summonData.tags.length).toBe(0); + expect(magikarp.summonData.tags[0].turnCount).toBe(1); }); it("should activate if cursola already has perish song, but not reset its counter", async () => { @@ -91,22 +91,22 @@ describe("Abilities - Perish Song", () => { .moveset([MoveId.WHIRLWIND, MoveId.SPLASH]) .startingWave(5); await game.classicMode.startBattle([SpeciesId.CURSOLA]); - const cursola = game.scene.getPlayerPokemon(); + const cursola = game.field.getPlayerPokemon(); game.move.select(MoveId.WHIRLWIND); await game.move.selectEnemyMove(MoveId.PERISH_SONG); await game.toNextTurn(); - const magikarp = game.scene.getEnemyPokemon(); - expect(cursola?.summonData.tags[0].turnCount).toBe(3); - expect(magikarp?.summonData.tags.length).toBe(0); + const magikarp = game.field.getEnemyPokemon(); + expect(cursola.summonData.tags[0].turnCount).toBe(3); + expect(magikarp.summonData.tags.length).toBe(0); game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.AQUA_JET); await game.toNextTurn(); - expect(cursola?.summonData.tags[0].turnCount).toBe(2); - expect(magikarp?.summonData.tags.length).toBe(1); - expect(magikarp?.summonData.tags[0].turnCount).toBe(3); + expect(cursola.summonData.tags[0].turnCount).toBe(2); + expect(magikarp.summonData.tags.length).toBe(1); + expect(magikarp.summonData.tags[0].turnCount).toBe(3); }); }); diff --git a/test/abilities/protosynthesis.test.ts b/test/abilities/protosynthesis.test.ts index f4461a562ea..ea2e1e20c17 100644 --- a/test/abilities/protosynthesis.test.ts +++ b/test/abilities/protosynthesis.test.ts @@ -42,10 +42,10 @@ describe("Abilities - Protosynthesis", () => { .startingLevel(100) .enemyLevel(100); await game.classicMode.startBattle([SpeciesId.MEW]); - const mew = game.scene.getPlayerPokemon()!; + const mew = game.field.getPlayerPokemon(); // Nature of starting mon is randomized. We need to fix it to a neutral nature for the automated test. mew.setNature(Nature.HARDY); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); const def_before_boost = mew.getEffectiveStat( Stat.DEF, undefined, diff --git a/test/abilities/quick-draw.test.ts b/test/abilities/quick-draw.test.ts index d3914e24268..ce5873af3a8 100644 --- a/test/abilities/quick-draw.test.ts +++ b/test/abilities/quick-draw.test.ts @@ -43,8 +43,8 @@ describe("Abilities - Quick Draw", () => { test("makes pokemon going first in its priority bracket", async () => { await game.classicMode.startBattle(); - const pokemon = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pokemon = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); pokemon.hp = 1; enemy.hp = 1; @@ -65,8 +65,8 @@ describe("Abilities - Quick Draw", () => { async () => { await game.classicMode.startBattle(); - const pokemon = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pokemon = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); pokemon.hp = 1; enemy.hp = 1; @@ -85,8 +85,8 @@ describe("Abilities - Quick Draw", () => { await game.classicMode.startBattle(); - const pokemon = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pokemon = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); pokemon.hp = 1; enemy.hp = 1; diff --git a/test/abilities/sap-sipper.test.ts b/test/abilities/sap-sipper.test.ts index a1c034ab126..95f9841d924 100644 --- a/test/abilities/sap-sipper.test.ts +++ b/test/abilities/sap-sipper.test.ts @@ -45,7 +45,7 @@ describe("Abilities - Sap Sipper", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const initialEnemyHp = enemyPokemon.hp; game.move.select(moveToUse); @@ -63,7 +63,7 @@ describe("Abilities - Sap Sipper", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(moveToUse); @@ -86,7 +86,7 @@ describe("Abilities - Sap Sipper", () => { expect(game.scene.arena.terrain).toBeDefined(); expect(game.scene.arena.terrain!.terrainType).toBe(TerrainType.GRASSY); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(0); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(0); }); it("activate once against multi-hit grass attacks", async () => { @@ -96,7 +96,7 @@ describe("Abilities - Sap Sipper", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const initialEnemyHp = enemyPokemon.hp; game.move.select(moveToUse); @@ -114,7 +114,7 @@ describe("Abilities - Sap Sipper", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(moveToUse); @@ -140,7 +140,7 @@ describe("Abilities - Sap Sipper", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const initialEnemyHp = enemyPokemon.hp; game.move.select(moveToUse); @@ -156,7 +156,7 @@ describe("Abilities - Sap Sipper", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.LEAF_BLADE); await game.phaseInterceptor.to("MoveEffectPhase"); diff --git a/test/abilities/shield-dust.test.ts b/test/abilities/shield-dust.test.ts index 025b415dbc0..a34056e00e9 100644 --- a/test/abilities/shield-dust.test.ts +++ b/test/abilities/shield-dust.test.ts @@ -38,8 +38,8 @@ describe("Abilities - Shield Dust", () => { it("Shield Dust", async () => { await game.classicMode.startBattle([SpeciesId.PIDGEOT]); - game.scene.getEnemyPokemon()!.stats[Stat.SPDEF] = 10000; - expect(game.scene.getPlayerPokemon()!.formIndex).toBe(0); + game.field.getEnemyPokemon().stats[Stat.SPDEF] = 10000; + expect(game.field.getPlayerPokemon().formIndex).toBe(0); game.move.select(MoveId.AIR_SLASH); diff --git a/test/abilities/shields-down.test.ts b/test/abilities/shields-down.test.ts index 0323a4afbec..98a1cfffa8e 100644 --- a/test/abilities/shields-down.test.ts +++ b/test/abilities/shields-down.test.ts @@ -66,7 +66,7 @@ describe("Abilities - SHIELDS DOWN", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + expect(game.field.getPlayerPokemon().status).toBe(undefined); }); test("should still ignore non-volatile status moves used by a pokemon with mold breaker", async () => { @@ -78,7 +78,7 @@ describe("Abilities - SHIELDS DOWN", () => { await game.move.selectEnemyMove(MoveId.SPORE); await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + expect(game.field.getPlayerPokemon().status).toBe(undefined); }); test("should ignore non-volatile secondary status effects", async () => { @@ -89,7 +89,7 @@ describe("Abilities - SHIELDS DOWN", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + expect(game.field.getPlayerPokemon().status).toBe(undefined); }); test("should ignore status moves even through mold breaker", async () => { @@ -101,7 +101,7 @@ describe("Abilities - SHIELDS DOWN", () => { await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.status).toBe(undefined); + expect(game.field.getPlayerPokemon().status).toBe(undefined); }); // toxic spikes currently does not poison flying types when gravity is in effect @@ -122,9 +122,9 @@ describe("Abilities - SHIELDS DOWN", () => { await game.move.selectEnemyMove(MoveId.SPLASH); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(SpeciesId.MINIOR); - expect(game.scene.getPlayerPokemon()!.species.formIndex).toBe(0); - expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.POISON); + expect(game.field.getPlayerPokemon().species.speciesId).toBe(SpeciesId.MINIOR); + expect(game.field.getPlayerPokemon().species.formIndex).toBe(0); + expect(game.field.getPlayerPokemon().status?.effect).toBe(StatusEffect.POISON); }); test("should ignore yawn", async () => { @@ -136,7 +136,7 @@ describe("Abilities - SHIELDS DOWN", () => { await game.move.selectEnemyMove(MoveId.YAWN); await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.findTag(tag => tag.tagType === BattlerTagType.DROWSY)).toBe(undefined); + expect(game.field.getPlayerPokemon().findTag(tag => tag.tagType === BattlerTagType.DROWSY)).toBe(undefined); }); test("should not ignore volatile status effects", async () => { @@ -149,7 +149,7 @@ describe("Abilities - SHIELDS DOWN", () => { await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getPlayerPokemon()!.findTag(tag => tag.tagType === BattlerTagType.CONFUSED)).not.toBe(undefined); + expect(game.field.getPlayerPokemon().findTag(tag => tag.tagType === BattlerTagType.CONFUSED)).not.toBe(undefined); }); // the `NoTransformAbilityAbAttr` attribute is not checked anywhere, so this test cannot pass. @@ -162,7 +162,7 @@ describe("Abilities - SHIELDS DOWN", () => { await game.move.selectEnemyMove(MoveId.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + expect(game.field.getEnemyPokemon().status?.effect).toBe(StatusEffect.SLEEP); }); test("should not prevent minior from receiving the fainted status effect in trainer battles", async () => { @@ -173,7 +173,7 @@ describe("Abilities - SHIELDS DOWN", () => { .startingWave(5) .enemySpecies(SpeciesId.MINIOR); await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const minior = game.scene.getEnemyPokemon()!; + const minior = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDERBOLT); await game.toNextTurn(); diff --git a/test/abilities/simple.test.ts b/test/abilities/simple.test.ts index 39f1b579a19..fe065e37cfe 100644 --- a/test/abilities/simple.test.ts +++ b/test/abilities/simple.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Simple", () => { it("should double stat changes when applied", async () => { await game.classicMode.startBattle([SpeciesId.SLOWBRO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-2); }); diff --git a/test/abilities/speed-boost.test.ts b/test/abilities/speed-boost.test.ts index ff0beaf74a0..b087be29460 100644 --- a/test/abilities/speed-boost.test.ts +++ b/test/abilities/speed-boost.test.ts @@ -40,7 +40,7 @@ describe("Abilities - Speed Boost", () => { it("should increase speed by 1 stage at end of turn", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.toNextTurn(); @@ -53,7 +53,7 @@ describe("Abilities - Speed Boost", () => { game.move.select(MoveId.U_TURN); game.doSelectPartyPokemon(1); await game.toNextTurn(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); game.move.select(MoveId.SPLASH); @@ -69,13 +69,13 @@ describe("Abilities - Speed Boost", () => { game.move.select(MoveId.U_TURN); game.doSelectPartyPokemon(1); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!).toBe(ninjask); + expect(game.field.getPlayerPokemon()).toBe(ninjask); expect(ninjask.getStatStage(Stat.SPD)).toBe(0); game.move.select(MoveId.U_TURN); game.doSelectPartyPokemon(1); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!).toBe(shuckle); + expect(game.field.getPlayerPokemon()).toBe(shuckle); expect(shuckle.getStatStage(Stat.SPD)).toBe(0); game.move.select(MoveId.SPLASH); @@ -88,7 +88,7 @@ describe("Abilities - Speed Boost", () => { game.doSwitchPokemon(1); await game.toNextTurn(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); game.move.select(MoveId.SPLASH); @@ -109,7 +109,7 @@ describe("Abilities - Speed Boost", () => { await game.phaseInterceptor.to(AttemptRunPhase); await game.toNextTurn(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); game.move.select(MoveId.SPLASH); diff --git a/test/abilities/stall.test.ts b/test/abilities/stall.test.ts index 71796d376a3..5b4e38f7099 100644 --- a/test/abilities/stall.test.ts +++ b/test/abilities/stall.test.ts @@ -40,8 +40,8 @@ describe("Abilities - Stall", () => { it("Pokemon with Stall should move last in its priority bracket regardless of speed", async () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); - const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); + const playerIndex = game.field.getPlayerPokemon().getBattlerIndex(); + const enemyIndex = game.field.getEnemyPokemon().getBattlerIndex(); game.move.select(MoveId.QUICK_ATTACK); @@ -58,8 +58,8 @@ describe("Abilities - Stall", () => { it("Pokemon with Stall will go first if a move that is in a higher priority bracket than the opponent's move is used", async () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); - const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); + const playerIndex = game.field.getPlayerPokemon().getBattlerIndex(); + const enemyIndex = game.field.getEnemyPokemon().getBattlerIndex(); game.move.select(MoveId.TACKLE); @@ -77,8 +77,8 @@ describe("Abilities - Stall", () => { game.override.ability(AbilityId.STALL); await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex(); - const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex(); + const playerIndex = game.field.getPlayerPokemon().getBattlerIndex(); + const enemyIndex = game.field.getEnemyPokemon().getBattlerIndex(); game.move.select(MoveId.TACKLE); diff --git a/test/abilities/steely-spirit.test.ts b/test/abilities/steely-spirit.test.ts index 072566fdb96..5fbb11a4bfd 100644 --- a/test/abilities/steely-spirit.test.ts +++ b/test/abilities/steely-spirit.test.ts @@ -39,7 +39,7 @@ describe("Abilities - Steely Spirit", () => { it("increases Steel-type moves' power used by the user and its allies by 50%", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU, SpeciesId.SHUCKLE]); const boostSource = game.scene.getPlayerField()[1]; - const enemyToCheck = game.scene.getEnemyPokemon()!; + const enemyToCheck = game.field.getEnemyPokemon(); vi.spyOn(boostSource, "getAbility").mockReturnValue(allAbilities[AbilityId.STEELY_SPIRIT]); @@ -54,7 +54,7 @@ describe("Abilities - Steely Spirit", () => { it("stacks if multiple users with this ability are on the field.", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU, SpeciesId.PIKACHU]); - const enemyToCheck = game.scene.getEnemyPokemon()!; + const enemyToCheck = game.field.getEnemyPokemon(); game.scene.getPlayerField().forEach(p => { vi.spyOn(p, "getAbility").mockReturnValue(allAbilities[AbilityId.STEELY_SPIRIT]); @@ -74,7 +74,7 @@ describe("Abilities - Steely Spirit", () => { it("does not take effect when suppressed", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU, SpeciesId.SHUCKLE]); const boostSource = game.scene.getPlayerField()[1]; - const enemyToCheck = game.scene.getEnemyPokemon()!; + const enemyToCheck = game.field.getEnemyPokemon(); vi.spyOn(boostSource, "getAbility").mockReturnValue(allAbilities[AbilityId.STEELY_SPIRIT]); expect(boostSource.hasAbility(AbilityId.STEELY_SPIRIT)).toBe(true); diff --git a/test/abilities/super-luck.test.ts b/test/abilities/super-luck.test.ts index a0f5293b036..fd6e3d75f76 100644 --- a/test/abilities/super-luck.test.ts +++ b/test/abilities/super-luck.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Super Luck", () => { it("should increase the user's crit stage by 1", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); const critSpy = vi.spyOn(enemy, "getCritStage"); // crit stage is called on enemy game.move.select(MoveId.TACKLE); diff --git a/test/abilities/synchronize.test.ts b/test/abilities/synchronize.test.ts index c95ae1b7828..048f9663db9 100644 --- a/test/abilities/synchronize.test.ts +++ b/test/abilities/synchronize.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Synchronize", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + expect(game.field.getPlayerPokemon().status).toBeUndefined(); expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase"); }); @@ -48,8 +48,8 @@ describe("Abilities - Synchronize", () => { game.move.select(MoveId.THUNDER_WAVE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.PARALYSIS); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.PARALYSIS); + expect(game.field.getPlayerPokemon().status?.effect).toBe(StatusEffect.PARALYSIS); + expect(game.field.getEnemyPokemon().status?.effect).toBe(StatusEffect.PARALYSIS); expect(game.phaseInterceptor.log).toContain("ShowAbilityPhase"); }); @@ -60,8 +60,8 @@ describe("Abilities - Synchronize", () => { await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status?.effect).toBeUndefined(); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + expect(game.field.getPlayerPokemon().status?.effect).toBeUndefined(); + expect(game.field.getEnemyPokemon().status?.effect).toBe(StatusEffect.SLEEP); expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase"); }); @@ -76,8 +76,8 @@ describe("Abilities - Synchronize", () => { game.doSwitchPokemon(1); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.POISON); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBeUndefined(); + expect(game.field.getPlayerPokemon().status?.effect).toBe(StatusEffect.POISON); + expect(game.field.getEnemyPokemon().status?.effect).toBeUndefined(); expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase"); }); @@ -87,8 +87,8 @@ describe("Abilities - Synchronize", () => { game.move.select(MoveId.THUNDER_WAVE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status?.effect).toBeUndefined(); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.PARALYSIS); + expect(game.field.getPlayerPokemon().status?.effect).toBeUndefined(); + expect(game.field.getEnemyPokemon().status?.effect).toBe(StatusEffect.PARALYSIS); expect(game.phaseInterceptor.log).toContain("ShowAbilityPhase"); }); }); diff --git a/test/abilities/tera-shell.test.ts b/test/abilities/tera-shell.test.ts index 385fabe1a54..4183cd4d0a6 100644 --- a/test/abilities/tera-shell.test.ts +++ b/test/abilities/tera-shell.test.ts @@ -36,7 +36,7 @@ describe("Abilities - Tera Shell", () => { it("should change the effectiveness of non-resisted attacks when the source is at full HP", async () => { await game.classicMode.startBattle([SpeciesId.SNORLAX]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); vi.spyOn(playerPokemon, "getMoveEffectiveness"); game.move.select(MoveId.SPLASH); @@ -57,7 +57,7 @@ describe("Abilities - Tera Shell", () => { await game.classicMode.startBattle([SpeciesId.SNORLAX]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); vi.spyOn(playerPokemon, "getMoveEffectiveness"); game.move.select(MoveId.SPLASH); @@ -71,7 +71,7 @@ describe("Abilities - Tera Shell", () => { await game.classicMode.startBattle([SpeciesId.AGGRON]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); vi.spyOn(playerPokemon, "getMoveEffectiveness"); game.move.select(MoveId.SPLASH); @@ -85,7 +85,7 @@ describe("Abilities - Tera Shell", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const spy = vi.spyOn(playerPokemon, "getMoveEffectiveness"); game.move.select(MoveId.SPLASH); @@ -100,7 +100,7 @@ describe("Abilities - Tera Shell", () => { await game.classicMode.startBattle([SpeciesId.SNORLAX]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const spy = vi.spyOn(playerPokemon, "getMoveEffectiveness"); game.move.select(MoveId.SPLASH); diff --git a/test/abilities/trace.test.ts b/test/abilities/trace.test.ts index 4211234a451..3a4809a4e7e 100644 --- a/test/abilities/trace.test.ts +++ b/test/abilities/trace.test.ts @@ -38,7 +38,7 @@ describe("Abilities - Trace", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(AbilityId.BALL_FETCH); + expect(game.field.getPlayerPokemon().getAbility().id).toBe(AbilityId.BALL_FETCH); }); it("should activate a copied post-summon ability", async () => { @@ -48,6 +48,6 @@ describe("Abilities - Trace", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); }); diff --git a/test/abilities/unburden.test.ts b/test/abilities/unburden.test.ts index 686a6c20904..c10dd404ab9 100644 --- a/test/abilities/unburden.test.ts +++ b/test/abilities/unburden.test.ts @@ -64,7 +64,7 @@ describe("Abilities - Unburden", () => { game.override.enemyMoveset(MoveId.FALSE_SWIPE); await game.classicMode.startBattle([SpeciesId.TREECKO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerHeldItems = getHeldItemCount(playerPokemon); const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); @@ -80,7 +80,7 @@ describe("Abilities - Unburden", () => { game.override.enemyMoveset(MoveId.FALSE_SWIPE).startingModifier([{ name: "BERRY_POUCH", count: 5850 }]); await game.classicMode.startBattle([SpeciesId.TREECKO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerHeldItems = getHeldItemCount(playerPokemon); const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); @@ -95,9 +95,9 @@ describe("Abilities - Unburden", () => { it("should activate for the target, and not the stealer, when a berry is stolen", async () => { await game.classicMode.startBattle([SpeciesId.TREECKO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyHeldItemCt = getHeldItemCount(enemyPokemon); const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); @@ -113,7 +113,7 @@ describe("Abilities - Unburden", () => { it("should activate when an item is knocked off", async () => { await game.classicMode.startBattle([SpeciesId.TREECKO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyHeldItemCt = getHeldItemCount(enemyPokemon); const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); @@ -129,7 +129,7 @@ describe("Abilities - Unburden", () => { game.override.ability(AbilityId.MAGICIAN).startingHeldItems([]); // Remove player's full stacks of held items so it can steal opponent's held items await game.classicMode.startBattle([SpeciesId.TREECKO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyHeldItemCt = getHeldItemCount(enemyPokemon); const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); @@ -145,7 +145,7 @@ describe("Abilities - Unburden", () => { game.override.enemyAbility(AbilityId.PICKPOCKET).enemyHeldItems([]); // Remove opponent's full stacks of held items so it can steal player's held items await game.classicMode.startBattle([SpeciesId.TREECKO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerHeldItems = getHeldItemCount(playerPokemon); const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); @@ -161,7 +161,7 @@ describe("Abilities - Unburden", () => { game.override.moveset(MoveId.THIEF).startingHeldItems([]); // Remove player's full stacks of held items so it can steal opponent's held items await game.classicMode.startBattle([SpeciesId.TREECKO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyHeldItemCt = getHeldItemCount(enemyPokemon); const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); @@ -177,11 +177,11 @@ describe("Abilities - Unburden", () => { game.override.startingHeldItems([{ name: "GRIP_CLAW", count: 1 }]); await game.classicMode.startBattle([SpeciesId.TREECKO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const gripClaw = playerPokemon.getHeldItems()[0] as ContactHeldItemTransferChanceModifier; vi.spyOn(gripClaw, "chance", "get").mockReturnValue(100); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyHeldItemCt = getHeldItemCount(enemyPokemon); const initialEnemySpeed = enemyPokemon.getStat(Stat.SPD); @@ -197,7 +197,7 @@ describe("Abilities - Unburden", () => { game.override.enemyAbility(AbilityId.NEUTRALIZING_GAS).enemyMoveset(MoveId.FALSE_SWIPE); await game.classicMode.startBattle([SpeciesId.TREECKO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerHeldItems = getHeldItemCount(playerPokemon); const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); @@ -214,7 +214,7 @@ describe("Abilities - Unburden", () => { game.override.moveset(MoveId.STUFF_CHEEKS); await game.classicMode.startBattle([SpeciesId.TREECKO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerHeldItemCt = getHeldItemCount(playerPokemon); const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); @@ -292,7 +292,7 @@ describe("Abilities - Unburden", () => { game.override.enemyMoveset([MoveId.FALSE_SWIPE, MoveId.WORRY_SEED]); await game.classicMode.startBattle([SpeciesId.PURRLOIN]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerHeldItems = getHeldItemCount(playerPokemon); const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); @@ -317,7 +317,7 @@ describe("Abilities - Unburden", () => { game.override.startingHeldItems([{ name: "REVIVER_SEED" }]).enemyMoveset([MoveId.WING_ATTACK]); await game.classicMode.startBattle([SpeciesId.TREECKO]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerHeldItems = getHeldItemCount(playerPokemon); const initialPlayerSpeed = playerPokemon.getStat(Stat.SPD); @@ -334,7 +334,7 @@ describe("Abilities - Unburden", () => { game.override.enemyMoveset([MoveId.SPLASH, MoveId.THIEF]); await game.classicMode.startBattle([SpeciesId.TREECKO, SpeciesId.FEEBAS]); - const treecko = game.scene.getPlayerPokemon()!; + const treecko = game.field.getPlayerPokemon(); const treeckoInitialHeldItems = getHeldItemCount(treecko); const initialSpeed = treecko.getStat(Stat.SPD); @@ -348,7 +348,7 @@ describe("Abilities - Unburden", () => { await game.move.selectEnemyMove(MoveId.SPLASH); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!).toBe(treecko); + expect(game.field.getPlayerPokemon()).toBe(treecko); expect(getHeldItemCount(treecko)).toBeLessThan(treeckoInitialHeldItems); expect(treecko.getEffectiveStat(Stat.SPD)).toBe(initialSpeed); }); diff --git a/test/abilities/unseen-fist.test.ts b/test/abilities/unseen-fist.test.ts index 01b573fe66c..3c0fa3f8c60 100644 --- a/test/abilities/unseen-fist.test.ts +++ b/test/abilities/unseen-fist.test.ts @@ -55,7 +55,7 @@ describe("Abilities - Unseen Fist", () => { await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, enemyPokemon.id); game.move.select(MoveId.TACKLE); @@ -77,10 +77,10 @@ async function testUnseenFistHitResult( await game.classicMode.startBattle(); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); expect(leadPokemon).not.toBe(undefined); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon).not.toBe(undefined); const enemyStartingHp = enemyPokemon.hp; diff --git a/test/abilities/volt-absorb.test.ts b/test/abilities/volt-absorb.test.ts index 921d56f075b..9ba76028703 100644 --- a/test/abilities/volt-absorb.test.ts +++ b/test/abilities/volt-absorb.test.ts @@ -42,7 +42,7 @@ describe("Abilities - Volt Absorb", () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(moveToUse); @@ -62,7 +62,7 @@ describe("Abilities - Volt Absorb", () => { await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDERBOLT); enemyPokemon.hp = enemyPokemon.hp - 1; @@ -83,7 +83,7 @@ describe("Abilities - Volt Absorb", () => { await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDERBOLT); enemyPokemon.hp = enemyPokemon.hp - 1; diff --git a/test/abilities/wandering-spirit.test.ts b/test/abilities/wandering-spirit.test.ts index 63c2550b198..44e2cd61236 100644 --- a/test/abilities/wandering-spirit.test.ts +++ b/test/abilities/wandering-spirit.test.ts @@ -38,8 +38,8 @@ describe("Abilities - Wandering Spirit", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(AbilityId.BALL_FETCH); - expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(AbilityId.WANDERING_SPIRIT); + expect(game.field.getPlayerPokemon().getAbility().id).toBe(AbilityId.BALL_FETCH); + expect(game.field.getEnemyPokemon().getAbility().id).toBe(AbilityId.WANDERING_SPIRIT); }); it("should not exchange abilities when hit with a non-contact move", async () => { @@ -49,8 +49,8 @@ describe("Abilities - Wandering Spirit", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(AbilityId.WANDERING_SPIRIT); - expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(AbilityId.BALL_FETCH); + expect(game.field.getPlayerPokemon().getAbility().id).toBe(AbilityId.WANDERING_SPIRIT); + expect(game.field.getEnemyPokemon().getAbility().id).toBe(AbilityId.BALL_FETCH); }); it("should activate post-summon abilities", async () => { @@ -60,6 +60,6 @@ describe("Abilities - Wandering Spirit", () => { game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); }); diff --git a/test/abilities/wimp-out.test.ts b/test/abilities/wimp-out.test.ts index a1c19a12fd4..1e129f34a19 100644 --- a/test/abilities/wimp-out.test.ts +++ b/test/abilities/wimp-out.test.ts @@ -70,7 +70,7 @@ describe("Abilities - Wimp Out", () => { game.override.passiveAbility(AbilityId.REGENERATOR).startingLevel(5).enemyLevel(100); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - const wimpod = game.scene.getPlayerPokemon()!; + const wimpod = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -84,7 +84,7 @@ describe("Abilities - Wimp Out", () => { game.override.enemyAbility(AbilityId.WIMP_OUT); await game.classicMode.startBattle([SpeciesId.GOLISOPOD, SpeciesId.TYRUNT]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); enemyPokemon.hp *= 0.52; game.move.select(MoveId.FALSE_SWIPE); @@ -97,7 +97,7 @@ describe("Abilities - Wimp Out", () => { it("Does not trigger when HP already below half", async () => { await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - const wimpod = game.scene.getPlayerPokemon()!; + const wimpod = game.field.getPlayerPokemon(); wimpod.hp = 5; game.move.select(MoveId.SPLASH); @@ -117,7 +117,7 @@ describe("Abilities - Wimp Out", () => { await game.phaseInterceptor.to("TurnEndPhase"); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()!.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(game.field.getPlayerPokemon().getTag(BattlerTagType.TRAPPED)).toBeUndefined(); expect(game.scene.getPlayerParty()[1].getTag(BattlerTagType.TRAPPED)).toBeUndefined(); confirmSwitch(); }); @@ -130,7 +130,7 @@ describe("Abilities - Wimp Out", () => { game.doSelectPartyPokemon(1); await game.phaseInterceptor.to("TurnEndPhase"); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const hasFled = enemyPokemon.switchOutStatus; expect(hasFled).toBe(false); confirmSwitch(); @@ -139,17 +139,17 @@ describe("Abilities - Wimp Out", () => { it("If this Ability does not activate due to being hit by U-turn or Volt Switch, the user of that move will be switched out.", async () => { game.override.startingLevel(190).startingWave(8).enemyMoveset([MoveId.U_TURN]); await game.classicMode.startBattle([SpeciesId.GOLISOPOD, SpeciesId.TYRUNT]); - const RIVAL_NINJASK1 = game.scene.getEnemyPokemon()?.id; + const RIVAL_NINJASK1 = game.field.getEnemyPokemon().id; game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase", false); - expect(game.scene.getEnemyPokemon()?.id !== RIVAL_NINJASK1); + expect(game.field.getEnemyPokemon().id !== RIVAL_NINJASK1); }); it("Dragon Tail and Circle Throw switch out Pokémon before the Ability activates.", async () => { game.override.startingLevel(69).enemyMoveset([MoveId.DRAGON_TAIL]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - const wimpod = game.scene.getPlayerPokemon()!; + const wimpod = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -159,7 +159,7 @@ describe("Abilities - Wimp Out", () => { await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()!.species.speciesId).not.toBe(SpeciesId.WIMPOD); + expect(game.field.getPlayerPokemon().species.speciesId).not.toBe(SpeciesId.WIMPOD); }); it("triggers when recoil damage is taken", async () => { @@ -177,7 +177,7 @@ describe("Abilities - Wimp Out", () => { game.override.moveset([MoveId.SUBSTITUTE]).enemyMoveset([MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - const wimpod = game.scene.getPlayerPokemon()!; + const wimpod = game.field.getPlayerPokemon(); wimpod.hp *= 0.52; game.move.select(MoveId.SUBSTITUTE); @@ -208,7 +208,7 @@ describe("Abilities - Wimp Out", () => { .startingHeldItems([{ name: "SHELL_BELL", count: 4 }]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - const wimpod = game.scene.getPlayerPokemon()!; + const wimpod = game.field.getPlayerPokemon(); wimpod.damageAndUpdate(toDmgValue(wimpod.getMaxHp() * 0.4)); @@ -219,7 +219,7 @@ describe("Abilities - Wimp Out", () => { expect(game.scene.getPlayerParty()[1]).toBe(wimpod); expect(wimpod.hp).toBeGreaterThan(toDmgValue(wimpod.getMaxHp() / 2)); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(SpeciesId.TYRUNT); + expect(game.field.getPlayerPokemon().species.speciesId).toBe(SpeciesId.TYRUNT); }, ); @@ -227,7 +227,7 @@ describe("Abilities - Wimp Out", () => { game.override.weather(WeatherType.HAIL).enemyMoveset([MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.51; + game.field.getPlayerPokemon().hp *= 0.51; game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -240,7 +240,7 @@ describe("Abilities - Wimp Out", () => { game.override.enemyAbility(AbilityId.SHEER_FORCE).enemyMoveset(MoveId.SLUDGE_BOMB).startingLevel(95); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.51; + game.field.getPlayerPokemon().hp *= 0.51; game.move.select(MoveId.ENDURE); await game.phaseInterceptor.to("TurnEndPhase"); @@ -252,7 +252,7 @@ describe("Abilities - Wimp Out", () => { game.override.statusEffect(StatusEffect.POISON).enemyMoveset([MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.51; + game.field.getPlayerPokemon().hp *= 0.51; game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -265,7 +265,7 @@ describe("Abilities - Wimp Out", () => { game.override.statusEffect(StatusEffect.SLEEP).enemyAbility(AbilityId.BAD_DREAMS); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.52; + game.field.getPlayerPokemon().hp *= 0.52; game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -277,7 +277,7 @@ describe("Abilities - Wimp Out", () => { it("Wimp Out will activate due to leech seed", async () => { game.override.enemyMoveset([MoveId.LEECH_SEED]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.52; + game.field.getPlayerPokemon().hp *= 0.52; game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -289,7 +289,7 @@ describe("Abilities - Wimp Out", () => { it("Wimp Out will activate due to curse damage", async () => { game.override.enemySpecies(SpeciesId.DUSKNOIR).enemyMoveset([MoveId.CURSE]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.52; + game.field.getPlayerPokemon().hp *= 0.52; game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -301,7 +301,7 @@ describe("Abilities - Wimp Out", () => { it("Wimp Out will activate due to salt cure damage", async () => { game.override.enemySpecies(SpeciesId.NACLI).enemyMoveset([MoveId.SALT_CURE]).enemyLevel(1); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.7; + game.field.getPlayerPokemon().hp *= 0.7; game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -313,7 +313,7 @@ describe("Abilities - Wimp Out", () => { it("Wimp Out will activate due to damaging trap damage", async () => { game.override.enemySpecies(SpeciesId.MAGIKARP).enemyMoveset([MoveId.WHIRLPOOL]).enemyLevel(1); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.55; + game.field.getPlayerPokemon().hp *= 0.55; game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -331,14 +331,14 @@ describe("Abilities - Wimp Out", () => { .weather(WeatherType.HAIL) .statusEffect(StatusEffect.POISON); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.51; + game.field.getPlayerPokemon().hp *= 0.51; game.move.select(MoveId.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); expect(game.scene.getPlayerParty()[0].getHpRatio()).toEqual(0.51); expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(SpeciesId.WIMPOD); + expect(game.field.getPlayerPokemon().species.speciesId).toBe(SpeciesId.WIMPOD); }); it("Wimp Out activating should not cancel a double battle", async () => { @@ -369,7 +369,7 @@ describe("Abilities - Wimp Out", () => { .enemyMoveset([MoveId.SPLASH]) .enemyLevel(1); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.51; + game.field.getPlayerPokemon().hp *= 0.51; game.move.select(MoveId.THUNDER_PUNCH); game.doSelectPartyPokemon(1); @@ -391,7 +391,7 @@ describe("Abilities - Wimp Out", () => { it("Wimp Out will activate due to Nightmare", async () => { game.override.enemyMoveset([MoveId.NIGHTMARE]).statusEffect(StatusEffect.SLEEP); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.65; + game.field.getPlayerPokemon().hp *= 0.65; game.move.select(MoveId.SPLASH); game.doSelectPartyPokemon(1); @@ -417,13 +417,13 @@ describe("Abilities - Wimp Out", () => { game.override.enemyMoveset(MoveId.BULLET_SEED).enemyAbility(AbilityId.SKILL_LINK); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.51; + game.field.getPlayerPokemon().hp *= 0.51; game.move.select(MoveId.ENDURE); game.doSelectPartyPokemon(1); await game.phaseInterceptor.to("TurnEndPhase"); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.turnData.hitsLeft).toBe(0); expect(enemyPokemon.turnData.hitCount).toBe(5); confirmSwitch(); @@ -433,13 +433,13 @@ describe("Abilities - Wimp Out", () => { game.override.enemyMoveset(MoveId.TACKLE).enemyHeldItems([{ name: "MULTI_LENS", count: 1 }]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.51; + game.field.getPlayerPokemon().hp *= 0.51; game.move.select(MoveId.ENDURE); game.doSelectPartyPokemon(1); await game.phaseInterceptor.to("TurnEndPhase"); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.turnData.hitsLeft).toBe(0); expect(enemyPokemon.turnData.hitCount).toBe(2); confirmSwitch(); @@ -448,13 +448,13 @@ describe("Abilities - Wimp Out", () => { game.override.enemyMoveset(MoveId.TACKLE).enemyAbility(AbilityId.PARENTAL_BOND); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - game.scene.getPlayerPokemon()!.hp *= 0.51; + game.field.getPlayerPokemon().hp *= 0.51; game.move.select(MoveId.ENDURE); game.doSelectPartyPokemon(1); await game.phaseInterceptor.to("TurnEndPhase"); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.turnData.hitsLeft).toBe(0); expect(enemyPokemon.turnData.hitCount).toBe(2); confirmSwitch(); @@ -466,7 +466,7 @@ describe("Abilities - Wimp Out", () => { async () => { game.override.moveset([MoveId.SWORDS_DANCE]).enemyMoveset([MoveId.SWAGGER]); await game.classicMode.startBattle([SpeciesId.WIMPOD, SpeciesId.TYRUNT]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.hp *= 0.51; playerPokemon.setStatStage(Stat.ATK, 6); playerPokemon.addTag(BattlerTagType.CONFUSED); @@ -486,7 +486,7 @@ describe("Abilities - Wimp Out", () => { game.override.enemyAbility(AbilityId.WIMP_OUT).startingLevel(5850).startingWave(10); await game.classicMode.startBattle([SpeciesId.GOLISOPOD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); // Use 2 turns of False Swipe due to opponent's health bar shield game.move.select(MoveId.FALSE_SWIPE); diff --git a/test/abilities/wind-power.test.ts b/test/abilities/wind-power.test.ts index 377a8052e13..5aaec25e19a 100644 --- a/test/abilities/wind-power.test.ts +++ b/test/abilities/wind-power.test.ts @@ -33,7 +33,7 @@ describe("Abilities - Wind Power", () => { it("becomes charged when hit by wind moves", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const shiftry = game.scene.getEnemyPokemon()!; + const shiftry = game.field.getEnemyPokemon(); expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); @@ -47,7 +47,7 @@ describe("Abilities - Wind Power", () => { game.override.ability(AbilityId.WIND_POWER).enemySpecies(SpeciesId.MAGIKARP); await game.classicMode.startBattle([SpeciesId.SHIFTRY]); - const shiftry = game.scene.getPlayerPokemon()!; + const shiftry = game.field.getPlayerPokemon(); expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); @@ -61,8 +61,8 @@ describe("Abilities - Wind Power", () => { game.override.enemySpecies(SpeciesId.MAGIKARP).ability(AbilityId.WIND_POWER); await game.classicMode.startBattle([SpeciesId.SHIFTRY]); - const magikarp = game.scene.getEnemyPokemon()!; - const shiftry = game.scene.getPlayerPokemon()!; + const magikarp = game.field.getEnemyPokemon(); + const shiftry = game.field.getPlayerPokemon(); expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); expect(magikarp.getTag(BattlerTagType.CHARGED)).toBeUndefined(); @@ -79,7 +79,7 @@ describe("Abilities - Wind Power", () => { game.override.enemySpecies(SpeciesId.MAGIKARP); await game.classicMode.startBattle([SpeciesId.SHIFTRY]); - const shiftry = game.scene.getPlayerPokemon()!; + const shiftry = game.field.getPlayerPokemon(); expect(shiftry.getTag(BattlerTagType.CHARGED)).toBeUndefined(); diff --git a/test/abilities/wind-rider.test.ts b/test/abilities/wind-rider.test.ts index be30acb0f64..9480bb437fb 100644 --- a/test/abilities/wind-rider.test.ts +++ b/test/abilities/wind-rider.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Wind Rider", () => { it("takes no damage from wind moves and its ATK stat stage is raised by 1 when hit by one", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const shiftry = game.scene.getEnemyPokemon()!; + const shiftry = game.field.getEnemyPokemon(); expect(shiftry.getStatStage(Stat.ATK)).toBe(0); @@ -48,7 +48,7 @@ describe("Abilities - Wind Rider", () => { game.override.enemySpecies(SpeciesId.MAGIKARP).ability(AbilityId.WIND_RIDER); await game.classicMode.startBattle([SpeciesId.SHIFTRY]); - const shiftry = game.scene.getPlayerPokemon()!; + const shiftry = game.field.getPlayerPokemon(); expect(shiftry.getStatStage(Stat.ATK)).toBe(0); @@ -63,8 +63,8 @@ describe("Abilities - Wind Rider", () => { game.override.enemySpecies(SpeciesId.MAGIKARP).ability(AbilityId.WIND_RIDER); await game.classicMode.startBattle([SpeciesId.SHIFTRY]); - const magikarp = game.scene.getEnemyPokemon()!; - const shiftry = game.scene.getPlayerPokemon()!; + const magikarp = game.field.getEnemyPokemon(); + const shiftry = game.field.getPlayerPokemon(); expect(shiftry.getStatStage(Stat.ATK)).toBe(0); expect(magikarp.getStatStage(Stat.ATK)).toBe(0); @@ -81,8 +81,8 @@ describe("Abilities - Wind Rider", () => { game.override.enemySpecies(SpeciesId.MAGIKARP).ability(AbilityId.WIND_RIDER); await game.classicMode.startBattle([SpeciesId.SHIFTRY]); - const magikarp = game.scene.getEnemyPokemon()!; - const shiftry = game.scene.getPlayerPokemon()!; + const magikarp = game.field.getEnemyPokemon(); + const shiftry = game.field.getPlayerPokemon(); expect(shiftry.getStatStage(Stat.ATK)).toBe(0); expect(magikarp.getStatStage(Stat.ATK)).toBe(0); @@ -99,7 +99,7 @@ describe("Abilities - Wind Rider", () => { game.override.enemySpecies(SpeciesId.MAGIKARP); await game.classicMode.startBattle([SpeciesId.SHIFTRY]); - const shiftry = game.scene.getPlayerPokemon()!; + const shiftry = game.field.getPlayerPokemon(); expect(shiftry.getStatStage(Stat.ATK)).toBe(0); expect(shiftry.isFullHp()).toBe(true); diff --git a/test/abilities/zen-mode.test.ts b/test/abilities/zen-mode.test.ts index 24d53bda7b6..f3ea7d78398 100644 --- a/test/abilities/zen-mode.test.ts +++ b/test/abilities/zen-mode.test.ts @@ -38,7 +38,7 @@ describe("Abilities - ZEN MODE", () => { it("shouldn't change form when taking damage if not dropping below 50% HP", async () => { await game.classicMode.startBattle([SpeciesId.DARMANITAN]); - const darmanitan = game.scene.getPlayerPokemon()!; + const darmanitan = game.field.getPlayerPokemon(); expect(darmanitan.formIndex).toBe(baseForm); game.move.select(MoveId.SPLASH); @@ -52,7 +52,7 @@ describe("Abilities - ZEN MODE", () => { it("should change form when falling below 50% HP", async () => { await game.classicMode.startBattle([SpeciesId.DARMANITAN]); - const darmanitan = game.scene.getPlayerPokemon()!; + const darmanitan = game.field.getPlayerPokemon(); darmanitan.hp = darmanitan.getMaxHp() / 2 + 1; expect(darmanitan.formIndex).toBe(baseForm); @@ -65,7 +65,7 @@ describe("Abilities - ZEN MODE", () => { it("should stay zen mode when fainted", async () => { await game.classicMode.startBattle([SpeciesId.DARMANITAN, SpeciesId.CHARIZARD]); - const darmanitan = game.scene.getPlayerPokemon()!; + const darmanitan = game.field.getPlayerPokemon(); darmanitan.hp = darmanitan.getMaxHp() / 2 + 1; expect(darmanitan.formIndex).toBe(baseForm); diff --git a/test/abilities/zero-to-hero.test.ts b/test/abilities/zero-to-hero.test.ts index cb0fe75d11b..d9fa3580da2 100644 --- a/test/abilities/zero-to-hero.test.ts +++ b/test/abilities/zero-to-hero.test.ts @@ -62,7 +62,7 @@ describe("Abilities - ZERO TO HERO", () => { it("should swap to Hero form when switching out during a battle", async () => { await game.classicMode.startBattle([SpeciesId.PALAFIN, SpeciesId.FEEBAS]); - const palafin = game.scene.getPlayerPokemon()!; + const palafin = game.field.getPlayerPokemon(); expect(palafin.formIndex).toBe(baseForm); game.doSwitchPokemon(1); @@ -73,7 +73,7 @@ describe("Abilities - ZERO TO HERO", () => { it("should not swap to Hero form if switching due to faint", async () => { await game.classicMode.startBattle([SpeciesId.PALAFIN, SpeciesId.FEEBAS]); - const palafin = game.scene.getPlayerPokemon()!; + const palafin = game.field.getPlayerPokemon(); expect(palafin.formIndex).toBe(baseForm); game.move.select(MoveId.SPLASH); @@ -90,7 +90,7 @@ describe("Abilities - ZERO TO HERO", () => { await game.classicMode.startBattle([SpeciesId.PALAFIN, SpeciesId.FEEBAS]); - const palafin = game.scene.getPlayerPokemon()!; + const palafin = game.field.getPlayerPokemon(); expect(palafin.formIndex).toBe(heroForm); game.move.select(MoveId.SPLASH); diff --git a/test/arena/arena-gravity.test.ts b/test/arena/arena-gravity.test.ts index b08dcf0c9b0..02b49d7711f 100644 --- a/test/arena/arena-gravity.test.ts +++ b/test/arena/arena-gravity.test.ts @@ -84,7 +84,7 @@ describe("Arena - Gravity", () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pidgeot = game.scene.getEnemyPokemon()!; + const pidgeot = game.field.getEnemyPokemon(); vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); // Try earthquake on 1st turn (fails!); @@ -113,7 +113,7 @@ describe("Arena - Gravity", () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pidgeot = game.scene.getEnemyPokemon()!; + const pidgeot = game.field.getEnemyPokemon(); vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); // Setup Gravity on 1st turn @@ -136,8 +136,8 @@ describe("Arena - Gravity", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const charizard = game.scene.getPlayerPokemon()!; - const snorlax = game.scene.getEnemyPokemon()!; + const charizard = game.field.getPlayerPokemon(); + const snorlax = game.field.getEnemyPokemon(); game.move.select(MoveId.SPLASH); diff --git a/test/arena/psychic-terrain.test.ts b/test/arena/psychic-terrain.test.ts index 82232cd8d05..6d42ed0d3ac 100644 --- a/test/arena/psychic-terrain.test.ts +++ b/test/arena/psychic-terrain.test.ts @@ -42,7 +42,7 @@ describe("Arena - Psychic Terrain", () => { game.move.select(MoveId.DARK_VOID); await game.toEndOfTurn(); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + expect(game.field.getEnemyPokemon().status?.effect).toBe(StatusEffect.SLEEP); }); it("Rain Dance with Prankster is not blocked", async () => { diff --git a/test/arena/weather-hail.test.ts b/test/arena/weather-hail.test.ts index b3ff8de3d42..edc01b3348f 100644 --- a/test/arena/weather-hail.test.ts +++ b/test/arena/weather-hail.test.ts @@ -52,8 +52,8 @@ describe("Weather - Hail", () => { await game.phaseInterceptor.to("TurnEndPhase"); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - Math.max(Math.floor(enemyPokemon.getMaxHp() / 16), 1)); @@ -66,8 +66,8 @@ describe("Weather - Hail", () => { await game.phaseInterceptor.to("TurnEndPhase"); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - Math.max(Math.floor(enemyPokemon.getMaxHp() / 16), 1)); diff --git a/test/arena/weather-sandstorm.test.ts b/test/arena/weather-sandstorm.test.ts index f5cf44458c5..69c741d53c5 100644 --- a/test/arena/weather-sandstorm.test.ts +++ b/test/arena/weather-sandstorm.test.ts @@ -51,8 +51,8 @@ describe("Weather - Sandstorm", () => { await game.phaseInterceptor.to("TurnEndPhase"); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - Math.max(Math.floor(enemyPokemon.getMaxHp() / 16), 1)); @@ -80,11 +80,11 @@ describe("Weather - Sandstorm", () => { it("increases Rock type Pokemon Sp.Def by 50%", async () => { await game.classicMode.startBattle([SpeciesId.ROCKRUFF]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerSpdef = playerPokemon.getStat(Stat.SPDEF); expect(playerPokemon.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(playerSpdef * 1.5)); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemySpdef = enemyPokemon.getStat(Stat.SPDEF); expect(enemyPokemon.getEffectiveStat(Stat.SPDEF)).toBe(enemySpdef); }); diff --git a/test/arena/weather-strong-winds.test.ts b/test/arena/weather-strong-winds.test.ts index 8d2d1ee0a75..1800027f59c 100644 --- a/test/arena/weather-strong-winds.test.ts +++ b/test/arena/weather-strong-winds.test.ts @@ -36,8 +36,8 @@ describe("Weather - Strong Winds", () => { game.override.enemySpecies(SpeciesId.RAYQUAZA); await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pikachu = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pikachu = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDERBOLT); @@ -47,8 +47,8 @@ describe("Weather - Strong Winds", () => { it("electric type move is neutral for flying type pokemon", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pikachu = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pikachu = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDERBOLT); @@ -58,8 +58,8 @@ describe("Weather - Strong Winds", () => { it("ice type move is neutral for flying type pokemon", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pikachu = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pikachu = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.ICE_BEAM); @@ -69,8 +69,8 @@ describe("Weather - Strong Winds", () => { it("rock type move is neutral for flying type pokemon", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const pikachu = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const pikachu = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.ROCK_SLIDE); @@ -83,7 +83,7 @@ describe("Weather - Strong Winds", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1; game.move.use(MoveId.SPLASH); diff --git a/test/battle/ability-swap.test.ts b/test/battle/ability-swap.test.ts index 4ce60e1f0b2..6d8ae8b5551 100644 --- a/test/battle/ability-swap.test.ts +++ b/test/battle/ability-swap.test.ts @@ -37,10 +37,10 @@ describe("Test Ability Swapping", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); game.move.select(MoveId.SPLASH); - game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[AbilityId.INTIMIDATE]); + game.field.getPlayerPokemon().setTempAbility(allAbilities[AbilityId.INTIMIDATE]); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should remove primal weather when the setter's ability is removed", async () => { @@ -48,7 +48,7 @@ describe("Test Ability Swapping", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); game.move.select(MoveId.SPLASH); - game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[AbilityId.BALL_FETCH]); + game.field.getPlayerPokemon().setTempAbility(allAbilities[AbilityId.BALL_FETCH]); await game.phaseInterceptor.to("BerryPhase"); expect(game.scene.arena.weather?.weatherType).toBeUndefined(); @@ -59,10 +59,10 @@ describe("Test Ability Swapping", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); game.move.select(MoveId.SPLASH); - game.scene.getPlayerPokemon()?.setTempAbility(allAbilities[AbilityId.BALL_FETCH]); + game.field.getPlayerPokemon().setTempAbility(allAbilities[AbilityId.BALL_FETCH]); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(1); // would be 2 if passive activated again + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(1); // would be 2 if passive activated again }); // Pickup and Honey Gather are special cases as they're the only abilities to be Unsuppressable but not Unswappable @@ -73,6 +73,6 @@ describe("Test Ability Swapping", () => { game.move.select(MoveId.ROLE_PLAY); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); }); diff --git a/test/battle/battle-order.test.ts b/test/battle/battle-order.test.ts index 47afb582a5a..0ee23cd6418 100644 --- a/test/battle/battle-order.test.ts +++ b/test/battle/battle-order.test.ts @@ -35,8 +35,8 @@ describe("Battle order", () => { it("opponent faster than player 50 vs 150", async () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50]); // set playerPokemon's speed to 50 vi.spyOn(enemyPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set enemyPokemon's speed to 150 @@ -54,8 +54,8 @@ describe("Battle order", () => { it("Player faster than opponent 150 vs 50", async () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set playerPokemon's speed to 150 vi.spyOn(enemyPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50]); // set enemyPokemon's speed to 50 diff --git a/test/battle/battle.test.ts b/test/battle/battle.test.ts index ff5090e5f8d..3dd154cf4eb 100644 --- a/test/battle/battle.test.ts +++ b/test/battle/battle.test.ts @@ -293,7 +293,7 @@ describe("Phase - Battle Phase", () => { .startingHeldItems([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]); await game.classicMode.startBattle(); - game.scene.getPlayerPokemon()!.hp = 1; + game.field.getPlayerPokemon().hp = 1; game.move.select(moveToUse); await game.phaseInterceptor.to(BattleEndPhase); diff --git a/test/battle/damage-calculation.test.ts b/test/battle/damage-calculation.test.ts index ca01830abd0..fac7c624f99 100644 --- a/test/battle/damage-calculation.test.ts +++ b/test/battle/damage-calculation.test.ts @@ -38,10 +38,10 @@ describe("Battle Mechanics - Damage Calculation", () => { it("Tackle deals expected base damage", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); vi.spyOn(playerPokemon, "getEffectiveStat").mockReturnValue(80); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(enemyPokemon, "getEffectiveStat").mockReturnValue(90); // expected base damage = [(2*level/5 + 2) * power * playerATK / enemyDEF / 50] + 2 @@ -56,7 +56,7 @@ describe("Battle Mechanics - Damage Calculation", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const aggron = game.scene.getEnemyPokemon()!; + const aggron = game.field.getEnemyPokemon(); game.move.select(MoveId.TACKLE); @@ -75,7 +75,7 @@ describe("Battle Mechanics - Damage Calculation", () => { dmg_redux_modifier.stackCount = 1000; await game.scene.addEnemyModifier(modifierTypes.ENEMY_DAMAGE_REDUCTION().newModifier() as EnemyPersistentModifier); - const aggron = game.scene.getEnemyPokemon()!; + const aggron = game.field.getEnemyPokemon(); game.move.select(MoveId.TACKLE); @@ -89,8 +89,8 @@ describe("Battle Mechanics - Damage Calculation", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const magikarp = game.scene.getPlayerPokemon()!; - const dragonite = game.scene.getEnemyPokemon()!; + const magikarp = game.field.getPlayerPokemon(); + const dragonite = game.field.getEnemyPokemon(); expect(dragonite.getAttackDamage({ source: magikarp, move: allMoves[MoveId.DRAGON_RAGE] }).damage).toBe(40); }); @@ -100,8 +100,8 @@ describe("Battle Mechanics - Damage Calculation", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const magikarp = game.scene.getPlayerPokemon()!; - const aggron = game.scene.getEnemyPokemon()!; + const magikarp = game.field.getPlayerPokemon(); + const aggron = game.field.getEnemyPokemon(); expect(aggron.getAttackDamage({ source: magikarp, move: allMoves[MoveId.FISSURE] }).damage).toBe(aggron.hp); }); @@ -111,7 +111,7 @@ describe("Battle Mechanics - Damage Calculation", () => { await game.classicMode.startBattle([SpeciesId.SHEDINJA]); - const shedinja = game.scene.getPlayerPokemon()!; + const shedinja = game.field.getPlayerPokemon(); game.move.select(MoveId.JUMP_KICK); @@ -126,7 +126,7 @@ describe("Battle Mechanics - Damage Calculation", () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const charizard = game.scene.getEnemyPokemon()!; + const charizard = game.field.getEnemyPokemon(); if (charizard.getMaxHp() % 2 === 1) { expect(charizard.hp).toBeGreaterThan(charizard.getMaxHp() / 2); diff --git a/test/battle/inverse-battle.test.ts b/test/battle/inverse-battle.test.ts index 9ba2df9bc44..66a21e80009 100644 --- a/test/battle/inverse-battle.test.ts +++ b/test/battle/inverse-battle.test.ts @@ -43,7 +43,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.THUNDERBOLT); @@ -58,7 +58,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.THUNDERBOLT); @@ -73,7 +73,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.THUNDERBOLT); @@ -89,7 +89,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const charizard = game.scene.getEnemyPokemon()!; + const charizard = game.field.getEnemyPokemon(); const maxHp = charizard.getMaxHp(); const damage_prediction = Math.max(Math.round(charizard.getMaxHp() / 32), 1); @@ -111,7 +111,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -126,7 +126,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.hp = enemy.getMaxHp() - 1; game.move.select(MoveId.WATER_GUN); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -140,7 +140,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.WILL_O_WISP); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -155,7 +155,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.NUZZLE); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -169,7 +169,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDER_WAVE); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -184,7 +184,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - expect(game.scene.getEnemyPokemon()?.waveData.abilitiesApplied).toContain(AbilityId.ANTICIPATION); + expect(game.field.getEnemyPokemon().waveData.abilitiesApplied).toContain(AbilityId.ANTICIPATION); }); it("Conversion 2 should change the type to the resistive type - Conversion 2 against Dragonite", async () => { @@ -192,7 +192,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); game.move.select(MoveId.CONVERSION_2); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -207,7 +207,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FLYING_PRESS); @@ -222,7 +222,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.TACKLE); @@ -237,7 +237,7 @@ describe("Inverse Battle", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FORESIGHT); diff --git a/test/boss-pokemon.test.ts b/test/boss-pokemon.test.ts index 0a7c71c95e7..b0dfbf19794 100644 --- a/test/boss-pokemon.test.ts +++ b/test/boss-pokemon.test.ts @@ -80,7 +80,7 @@ describe("Boss Pokemon / Shields", () => { await game.classicMode.startBattle([SpeciesId.MEWTWO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const segmentHp = enemyPokemon.getMaxHp() / enemyPokemon.bossSegments; expect(enemyPokemon.isBoss()).toBe(true); expect(enemyPokemon.bossSegments).toBe(3); @@ -191,7 +191,7 @@ describe("Boss Pokemon / Shields", () => { await game.classicMode.startBattle([SpeciesId.MEWTWO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.isBoss()).toBe(true); expect(enemyPokemon.bossSegments).toBe(2); expect(getTotalStatStageBoosts(enemyPokemon)).toBe(0); diff --git a/test/data/status-effect.test.ts b/test/data/status-effect.test.ts index ebfd9066b3c..20e164ce4d7 100644 --- a/test/data/status-effect.test.ts +++ b/test/data/status-effect.test.ts @@ -331,8 +331,8 @@ describe("Status Effects", () => { await game.move.forceStatusActivation(true); await game.toNextTurn(); - expect(game.scene.getEnemyPokemon()!.isFullHp()).toBe(true); - expect(game.scene.getPlayerPokemon()!.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + expect(game.field.getEnemyPokemon().isFullHp()).toBe(true); + expect(game.field.getPlayerPokemon().getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); }); }); @@ -365,7 +365,7 @@ describe("Status Effects", () => { it("should last the appropriate number of turns", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.status = new Status(StatusEffect.SLEEP, 0, 4); game.move.select(MoveId.SPLASH); @@ -422,7 +422,7 @@ describe("Status Effects", () => { it("should not inflict a 0 HP mon with a status", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS, SpeciesId.MILOTIC]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.hp = 0; expect(player.trySetStatus(StatusEffect.BURN)).toBe(false); diff --git a/test/endless-boss.test.ts b/test/endless-boss.test.ts index 707d164d4d0..2a4ac9ddc7d 100644 --- a/test/endless-boss.test.ts +++ b/test/endless-boss.test.ts @@ -34,10 +34,10 @@ describe("Endless Boss", () => { expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor); expect(game.scene.arena.biomeType).toBe(BiomeId.END); - const eternatus = game.scene.getEnemyPokemon(); - expect(eternatus?.species.speciesId).toBe(SpeciesId.ETERNATUS); - expect(eternatus?.hasPassive()).toBe(false); - expect(eternatus?.formIndex).toBe(0); + const eternatus = game.field.getEnemyPokemon(); + expect(eternatus.species.speciesId).toBe(SpeciesId.ETERNATUS); + expect(eternatus.hasPassive()).toBe(false); + expect(eternatus.formIndex).toBe(0); }); it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Endless`, async () => { @@ -46,10 +46,10 @@ describe("Endless Boss", () => { expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major); expect(game.scene.arena.biomeType).toBe(BiomeId.END); - const eternatus = game.scene.getEnemyPokemon(); - expect(eternatus?.species.speciesId).toBe(SpeciesId.ETERNATUS); - expect(eternatus?.hasPassive()).toBe(false); - expect(eternatus?.formIndex).toBe(1); + const eternatus = game.field.getEnemyPokemon(); + expect(eternatus.species.speciesId).toBe(SpeciesId.ETERNATUS); + expect(eternatus.hasPassive()).toBe(false); + expect(eternatus.formIndex).toBe(1); }); it(`should spawn a minor boss every ${EndlessBossWave.Minor} waves in END biome in Spliced Endless`, async () => { @@ -58,10 +58,10 @@ describe("Endless Boss", () => { expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor); expect(game.scene.arena.biomeType).toBe(BiomeId.END); - const eternatus = game.scene.getEnemyPokemon(); - expect(eternatus?.species.speciesId).toBe(SpeciesId.ETERNATUS); - expect(eternatus?.hasPassive()).toBe(false); - expect(eternatus?.formIndex).toBe(0); + const eternatus = game.field.getEnemyPokemon(); + expect(eternatus.species.speciesId).toBe(SpeciesId.ETERNATUS); + expect(eternatus.hasPassive()).toBe(false); + expect(eternatus.formIndex).toBe(0); }); it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Spliced Endless`, async () => { @@ -70,10 +70,10 @@ describe("Endless Boss", () => { expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major); expect(game.scene.arena.biomeType).toBe(BiomeId.END); - const eternatus = game.scene.getEnemyPokemon(); - expect(eternatus?.species.speciesId).toBe(SpeciesId.ETERNATUS); - expect(eternatus?.hasPassive()).toBe(false); - expect(eternatus?.formIndex).toBe(1); + const eternatus = game.field.getEnemyPokemon(); + expect(eternatus.species.speciesId).toBe(SpeciesId.ETERNATUS); + expect(eternatus.hasPassive()).toBe(false); + expect(eternatus.formIndex).toBe(1); }); it(`should NOT spawn major or minor boss outside wave ${EndlessBossWave.Minor}s in END biome`, async () => { @@ -81,6 +81,6 @@ describe("Endless Boss", () => { await game.runToFinalBossEncounter([SpeciesId.BIDOOF], GameModes.ENDLESS); expect(game.scene.currentBattle.waveIndex).not.toBe(EndlessBossWave.Minor); - expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(SpeciesId.ETERNATUS); + expect(game.field.getEnemyPokemon().species.speciesId).not.toBe(SpeciesId.ETERNATUS); }); }); diff --git a/test/enemy-command.test.ts b/test/enemy-command.test.ts index 12281179e0d..e7687ae9641 100644 --- a/test/enemy-command.test.ts +++ b/test/enemy-command.test.ts @@ -61,7 +61,7 @@ describe("Enemy Commands - Move Selection", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); enemyPokemon.aiType = AiType.SMART_RANDOM; const moveChoices: MoveChoiceSet = {}; @@ -85,7 +85,7 @@ describe("Enemy Commands - Move Selection", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); enemyPokemon.aiType = AiType.SMART_RANDOM; const moveChoices: MoveChoiceSet = {}; diff --git a/test/evolution.test.ts b/test/evolution.test.ts index 172a4e5d3aa..afe557ff2c0 100644 --- a/test/evolution.test.ts +++ b/test/evolution.test.ts @@ -64,7 +64,7 @@ describe("Evolution", () => { it("should handle illegal abilityIndex values", async () => { await game.classicMode.runToSummon([SpeciesId.SQUIRTLE]); - const squirtle = game.scene.getPlayerPokemon()!; + const squirtle = game.field.getPlayerPokemon(); squirtle.abilityIndex = 5; await squirtle.evolve(pokemonEvolutions[SpeciesId.SQUIRTLE][0], squirtle.getSpeciesForm()); @@ -74,7 +74,7 @@ describe("Evolution", () => { it("should handle nincada's unique evolution", async () => { await game.classicMode.runToSummon([SpeciesId.NINCADA]); - const nincada = game.scene.getPlayerPokemon()!; + const nincada = game.field.getPlayerPokemon(); nincada.abilityIndex = 2; nincada.metBiome = -1; nincada.gender = 1; @@ -107,12 +107,12 @@ describe("Evolution", () => { await game.classicMode.startBattle([SpeciesId.TOTODILE]); - const totodile = game.scene.getPlayerPokemon()!; + const totodile = game.field.getPlayerPokemon(); const hpBefore = totodile.hp; expect(totodile.hp).toBe(totodile.getMaxHp()); - const golem = game.scene.getEnemyPokemon()!; + const golem = game.field.getEnemyPokemon(); golem.hp = 1; expect(golem.hp).toBe(1); @@ -135,14 +135,14 @@ describe("Evolution", () => { await game.classicMode.startBattle([SpeciesId.CYNDAQUIL]); - const cyndaquil = game.scene.getPlayerPokemon()!; + const cyndaquil = game.field.getPlayerPokemon(); cyndaquil.hp = Math.floor(cyndaquil.getMaxHp() / 2); const hpBefore = cyndaquil.hp; const maxHpBefore = cyndaquil.getMaxHp(); expect(cyndaquil.hp).toBe(Math.floor(cyndaquil.getMaxHp() / 2)); - const golem = game.scene.getEnemyPokemon()!; + const golem = game.field.getEnemyPokemon(); golem.hp = 1; expect(golem.hp).toBe(1); @@ -167,7 +167,7 @@ describe("Evolution", () => { * 1, 2 or 3, it's a 4 family maushold */ await game.classicMode.startBattle([SpeciesId.TANDEMAUS]); // starts us off with a tandemaus - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.level = 25; // tandemaus evolves at level 25 vi.spyOn(Utils, "randSeedInt").mockReturnValue(0); // setting the random generator to be 0 to force a three family maushold const threeForm = playerPokemon.getEvolution()!; diff --git a/test/field/pokemon.test.ts b/test/field/pokemon.test.ts index baa50556473..02058ad6cb1 100644 --- a/test/field/pokemon.test.ts +++ b/test/field/pokemon.test.ts @@ -28,7 +28,7 @@ describe("Spec - Pokemon", () => { it("should not crash when trying to set status of undefined", async () => { await game.classicMode.runToSummon([SpeciesId.ABRA]); - const pkm = game.scene.getPlayerPokemon()!; + const pkm = game.field.getPlayerPokemon(); expect(pkm).toBeDefined(); expect(pkm.trySetStatus(undefined)).toBe(false); @@ -50,7 +50,7 @@ describe("Spec - Pokemon", () => { }); it("should append a new pokemon by default", async () => { - const zubat = scene.getEnemyPokemon()!; + const zubat = game.field.getEnemyPokemon(); zubat.addToParty(PokeballType.LUXURY_BALL); const party = scene.getPlayerParty(); @@ -62,7 +62,7 @@ describe("Spec - Pokemon", () => { it("should put a new pokemon into the passed slotIndex", async () => { const slotIndex = 1; - const zubat = scene.getEnemyPokemon()!; + const zubat = game.field.getEnemyPokemon(); zubat.addToParty(PokeballType.LUXURY_BALL, slotIndex); const party = scene.getPlayerParty(); @@ -78,7 +78,7 @@ describe("Spec - Pokemon", () => { await game.classicMode.startBattle([SpeciesId.ROTOM]); - const fanRotom = game.scene.getPlayerPokemon()!; + const fanRotom = game.field.getPlayerPokemon(); expect(fanRotom.compatibleTms).not.toContain(MoveId.BLIZZARD); expect(fanRotom.compatibleTms).toContain(MoveId.AIR_SLASH); diff --git a/test/final-boss.test.ts b/test/final-boss.test.ts index 2180979899a..81b5f7816d6 100644 --- a/test/final-boss.test.ts +++ b/test/final-boss.test.ts @@ -41,7 +41,7 @@ describe("Final Boss", () => { expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).toBe(BiomeId.END); - expect(game.scene.getEnemyPokemon()!.species.speciesId).toBe(SpeciesId.ETERNATUS); + expect(game.field.getEnemyPokemon().species.speciesId).toBe(SpeciesId.ETERNATUS); }); it("should NOT spawn Eternatus before wave 200 in END biome", async () => { @@ -50,7 +50,7 @@ describe("Final Boss", () => { expect(game.scene.currentBattle.waveIndex).not.toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).toBe(BiomeId.END); - expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(SpeciesId.ETERNATUS); + expect(game.field.getEnemyPokemon().species.speciesId).not.toBe(SpeciesId.ETERNATUS); }); it("should NOT spawn Eternatus outside of END biome", async () => { @@ -59,13 +59,13 @@ describe("Final Boss", () => { expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).not.toBe(BiomeId.END); - expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(SpeciesId.ETERNATUS); + expect(game.field.getEnemyPokemon().species.speciesId).not.toBe(SpeciesId.ETERNATUS); }); it("should initially spawn in regular form without passive & 4 boss segments", async () => { await game.runToFinalBossEncounter([SpeciesId.BIDOOF], GameModes.CLASSIC); - const eternatus = game.scene.getEnemyPokemon()!; + const eternatus = game.field.getEnemyPokemon(); expect(eternatus.formIndex).toBe(0); expect(eternatus.bossSegments).toBe(4); expect(eternatus.bossSegmentIndex).toBe(3); @@ -77,7 +77,7 @@ describe("Final Boss", () => { await game.runToFinalBossEncounter([SpeciesId.KYUREM], GameModes.CLASSIC); // phase 1 - const eternatus = game.scene.getEnemyPokemon()!; + const eternatus = game.field.getEnemyPokemon(); const phase1Hp = eternatus.getMaxHp(); game.move.use(MoveId.DRAGON_PULSE); @@ -100,7 +100,7 @@ describe("Final Boss", () => { await game.runToFinalBossEncounter([SpeciesId.SALAZZLE], GameModes.CLASSIC); // Eternatus phase 1 - const eternatus = game.scene.getEnemyPokemon()!; + const eternatus = game.field.getEnemyPokemon(); const phase1Hp = eternatus.getMaxHp(); game.move.use(MoveId.WILL_O_WISP); diff --git a/test/internals.test.ts b/test/internals.test.ts index bb33b01c265..98262a6db25 100644 --- a/test/internals.test.ts +++ b/test/internals.test.ts @@ -24,7 +24,7 @@ describe("Internals", () => { it("should provide Eevee with 3 defined abilities", async () => { await game.classicMode.runToSummon([SpeciesId.EEVEE]); - const eevee = game.scene.getPlayerPokemon()!; + const eevee = game.field.getPlayerPokemon(); expect(eevee.getSpeciesForm().getAbilityCount()).toBe(3); @@ -35,7 +35,7 @@ describe("Internals", () => { it("should set Eeeve abilityIndex between 0-2", async () => { await game.classicMode.runToSummon([SpeciesId.EEVEE]); - const eevee = game.scene.getPlayerPokemon()!; + const eevee = game.field.getPlayerPokemon(); expect(eevee.abilityIndex).toBeGreaterThanOrEqual(0); expect(eevee.abilityIndex).toBeLessThanOrEqual(2); diff --git a/test/items/dire-hit.test.ts b/test/items/dire-hit.test.ts index fe7fabd3c4c..6d4bc7524eb 100644 --- a/test/items/dire-hit.test.ts +++ b/test/items/dire-hit.test.ts @@ -42,7 +42,7 @@ describe("Items - Dire Hit", () => { it("should raise CRIT stage by 1", async () => { await game.classicMode.startBattle([SpeciesId.GASTLY]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(enemyPokemon, "getCritStage"); diff --git a/test/items/eviolite.test.ts b/test/items/eviolite.test.ts index 2e64135d264..9268226661b 100644 --- a/test/items/eviolite.test.ts +++ b/test/items/eviolite.test.ts @@ -28,7 +28,7 @@ describe("Items - Eviolite", () => { it("should provide 50% boost to DEF and SPDEF for unevolved, unfused pokemon", async () => { await game.classicMode.startBattle([SpeciesId.PICHU]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { const statValue = new NumberHolder(partyMember.getStat(stat, false)); @@ -49,7 +49,7 @@ describe("Items - Eviolite", () => { it("should not provide a boost for fully evolved, unfused pokemon", async () => { await game.classicMode.startBattle([SpeciesId.RAICHU]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { const statValue = new NumberHolder(partyMember.getStat(stat, false)); @@ -199,7 +199,7 @@ describe("Items - Eviolite", () => { await game.classicMode.startBattle([randItem(gMaxablePokemon)]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); vi.spyOn(partyMember, "getEffectiveStat").mockImplementation((stat, _opponent?, _move?, _isCritical?) => { const statValue = new NumberHolder(partyMember.getStat(stat, false)); diff --git a/test/items/exp-booster.test.ts b/test/items/exp-booster.test.ts index dd2c8eb0c2b..1740b56693b 100644 --- a/test/items/exp-booster.test.ts +++ b/test/items/exp-booster.test.ts @@ -29,7 +29,7 @@ describe("EXP Modifier Items", () => { game.override.startingHeldItems([{ name: "LUCKY_EGG", count: 3 }, { name: "GOLDEN_EGG" }]); await game.classicMode.startBattle(); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); partyMember.exp = 100; const expHolder = new NumberHolder(partyMember.exp); game.scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, expHolder); diff --git a/test/items/leek.test.ts b/test/items/leek.test.ts index c38294d07a4..485f35ed10a 100644 --- a/test/items/leek.test.ts +++ b/test/items/leek.test.ts @@ -34,7 +34,7 @@ describe("Items - Leek", () => { it("should raise CRIT stage by 2 when held by FARFETCHD", async () => { await game.classicMode.startBattle([SpeciesId.FARFETCHD]); - const enemyMember = game.scene.getEnemyPokemon()!; + const enemyMember = game.field.getEnemyPokemon(); vi.spyOn(enemyMember, "getCritStage"); @@ -48,7 +48,7 @@ describe("Items - Leek", () => { it("should raise CRIT stage by 2 when held by GALAR_FARFETCHD", async () => { await game.classicMode.startBattle([SpeciesId.GALAR_FARFETCHD]); - const enemyMember = game.scene.getEnemyPokemon()!; + const enemyMember = game.field.getEnemyPokemon(); vi.spyOn(enemyMember, "getCritStage"); @@ -62,7 +62,7 @@ describe("Items - Leek", () => { it("should raise CRIT stage by 2 when held by SIRFETCHD", async () => { await game.classicMode.startBattle([SpeciesId.SIRFETCHD]); - const enemyMember = game.scene.getEnemyPokemon()!; + const enemyMember = game.field.getEnemyPokemon(); vi.spyOn(enemyMember, "getCritStage"); @@ -90,7 +90,7 @@ describe("Items - Leek", () => { partyMember.fusionGender = ally.gender; partyMember.fusionLuck = ally.luck; - const enemyMember = game.scene.getEnemyPokemon()!; + const enemyMember = game.field.getEnemyPokemon(); vi.spyOn(enemyMember, "getCritStage"); @@ -118,7 +118,7 @@ describe("Items - Leek", () => { partyMember.fusionGender = ally.gender; partyMember.fusionLuck = ally.luck; - const enemyMember = game.scene.getEnemyPokemon()!; + const enemyMember = game.field.getEnemyPokemon(); vi.spyOn(enemyMember, "getCritStage"); @@ -132,7 +132,7 @@ describe("Items - Leek", () => { it("should not raise CRIT stage when held by a Pokemon outside of FARFETCHD line", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const enemyMember = game.scene.getEnemyPokemon()!; + const enemyMember = game.field.getEnemyPokemon(); vi.spyOn(enemyMember, "getCritStage"); diff --git a/test/items/leftovers.test.ts b/test/items/leftovers.test.ts index bed40b1c83a..6ae4094799b 100644 --- a/test/items/leftovers.test.ts +++ b/test/items/leftovers.test.ts @@ -40,7 +40,7 @@ describe("Items - Leftovers", () => { // Make sure leftovers are there expect(game.scene.modifiers[0].type.id).toBe("LEFTOVERS"); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); // We should have full hp expect(leadPokemon.isFullHp()).toBe(true); diff --git a/test/items/multi-lens.test.ts b/test/items/multi-lens.test.ts index e3cf39e4933..b69a07033c9 100644 --- a/test/items/multi-lens.test.ts +++ b/test/items/multi-lens.test.ts @@ -46,7 +46,7 @@ describe("Items - Multi Lens", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const spy = vi.spyOn(enemyPokemon, "getAttackDamage"); vi.spyOn(enemyPokemon, "getBaseDamage").mockReturnValue(100); @@ -67,7 +67,7 @@ describe("Items - Multi Lens", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.TACKLE); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -79,7 +79,7 @@ describe("Items - Multi Lens", () => { it("should apply secondary effects on each hit", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.TRAILBLAZE); @@ -90,7 +90,7 @@ describe("Items - Multi Lens", () => { it("should not enhance multi-hit moves", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.TACHYON_CUTTER); @@ -120,8 +120,8 @@ describe("Items - Multi Lens", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); const spy = vi.spyOn(enemyPokemon, "getAttackDamage"); game.move.select(MoveId.SEISMIC_TOSS); @@ -145,7 +145,7 @@ describe("Items - Multi Lens", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SUPER_FANG); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -164,7 +164,7 @@ describe("Items - Multi Lens", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SUPER_FANG); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -184,7 +184,7 @@ describe("Items - Multi Lens", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SUPER_FANG); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -196,7 +196,7 @@ describe("Items - Multi Lens", () => { game.override.enemyLevel(1000); await game.classicMode.startBattle([SpeciesId.BULBASAUR, SpeciesId.CHARMANDER, SpeciesId.SQUIRTLE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(enemyPokemon, "damageAndUpdate"); game.move.select(MoveId.FUTURE_SIGHT); diff --git a/test/items/reviver-seed.test.ts b/test/items/reviver-seed.test.ts index 268c5497899..45d41459f06 100644 --- a/test/items/reviver-seed.test.ts +++ b/test/items/reviver-seed.test.ts @@ -51,7 +51,7 @@ describe("Items - Reviver Seed", () => { ])("should activate the holder's reviver seed from a $moveType", async ({ move }) => { game.override.enemyLevel(100).startingLevel(1).enemyMoveset(move); await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.damageAndUpdate(player.hp - 1); const reviverSeed = player.getHeldItems()[0] as PokemonInstantReviveModifier; @@ -66,7 +66,7 @@ describe("Items - Reviver Seed", () => { it("should activate the holder's reviver seed from confusion self-hit", async () => { game.override.enemyLevel(1).startingLevel(100).enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.damageAndUpdate(player.hp - 1); player.addTag(BattlerTagType.CONFUSED, 3); @@ -95,7 +95,7 @@ describe("Items - Reviver Seed", () => { .moveset(move) .enemyMoveset(MoveId.ENDURE); await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.damageAndUpdate(enemy.hp - 1); game.move.select(move); @@ -119,7 +119,7 @@ describe("Items - Reviver Seed", () => { .enemyAbility(AbilityId.LIQUID_OOZE) .enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.GASTLY, SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.damageAndUpdate(player.hp - 1); const playerSeed = player.getHeldItems()[0] as PokemonInstantReviveModifier; @@ -140,9 +140,9 @@ describe("Items - Reviver Seed", () => { .startingHeldItems([]) // reset held items to nothing so user doesn't revive and not trigger Destiny Bond .enemyMoveset(MoveId.TACKLE); await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.damageAndUpdate(player.hp - 1); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.DESTINY_BOND); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); diff --git a/test/items/scope-lens.test.ts b/test/items/scope-lens.test.ts index 578b0576aaa..7bc2dd7356b 100644 --- a/test/items/scope-lens.test.ts +++ b/test/items/scope-lens.test.ts @@ -33,7 +33,7 @@ describe("Items - Scope Lens", () => { it("should raise CRIT stage by 1", async () => { await game.classicMode.startBattle([SpeciesId.GASTLY]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(enemyPokemon, "getCritStage"); diff --git a/test/items/temp-stat-stage-booster.test.ts b/test/items/temp-stat-stage-booster.test.ts index 806ff20df6c..f95fe553faf 100644 --- a/test/items/temp-stat-stage-booster.test.ts +++ b/test/items/temp-stat-stage-booster.test.ts @@ -41,7 +41,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { it("should provide a x1.3 stat stage multiplier", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); vi.spyOn(partyMember, "getStatStageMultiplier"); @@ -57,7 +57,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); vi.spyOn(partyMember, "getAccuracyMultiplier"); @@ -77,7 +77,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { it("should increase existing stat stage multiplier by 3/10 for the rest of the boosters", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); vi.spyOn(partyMember, "getStatStageMultiplier"); @@ -102,7 +102,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); vi.spyOn(partyMember, "getStatStageMultiplier"); vi.spyOn(partyMember, "getAccuracyMultiplier"); diff --git a/test/items/toxic-orb.test.ts b/test/items/toxic-orb.test.ts index a1888a6aa1d..664ddd437e4 100644 --- a/test/items/toxic-orb.test.ts +++ b/test/items/toxic-orb.test.ts @@ -42,7 +42,7 @@ describe("Items - Toxic orb", () => { it("should badly poison the holder", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); expect(player.getHeldItems()[0].type.id).toBe("TOXIC_ORB"); game.move.select(MoveId.SPLASH); diff --git a/test/moves/ability-ignore-moves.test.ts b/test/moves/ability-ignore-moves.test.ts index 750d8fe2f20..e3a7c7db12f 100644 --- a/test/moves/ability-ignore-moves.test.ts +++ b/test/moves/ability-ignore-moves.test.ts @@ -77,7 +77,7 @@ describe("Moves - Ability-Ignoring Moves", () => { await game.toEndOfTurn(); expect(enemy.isFainted()).toBe(false); - expect(game.scene.getPlayerPokemon()?.getLastXMoves()[0].move).toBe(MoveId.SUNSTEEL_STRIKE); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].move).toBe(MoveId.SUNSTEEL_STRIKE); }); // TODO: Verify this behavior on cart diff --git a/test/moves/alluring-voice.test.ts b/test/moves/alluring-voice.test.ts index dc01cc1a54e..cc89a106c16 100644 --- a/test/moves/alluring-voice.test.ts +++ b/test/moves/alluring-voice.test.ts @@ -38,7 +38,7 @@ describe("Moves - Alluring Voice", () => { it("should confuse the opponent if their stat stages were raised", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.use(MoveId.ALLURING_VOICE); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); diff --git a/test/moves/assist.test.ts b/test/moves/assist.test.ts index 52467c2ba98..ab0a8106457 100644 --- a/test/moves/assist.test.ts +++ b/test/moves/assist.test.ts @@ -51,18 +51,18 @@ describe("Moves - Assist", () => { // Player_2 uses Sketch, copies Swords Dance, Player_1 uses Assist, uses Player_2's Sketched Swords Dance await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(2); // Stat raised from Assist -> Swords Dance + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(2); // Stat raised from Assist -> Swords Dance }); it("should fail if there are no allies", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const feebas = game.scene.getPlayerPokemon()!; + const feebas = game.field.getPlayerPokemon(); game.move.changeMoveset(feebas, [MoveId.ASSIST, MoveId.SKETCH, MoveId.PROTECT, MoveId.DRAGON_TAIL]); game.move.select(MoveId.ASSIST, 0); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should fail if ally has no usable moves and user has usable moves", async () => { @@ -82,7 +82,7 @@ describe("Moves - Assist", () => { game.move.select(MoveId.PROTECT, 1); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should apply secondary effects of a move", async () => { @@ -96,6 +96,6 @@ describe("Moves - Assist", () => { game.move.select(MoveId.ASSIST, 1); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.isFullHp()).toBeFalsy(); // should receive recoil damage from Wood Hammer + expect(game.field.getPlayerPokemon().isFullHp()).toBeFalsy(); // should receive recoil damage from Wood Hammer }); }); diff --git a/test/moves/astonish.test.ts b/test/moves/astonish.test.ts index 0f7dc526b2d..1b39b1c4fef 100644 --- a/test/moves/astonish.test.ts +++ b/test/moves/astonish.test.ts @@ -42,9 +42,9 @@ describe("Moves - Astonish", () => { test("move effect should cancel the target's move on the turn it applies", async () => { await game.classicMode.startBattle([SpeciesId.MEOWSCARADA]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.ASTONISH); diff --git a/test/moves/autotomize.test.ts b/test/moves/autotomize.test.ts index a8a7309e03e..85ea9c3852f 100644 --- a/test/moves/autotomize.test.ts +++ b/test/moves/autotomize.test.ts @@ -38,7 +38,7 @@ describe("Moves - Autotomize", () => { const threeAutotomizeDracozoltWeight = 0.1; await game.classicMode.startBattle([SpeciesId.DRACOZOLT]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getWeight()).toBe(baseDracozoltWeight); game.move.select(MoveId.AUTOTOMIZE); await game.toNextTurn(); @@ -62,7 +62,7 @@ describe("Moves - Autotomize", () => { const autotomizeAegislashWeight = 0.1; await game.classicMode.startBattle([SpeciesId.AEGISLASH]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getWeight()).toBe(baseAegislashWeight); @@ -98,7 +98,7 @@ describe("Moves - Autotomize", () => { const autotomizeLightGroudonWeight = 425; game.override.ability(AbilityId.LIGHT_METAL); await game.classicMode.startBattle([SpeciesId.GROUDON]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getWeight()).toBe(baseLightGroudonWeight); game.move.select(MoveId.AUTOTOMIZE); await game.toNextTurn(); diff --git a/test/moves/baneful-bunker.test.ts b/test/moves/baneful-bunker.test.ts index da2a8e0418a..8c6661c03b6 100644 --- a/test/moves/baneful-bunker.test.ts +++ b/test/moves/baneful-bunker.test.ts @@ -36,8 +36,8 @@ describe("Moves - Baneful Bunker", () => { test("should protect the user and poison attackers that make contact", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SLASH); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -48,8 +48,8 @@ describe("Moves - Baneful Bunker", () => { test("should protect the user and poison attackers that make contact, regardless of accuracy checks", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SLASH); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -65,8 +65,8 @@ describe("Moves - Baneful Bunker", () => { game.override.moveset(MoveId.FLASH_CANNON); await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.FLASH_CANNON); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); diff --git a/test/moves/baton-pass.test.ts b/test/moves/baton-pass.test.ts index ef1979b223d..f9bd92a63cd 100644 --- a/test/moves/baton-pass.test.ts +++ b/test/moves/baton-pass.test.ts @@ -42,7 +42,7 @@ describe("Moves - Baton Pass", () => { game.move.select(MoveId.NASTY_PLOT); await game.toNextTurn(); - let playerPokemon = game.scene.getPlayerPokemon()!; + let playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getStatStage(Stat.SPATK)).toEqual(2); @@ -52,7 +52,7 @@ describe("Moves - Baton Pass", () => { await game.phaseInterceptor.to("TurnEndPhase"); // assert - playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.species.speciesId).toEqual(SpeciesId.SHUCKLE); expect(playerPokemon.getStatStage(Stat.SPATK)).toEqual(2); }); @@ -73,7 +73,7 @@ describe("Moves - Baton Pass", () => { await game.phaseInterceptor.to("PostSummonPhase", false); // check buffs are still there - expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.SPATK)).toEqual(2); + expect(game.field.getEnemyPokemon().getStatStage(Stat.SPATK)).toEqual(2); // confirm that a switch actually happened. can't use species because I // can't find a way to override trainer parties with more than 1 pokemon species expect(game.phaseInterceptor.log.slice(-4)).toEqual([ @@ -105,7 +105,7 @@ describe("Moves - Baton Pass", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.FIRE_SPIN); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); diff --git a/test/moves/beak-blast.test.ts b/test/moves/beak-blast.test.ts index 71d2d957bed..4d28e7fd0ab 100644 --- a/test/moves/beak-blast.test.ts +++ b/test/moves/beak-blast.test.ts @@ -40,8 +40,8 @@ describe("Moves - Beak Blast", () => { it("should add a charge effect that burns attackers on contact", async () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.BEAK_BLAST); @@ -57,8 +57,8 @@ describe("Moves - Beak Blast", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.BEAK_BLAST); @@ -74,8 +74,8 @@ describe("Moves - Beak Blast", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.BEAK_BLAST); @@ -91,7 +91,7 @@ describe("Moves - Beak Blast", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.BEAK_BLAST); @@ -104,8 +104,8 @@ describe("Moves - Beak Blast", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.BEAK_BLAST); @@ -120,8 +120,8 @@ describe("Moves - Beak Blast", () => { it("should still burn the enemy if the user is knocked out", async () => { game.override.ability(AbilityId.BALL_FETCH); await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; - const user = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); + const user = game.field.getPlayerPokemon(); user.hp = 1; game.move.select(MoveId.BEAK_BLAST); await game.phaseInterceptor.to("BerryPhase", false); @@ -133,7 +133,7 @@ describe("Moves - Beak Blast", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); game.move.select(MoveId.BEAK_BLAST); await game.phaseInterceptor.to("BerryPhase", false); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.status?.effect).not.toBe(StatusEffect.BURN); }); }); diff --git a/test/moves/beat-up.test.ts b/test/moves/beat-up.test.ts index 79d672bd0ed..cfb3d35bed5 100644 --- a/test/moves/beat-up.test.ts +++ b/test/moves/beat-up.test.ts @@ -43,8 +43,8 @@ describe("Moves - Beat Up", () => { SpeciesId.EEVEE, ]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); let enemyStartingHp = enemyPokemon.hp; game.move.select(MoveId.BEAT_UP); @@ -71,7 +71,7 @@ describe("Moves - Beat Up", () => { SpeciesId.EEVEE, ]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.scene.getPlayerParty()[1].trySetStatus(StatusEffect.BURN); diff --git a/test/moves/belly-drum.test.ts b/test/moves/belly-drum.test.ts index 9cbb7adb1ae..827030c14aa 100644 --- a/test/moves/belly-drum.test.ts +++ b/test/moves/belly-drum.test.ts @@ -44,7 +44,7 @@ describe("Moves - BELLY DRUM", () => { test("raises the user's ATK stat stage to its max, at the cost of 1/2 of its maximum HP", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); game.move.select(MoveId.BELLY_DRUM); @@ -57,7 +57,7 @@ describe("Moves - BELLY DRUM", () => { test("will still take effect if an uninvolved stat stage is at max", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); // Here - Stat.ATK -> -3 and Stat.SPATK -> 6 @@ -75,7 +75,7 @@ describe("Moves - BELLY DRUM", () => { test("fails if the pokemon's ATK stat stage is at its maximum", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.setStatStage(Stat.ATK, 6); @@ -89,7 +89,7 @@ describe("Moves - BELLY DRUM", () => { test("fails if the user's health is less than 1/2", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); leadPokemon.hp = hpLost - PREDAMAGE; diff --git a/test/moves/burning-jealousy.test.ts b/test/moves/burning-jealousy.test.ts index 62f41790582..33ff855f31e 100644 --- a/test/moves/burning-jealousy.test.ts +++ b/test/moves/burning-jealousy.test.ts @@ -40,7 +40,7 @@ describe("Moves - Burning Jealousy", () => { it("should burn the opponent if their stat stages were raised", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.BURNING_JEALOUSY); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -53,7 +53,7 @@ describe("Moves - Burning Jealousy", () => { game.override.starterSpecies(0).battleStyle("double"); await game.classicMode.startBattle([SpeciesId.FEEBAS, SpeciesId.ABRA]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.BURNING_JEALOUSY); game.move.select(MoveId.GROWL, 1); @@ -67,7 +67,7 @@ describe("Moves - Burning Jealousy", () => { game.override.enemySpecies(SpeciesId.DITTO).enemyAbility(AbilityId.IMPOSTER).enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.BURNING_JEALOUSY); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/camouflage.test.ts b/test/moves/camouflage.test.ts index badab8ec4a5..b3f87be4715 100644 --- a/test/moves/camouflage.test.ts +++ b/test/moves/camouflage.test.ts @@ -37,7 +37,7 @@ describe("Moves - Camouflage", () => { it("Camouflage should look at terrain first when selecting a type to change into", async () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.CAMOUFLAGE); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); diff --git a/test/moves/ceaseless-edge.test.ts b/test/moves/ceaseless-edge.test.ts index 56d7c97ea68..64f4cf15511 100644 --- a/test/moves/ceaseless-edge.test.ts +++ b/test/moves/ceaseless-edge.test.ts @@ -42,7 +42,7 @@ describe("Moves - Ceaseless Edge", () => { test("move should hit and apply spikes", async () => { await game.classicMode.startBattle([SpeciesId.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyStartingHp = enemyPokemon.hp; @@ -64,7 +64,7 @@ describe("Moves - Ceaseless Edge", () => { game.override.startingHeldItems([{ name: "MULTI_LENS" }]); await game.classicMode.startBattle([SpeciesId.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyStartingHp = enemyPokemon.hp; diff --git a/test/moves/chilly-reception.test.ts b/test/moves/chilly-reception.test.ts index 948b42cb3f2..096454132f3 100644 --- a/test/moves/chilly-reception.test.ts +++ b/test/moves/chilly-reception.test.ts @@ -44,7 +44,7 @@ describe("Moves - Chilly Reception", () => { await game.toEndOfTurn(); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SNOW); - expect(game.scene.getPlayerPokemon()).toBe(meowth); + expect(game.field.getPlayerPokemon()).toBe(meowth); expect(slowking.isOnField()).toBe(false); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); expect(game.textInterceptor.logs).toContain( @@ -60,7 +60,7 @@ describe("Moves - Chilly Reception", () => { expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SNOW); expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()?.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); }); it("should still switch out even if weather cannot be changed", async () => { @@ -85,7 +85,7 @@ describe("Moves - Chilly Reception", () => { expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SNOW); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()).toBe(meowth); + expect(game.field.getPlayerPokemon()).toBe(meowth); expect(slowking.isOnField()).toBe(false); }); @@ -95,7 +95,7 @@ describe("Moves - Chilly Reception", () => { expect(game.scene.arena.weather?.weatherType).not.toBe(WeatherType.SNOW); - const slowking = game.scene.getPlayerPokemon()!; + const slowking = game.field.getPlayerPokemon(); game.move.select(MoveId.SNOWSCAPE); await game.toNextTurn(); @@ -108,7 +108,7 @@ describe("Moves - Chilly Reception", () => { expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SNOW); expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()).toBe(slowking); + expect(game.field.getPlayerPokemon()).toBe(slowking); expect(slowking.getLastXMoves()[0].result).toBe(MoveResult.FAIL); expect(game.textInterceptor.logs).toContain( i18next.t("moveTriggers:chillyReception", { pokemonName: getPokemonNameWithAffix(slowking) }), @@ -126,7 +126,7 @@ describe("Moves - Chilly Reception", () => { await game.toEndOfTurn(); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.SNOW); - expect(game.scene.getPlayerPokemon()).toBe(meowth); + expect(game.field.getPlayerPokemon()).toBe(meowth); expect(slowking.isOnField()).toBe(false); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); expect(game.textInterceptor.logs).not.toContain( diff --git a/test/moves/clangorous-soul.test.ts b/test/moves/clangorous-soul.test.ts index 82a0d383f65..2f1c7a18f50 100644 --- a/test/moves/clangorous-soul.test.ts +++ b/test/moves/clangorous-soul.test.ts @@ -41,7 +41,7 @@ describe("Moves - Clangorous Soul", () => { it("raises the user's ATK, DEF, SPATK, SPDEF, and SPD stat stages by 1 each at the cost of 1/3 of its maximum HP", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); game.move.select(MoveId.CLANGOROUS_SOUL); @@ -58,7 +58,7 @@ describe("Moves - Clangorous Soul", () => { it("will still take effect if one or more of the involved stat stages are not at max", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); //Here - Stat.SPD -> 0 and Stat.SPDEF -> 4 @@ -81,7 +81,7 @@ describe("Moves - Clangorous Soul", () => { it("fails if all stat stages involved are at max", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.setStatStage(Stat.ATK, 6); leadPokemon.setStatStage(Stat.DEF, 6); @@ -103,7 +103,7 @@ describe("Moves - Clangorous Soul", () => { it("fails if the user's health is less than 1/3", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO); leadPokemon.hp = hpLost - PREDAMAGE; diff --git a/test/moves/copycat.test.ts b/test/moves/copycat.test.ts index 91e941e2845..bfe4dd2f954 100644 --- a/test/moves/copycat.test.ts +++ b/test/moves/copycat.test.ts @@ -45,7 +45,7 @@ describe("Moves - Copycat", () => { game.move.select(MoveId.COPYCAT); // Last successful move should be Swords Dance await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(4); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(4); }); it("should fail when the last move used is not a valid Copycat move", async () => { @@ -58,7 +58,7 @@ describe("Moves - Copycat", () => { game.move.select(MoveId.COPYCAT); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should copy the called move when the last move successfully calls another", async () => { @@ -70,7 +70,7 @@ describe("Moves - Copycat", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); // Player moves first so enemy can copy Swords Dance await game.toNextTurn(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); expect(enemy.getLastXMoves()[0]).toMatchObject({ move: MoveId.SWORDS_DANCE, result: MoveResult.SUCCESS, @@ -87,6 +87,6 @@ describe("Moves - Copycat", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPDEF)).toBe(-2); + expect(game.field.getEnemyPokemon().getStatStage(Stat.SPDEF)).toBe(-2); }); }); diff --git a/test/moves/destiny-bond.test.ts b/test/moves/destiny-bond.test.ts index 48bd29fe662..9c397717335 100644 --- a/test/moves/destiny-bond.test.ts +++ b/test/moves/destiny-bond.test.ts @@ -48,15 +48,15 @@ describe("Moves - Destiny Bond", () => { game.override.moveset(moveToUse); await game.classicMode.startBattle(defaultParty); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(moveToUse); await game.setTurnOrder(enemyFirst); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.isFainted()).toBe(true); - expect(playerPokemon?.isFainted()).toBe(true); + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.isFainted()).toBe(true); }); it("should KO the opponent on the next turn", async () => { @@ -65,24 +65,24 @@ describe("Moves - Destiny Bond", () => { game.override.moveset([MoveId.SPLASH, moveToUse]); await game.classicMode.startBattle(defaultParty); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerPokemon = game.field.getPlayerPokemon(); // Turn 1: Enemy uses Destiny Bond and doesn't faint game.move.select(MoveId.SPLASH); await game.setTurnOrder(playerFirst); await game.toNextTurn(); - expect(enemyPokemon?.isFainted()).toBe(false); - expect(playerPokemon?.isFainted()).toBe(false); + expect(enemyPokemon.isFainted()).toBe(false); + expect(enemyPokemon.isFainted()).toBe(false); // Turn 2: Player KO's the enemy before the enemy's turn game.move.select(moveToUse); await game.setTurnOrder(playerFirst); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.isFainted()).toBe(true); - expect(playerPokemon?.isFainted()).toBe(true); + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.isFainted()).toBe(true); }); it("should fail if used twice in a row", async () => { @@ -91,24 +91,24 @@ describe("Moves - Destiny Bond", () => { game.override.moveset([MoveId.SPLASH, moveToUse]); await game.classicMode.startBattle(defaultParty); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerPokemon = game.field.getPlayerPokemon(); // Turn 1: Enemy uses Destiny Bond and doesn't faint game.move.select(MoveId.SPLASH); await game.setTurnOrder(enemyFirst); await game.toNextTurn(); - expect(enemyPokemon?.isFainted()).toBe(false); - expect(playerPokemon?.isFainted()).toBe(false); + expect(enemyPokemon.isFainted()).toBe(false); + expect(enemyPokemon.isFainted()).toBe(false); // Turn 2: Enemy should fail Destiny Bond then get KO'd game.move.select(moveToUse); await game.setTurnOrder(enemyFirst); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.isFainted()).toBe(true); - expect(playerPokemon?.isFainted()).toBe(false); + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.isFainted()).toBe(false); }); it("should not KO the opponent if the user dies to weather", async () => { @@ -118,15 +118,15 @@ describe("Moves - Destiny Bond", () => { game.override.moveset(moveToUse).ability(AbilityId.SAND_STREAM); await game.classicMode.startBattle(defaultParty); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(moveToUse); await game.setTurnOrder(enemyFirst); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.isFainted()).toBe(true); - expect(playerPokemon?.isFainted()).toBe(false); + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.isFainted()).toBe(false); }); it("should not KO the opponent if the user had another turn", async () => { @@ -135,25 +135,25 @@ describe("Moves - Destiny Bond", () => { game.override.moveset([MoveId.SPORE, moveToUse]); await game.classicMode.startBattle(defaultParty); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerPokemon = game.field.getPlayerPokemon(); // Turn 1: Enemy uses Destiny Bond and doesn't faint game.move.select(MoveId.SPORE); await game.setTurnOrder(enemyFirst); await game.toNextTurn(); - expect(enemyPokemon?.isFainted()).toBe(false); - expect(playerPokemon?.isFainted()).toBe(false); - expect(enemyPokemon?.status?.effect).toBe(StatusEffect.SLEEP); + expect(enemyPokemon.isFainted()).toBe(false); + expect(playerPokemon.isFainted()).toBe(false); + expect(enemyPokemon.status?.effect).toBe(StatusEffect.SLEEP); // Turn 2: Enemy should skip a turn due to sleep, then get KO'd game.move.select(moveToUse); await game.setTurnOrder(enemyFirst); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.isFainted()).toBe(true); - expect(playerPokemon?.isFainted()).toBe(false); + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.isFainted()).toBe(false); }); it("should not KO an ally", async () => { @@ -171,10 +171,10 @@ describe("Moves - Destiny Bond", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon0?.isFainted()).toBe(false); - expect(enemyPokemon1?.isFainted()).toBe(false); - expect(playerPokemon0?.isFainted()).toBe(true); - expect(playerPokemon1?.isFainted()).toBe(false); + expect(enemyPokemon0.isFainted()).toBe(false); + expect(enemyPokemon1.isFainted()).toBe(false); + expect(playerPokemon0.isFainted()).toBe(true); + expect(playerPokemon1.isFainted()).toBe(false); }); it("should not cause a crash if the user is KO'd by Ceaseless Edge", async () => { @@ -184,15 +184,15 @@ describe("Moves - Destiny Bond", () => { game.override.moveset(moveToUse); await game.classicMode.startBattle(defaultParty); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(moveToUse); await game.setTurnOrder(enemyFirst); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.isFainted()).toBe(true); - expect(playerPokemon?.isFainted()).toBe(true); + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.isFainted()).toBe(true); // Ceaseless Edge spikes effect should still activate const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag; @@ -235,20 +235,20 @@ describe("Moves - Destiny Bond", () => { game.override.moveset(moveToUse).startingHeldItems([{ name: "REVIVER_SEED" }]); await game.classicMode.startBattle(defaultParty); - const enemyPokemon = game.scene.getEnemyPokemon(); - const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(moveToUse); await game.setTurnOrder(enemyFirst); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.isFainted()).toBe(true); - expect(playerPokemon?.isFainted()).toBe(true); + expect(enemyPokemon.isFainted()).toBe(true); + expect(playerPokemon.isFainted()).toBe(true); // Check that the Tackle user's Reviver Seed did not activate const revSeeds = game.scene .getModifiers(PokemonInstantReviveModifier) - .filter(m => m.pokemonId === playerPokemon?.id); + .filter(m => m.pokemonId === playerPokemon.id); expect(revSeeds.length).toBe(1); }); }); diff --git a/test/moves/diamond-storm.test.ts b/test/moves/diamond-storm.test.ts index 9de7409ca18..ffd3c62420e 100644 --- a/test/moves/diamond-storm.test.ts +++ b/test/moves/diamond-storm.test.ts @@ -41,6 +41,6 @@ describe("Moves - Diamond Storm", () => { game.move.select(MoveId.DIAMOND_STORM); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.DEF)).toBe(2); + expect(game.field.getPlayerPokemon().getStatStage(Stat.DEF)).toBe(2); }); }); diff --git a/test/moves/dig.test.ts b/test/moves/dig.test.ts index 2cb8ae05963..fcc593b75da 100644 --- a/test/moves/dig.test.ts +++ b/test/moves/dig.test.ts @@ -38,8 +38,8 @@ describe("Moves - Dig", () => { it("should make the user semi-invulnerable, then attack over 2 turns", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DIG); await game.phaseInterceptor.to("TurnEndPhase"); @@ -62,7 +62,7 @@ describe("Moves - Dig", () => { game.override.moveset([]); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.changeMoveset(playerPokemon, MoveId.DIG); game.move.select(MoveId.DIG); @@ -80,8 +80,8 @@ describe("Moves - Dig", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DIG); @@ -95,7 +95,7 @@ describe("Moves - Dig", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.DIG); @@ -110,8 +110,8 @@ describe("Moves - Dig", () => { it("should cause the user to take double damage from Earthquake", async () => { await game.classicMode.startBattle([SpeciesId.DONDOZO]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); const preDigEarthquakeDmg = playerPokemon.getAttackDamage({ source: enemyPokemon, diff --git a/test/moves/disable.test.ts b/test/moves/disable.test.ts index 5543c16fecf..9b5763bf90b 100644 --- a/test/moves/disable.test.ts +++ b/test/moves/disable.test.ts @@ -132,7 +132,7 @@ describe("Moves - Disable", () => { vi.spyOn(RandomMoveAttr.prototype, "getMoveOverride").mockReturnValue(MoveId.ABSORB); await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const playerMon = game.scene.getPlayerPokemon()!; + const playerMon = game.field.getPlayerPokemon(); playerMon.pushMoveHistory({ move: MoveId.SPLASH, targets: [BattlerIndex.ENEMY], useMode: MoveUseMode.NORMAL }); game.scene.currentBattle.lastMove = MoveId.SPLASH; @@ -141,7 +141,7 @@ describe("Moves - Disable", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - const enemyMon = game.scene.getEnemyPokemon()!; + const enemyMon = game.field.getEnemyPokemon(); expect(enemyMon.isMoveRestricted(moveId), `calling move ${MoveId[moveId]} was not disabled`).toBe(true); expect(enemyMon.getLastXMoves(-1)).toHaveLength(2); const calledMove = enemyMon.getLastXMoves()[0].move; diff --git a/test/moves/dive.test.ts b/test/moves/dive.test.ts index c34f3dc54dc..6464cb110b4 100644 --- a/test/moves/dive.test.ts +++ b/test/moves/dive.test.ts @@ -38,8 +38,8 @@ describe("Moves - Dive", () => { it("should make the user semi-invulnerable, then attack over 2 turns", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DIVE); @@ -64,8 +64,8 @@ describe("Moves - Dive", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DIVE); @@ -79,7 +79,7 @@ describe("Moves - Dive", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.DIVE); @@ -96,8 +96,8 @@ describe("Moves - Dive", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DIVE); @@ -113,8 +113,8 @@ describe("Moves - Dive", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DIVE); diff --git a/test/moves/doodle.test.ts b/test/moves/doodle.test.ts index c4380720f20..8b90d120b24 100644 --- a/test/moves/doodle.test.ts +++ b/test/moves/doodle.test.ts @@ -39,7 +39,7 @@ describe("Moves - Doodle", () => { game.move.select(MoveId.DOODLE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(AbilityId.BALL_FETCH); + expect(game.field.getPlayerPokemon().getAbility().id).toBe(AbilityId.BALL_FETCH); }); it("should copy the opponent's ability to itself and its ally in doubles", async () => { @@ -64,6 +64,6 @@ describe("Moves - Doodle", () => { await game.phaseInterceptor.to("BerryPhase"); // Enemies should have been intimidated twice - expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-2); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-2); }); }); diff --git a/test/moves/double-team.test.ts b/test/moves/double-team.test.ts index 9276a0956e8..6d471df2d57 100644 --- a/test/moves/double-team.test.ts +++ b/test/moves/double-team.test.ts @@ -36,8 +36,8 @@ describe("Moves - Double Team", () => { it("raises the user's EVA stat stage by 1", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const ally = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const ally = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getAccuracyMultiplier"); expect(ally.getStatStage(Stat.EVA)).toBe(0); diff --git a/test/moves/dragon-rage.test.ts b/test/moves/dragon-rage.test.ts index 1b850ade488..c90e2b78abd 100644 --- a/test/moves/dragon-rage.test.ts +++ b/test/moves/dragon-rage.test.ts @@ -47,7 +47,7 @@ describe("Moves - Dragon Rage", () => { await game.classicMode.startBattle(); partyPokemon = game.scene.getPlayerParty()[0]; - enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon = game.field.getEnemyPokemon(); }); it("ignores weaknesses", async () => { diff --git a/test/moves/dragon-tail.test.ts b/test/moves/dragon-tail.test.ts index 487647784f7..1cea6f908a0 100644 --- a/test/moves/dragon-tail.test.ts +++ b/test/moves/dragon-tail.test.ts @@ -41,7 +41,7 @@ describe("Moves - Dragon Tail", () => { it("should cause opponent to flee, and not crash", async () => { await game.classicMode.startBattle([SpeciesId.DRATINI]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DRAGON_TAIL); @@ -59,8 +59,8 @@ describe("Moves - Dragon Tail", () => { game.override.enemyAbility(AbilityId.ROUGH_SKIN); await game.classicMode.startBattle([SpeciesId.DRATINI]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.DRAGON_TAIL); @@ -132,7 +132,7 @@ describe("Moves - Dragon Tail", () => { game.override.enemyAbility(AbilityId.SUCTION_CUPS); await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.DRAGON_TAIL); await game.phaseInterceptor.to("TurnEndPhase"); @@ -149,7 +149,7 @@ describe("Moves - Dragon Tail", () => { await game.toNextTurn(); // Make sure the enemy switched to a healthy Pokemon - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); expect(enemy).toBeDefined(); expect(enemy.isFullHp()).toBe(true); @@ -171,7 +171,7 @@ describe("Moves - Dragon Tail", () => { await game.toNextTurn(); // Make sure the enemy field is not empty and has a revived Pokemon - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); expect(enemy).toBeDefined(); expect(enemy.hp).toBe(Math.floor(enemy.getMaxHp() / 2)); expect(game.scene.getEnemyField().length).toBe(1); @@ -189,7 +189,7 @@ describe("Moves - Dragon Tail", () => { await game.toNextTurn(); // Make sure the player's field is not empty and has a revived Pokemon - const dratini = game.scene.getPlayerPokemon()!; + const dratini = game.field.getPlayerPokemon(); expect(dratini).toBeDefined(); expect(dratini.hp).toBe(Math.floor(dratini.getMaxHp() / 2)); expect(game.scene.getPlayerField().length).toBe(1); diff --git a/test/moves/electrify.test.ts b/test/moves/electrify.test.ts index 19a2fdfb7a2..10ae2fcd939 100644 --- a/test/moves/electrify.test.ts +++ b/test/moves/electrify.test.ts @@ -36,8 +36,8 @@ describe("Moves - Electrify", () => { it("should convert attacks to Electric type", async () => { await game.classicMode.startBattle([SpeciesId.EXCADRILL]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(enemyPokemon, "getMoveType"); game.move.select(MoveId.ELECTRIFY); @@ -54,8 +54,8 @@ describe("Moves - Electrify", () => { await game.classicMode.startBattle([SpeciesId.EXCADRILL]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getPlayerPokemon(); vi.spyOn(enemyPokemon, "getMoveType"); game.move.select(MoveId.ELECTRIFY); diff --git a/test/moves/electro-shot.test.ts b/test/moves/electro-shot.test.ts index e5031fefb3d..4b1303fc930 100644 --- a/test/moves/electro-shot.test.ts +++ b/test/moves/electro-shot.test.ts @@ -38,8 +38,8 @@ describe("Moves - Electro Shot", () => { it("should increase the user's Sp. Atk on the first turn, then attack on the second turn", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.ELECTRO_SHOT); @@ -68,8 +68,8 @@ describe("Moves - Electro Shot", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.ELECTRO_SHOT); @@ -91,7 +91,7 @@ describe("Moves - Electro Shot", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.ELECTRO_SHOT); diff --git a/test/moves/encore.test.ts b/test/moves/encore.test.ts index 1b0e2ed03f2..0840346c3b1 100644 --- a/test/moves/encore.test.ts +++ b/test/moves/encore.test.ts @@ -39,7 +39,7 @@ describe("Moves - Encore", () => { it("should prevent the target from using any move except the last used move", async () => { await game.classicMode.startBattle([SpeciesId.SNORLAX]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.ENCORE); await game.move.selectEnemyMove(MoveId.SPLASH); @@ -67,8 +67,8 @@ describe("Moves - Encore", () => { await game.classicMode.startBattle([SpeciesId.SNORLAX]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); if (delay) { game.move.select(MoveId.SPLASH); @@ -92,23 +92,23 @@ describe("Moves - Encore", () => { game.override.moveset([MoveId.ENCORE, MoveId.TORMENT, MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemyPokemon = game.scene.getEnemyPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.ENCORE); await game.setTurnOrder(turnOrder); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.getTag(BattlerTagType.ENCORE)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.ENCORE)).toBeDefined(); await game.toNextTurn(); game.move.select(MoveId.TORMENT); await game.setTurnOrder(turnOrder); await game.phaseInterceptor.to("BerryPhase"); - expect(enemyPokemon?.getTag(BattlerTagType.TORMENT)).toBeDefined(); + expect(enemyPokemon.getTag(BattlerTagType.TORMENT)).toBeDefined(); await game.toNextTurn(); game.move.select(MoveId.SPLASH); await game.setTurnOrder(turnOrder); await game.phaseInterceptor.to("BerryPhase"); - const lastMove = enemyPokemon?.getLastXMoves()[0]; + const lastMove = enemyPokemon.getLastXMoves()[0]; expect(lastMove?.move).toBe(MoveId.STRUGGLE); }); }); diff --git a/test/moves/endure.test.ts b/test/moves/endure.test.ts index 71a16ef4cc1..e591c82466c 100644 --- a/test/moves/endure.test.ts +++ b/test/moves/endure.test.ts @@ -38,7 +38,7 @@ describe("Moves - Endure", () => { game.move.select(MoveId.THUNDER); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.hp).toBe(1); + expect(game.field.getEnemyPokemon().hp).toBe(1); }); it("should let the pokemon survive with 1 HP when hit with a multihit move", async () => { @@ -47,12 +47,12 @@ describe("Moves - Endure", () => { game.move.select(MoveId.BULLET_SEED); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.hp).toBe(1); + expect(game.field.getEnemyPokemon().hp).toBe(1); }); it("should let the pokemon survive against OHKO moves", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.SHEER_COLD); await game.phaseInterceptor.to("TurnEndPhase"); @@ -75,7 +75,7 @@ describe("Moves - Endure", () => { .moveset(move) .enemyMoveset(MoveId.ENDURE); await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.damageAndUpdate(enemy.hp - 1); game.move.select(move); diff --git a/test/moves/entrainment.test.ts b/test/moves/entrainment.test.ts index c96cacc8d0b..8d5d69458cb 100644 --- a/test/moves/entrainment.test.ts +++ b/test/moves/entrainment.test.ts @@ -38,7 +38,7 @@ describe("Moves - Entrainment", () => { game.move.select(MoveId.ENTRAINMENT); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(AbilityId.ADAPTABILITY); + expect(game.field.getEnemyPokemon().getAbility().id).toBe(AbilityId.ADAPTABILITY); }); it("should activate post-summon abilities", async () => { @@ -48,6 +48,6 @@ describe("Moves - Entrainment", () => { game.move.select(MoveId.ENTRAINMENT); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(-1); }); }); diff --git a/test/moves/fake-out.test.ts b/test/moves/fake-out.test.ts index 8db73681f05..22ff8e2c304 100644 --- a/test/moves/fake-out.test.ts +++ b/test/moves/fake-out.test.ts @@ -33,7 +33,7 @@ describe("Moves - Fake Out", () => { it("should only work the first turn a pokemon is sent out in a battle", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const corv = game.scene.getEnemyPokemon()!; + const corv = game.field.getEnemyPokemon(); game.move.select(MoveId.FAKE_OUT); await game.toNextTurn(); @@ -52,14 +52,14 @@ describe("Moves - Fake Out", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); // set hp to 1 for easy knockout - game.scene.getEnemyPokemon()!.hp = 1; + game.field.getEnemyPokemon().hp = 1; game.move.select(MoveId.FAKE_OUT); await game.toNextWave(); game.move.select(MoveId.FAKE_OUT); await game.toNextTurn(); - const corv = game.scene.getEnemyPokemon()!; + const corv = game.field.getEnemyPokemon(); expect(corv).toBeDefined(); expect(corv?.hp).toBeLessThan(corv?.getMaxHp()); }); @@ -69,14 +69,14 @@ describe("Moves - Fake Out", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); // set hp to 1 for easy knockout - game.scene.getEnemyPokemon()!.hp = 1; + game.field.getEnemyPokemon().hp = 1; game.move.select(MoveId.FAKE_OUT); await game.toNextWave(); game.move.select(MoveId.FAKE_OUT); await game.toNextTurn(); - const corv = game.scene.getEnemyPokemon()!; + const corv = game.field.getEnemyPokemon(); expect(corv).toBeDefined(); expect(corv.hp).toBeLessThan(corv.getMaxHp()); }); @@ -87,7 +87,7 @@ describe("Moves - Fake Out", () => { game.move.select(MoveId.FAKE_OUT); await game.toNextTurn(); - const corv = game.scene.getEnemyPokemon()!; + const corv = game.field.getEnemyPokemon(); expect(corv.hp).toBeLessThan(corv.getMaxHp()); corv.hp = corv.getMaxHp(); diff --git a/test/moves/false-swipe.test.ts b/test/moves/false-swipe.test.ts index 30547036e69..40408ad523b 100644 --- a/test/moves/false-swipe.test.ts +++ b/test/moves/false-swipe.test.ts @@ -36,8 +36,8 @@ describe("Moves - False Swipe", () => { it("should reduce the target to 1 HP", async () => { await game.classicMode.startBattle([SpeciesId.MILOTIC]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.FALSE_SWIPE); await game.toNextTurn(); diff --git a/test/moves/fell-stinger.test.ts b/test/moves/fell-stinger.test.ts index 9f482202c47..ede70b7af9b 100644 --- a/test/moves/fell-stinger.test.ts +++ b/test/moves/fell-stinger.test.ts @@ -41,7 +41,7 @@ describe("Moves - Fell Stinger", () => { game.override.enemyMoveset([MoveId.DOUBLE_EDGE]); await game.classicMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.FELL_STINGER); await game.phaseInterceptor.to("VictoryPhase"); @@ -53,7 +53,7 @@ describe("Moves - Fell Stinger", () => { game.override.enemyMoveset(MoveId.SPLASH).enemyStatusEffect(StatusEffect.BURN); await game.classicMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.FELL_STINGER); await game.phaseInterceptor.to("VictoryPhase"); @@ -65,7 +65,7 @@ describe("Moves - Fell Stinger", () => { game.override.weather(WeatherType.HAIL); await game.classicMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.FELL_STINGER); @@ -78,7 +78,7 @@ describe("Moves - Fell Stinger", () => { game.override.enemyPassiveAbility(AbilityId.STURDY).enemyAbility(AbilityId.DRY_SKIN).weather(WeatherType.HARSH_SUN); await game.challengeMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.FELL_STINGER); @@ -91,7 +91,7 @@ describe("Moves - Fell Stinger", () => { game.override.enemyAbility(AbilityId.BALL_FETCH).enemyHeldItems([{ name: "REVIVER_SEED" }]); await game.classicMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.FELL_STINGER); await game.phaseInterceptor.to("TurnEndPhase"); @@ -106,7 +106,7 @@ describe("Moves - Fell Stinger", () => { vi.spyOn(fellStinger, "power", "get").mockReturnValue(50000); await game.classicMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const leftEnemy = game.scene.getEnemyField()[0]!; // Turn 1: set Salt Cure, enemy splashes and does nothing @@ -129,7 +129,7 @@ describe("Moves - Fell Stinger", () => { vi.spyOn(allMoves[MoveId.FELL_STINGER], "power", "get").mockReturnValue(50000); await game.classicMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const leftEnemy = game.scene.getEnemyField()[0]!; // Turn 1: set Bind, enemy splashes and does nothing @@ -152,7 +152,7 @@ describe("Moves - Fell Stinger", () => { vi.spyOn(allMoves[MoveId.FELL_STINGER], "power", "get").mockReturnValue(50000); await game.classicMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const leftEnemy = game.scene.getEnemyField()[0]!; // Turn 1: set Leech Seed, enemy splashes and does nothing @@ -173,11 +173,11 @@ describe("Moves - Fell Stinger", () => { game.override.enemyAbility(AbilityId.KLUTZ); await game.classicMode.startBattle([SpeciesId.LEAVANNY]); - const leadPokemon = game.scene.getPlayerPokemon(); + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.FELL_STINGER); await game.phaseInterceptor.to("TurnEndPhase"); - expect(leadPokemon?.getStatStage(Stat.ATK)).toBe(3); + expect(leadPokemon.getStatStage(Stat.ATK)).toBe(3); }); }); diff --git a/test/moves/fillet-away.test.ts b/test/moves/fillet-away.test.ts index c4c87e1d00e..e6eb003c9ea 100644 --- a/test/moves/fillet-away.test.ts +++ b/test/moves/fillet-away.test.ts @@ -42,7 +42,7 @@ describe("Moves - FILLET AWAY", () => { test("raises the user's ATK, SPATK, and SPD stat stages by 2 each, at the cost of 1/2 of its maximum HP", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); game.move.select(MoveId.FILLET_AWAY); @@ -57,7 +57,7 @@ describe("Moves - FILLET AWAY", () => { test("still takes effect if one or more of the involved stat stages are not at max", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); //Here - Stat.SPD -> 0 and Stat.SPATK -> 3 @@ -76,7 +76,7 @@ describe("Moves - FILLET AWAY", () => { test("fails if all stat stages involved are at max", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.setStatStage(Stat.ATK, 6); leadPokemon.setStatStage(Stat.SPATK, 6); @@ -94,7 +94,7 @@ describe("Moves - FILLET AWAY", () => { test("fails if the user's health is less than 1/2", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO); leadPokemon.hp = hpLost - PREDAMAGE; diff --git a/test/moves/fissure.test.ts b/test/moves/fissure.test.ts index 8a8673811ce..b22b81906a6 100644 --- a/test/moves/fissure.test.ts +++ b/test/moves/fissure.test.ts @@ -43,7 +43,7 @@ describe("Moves - Fissure", () => { await game.classicMode.startBattle(); partyPokemon = game.scene.getPlayerParty()[0]; - enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon = game.field.getEnemyPokemon(); }); it("ignores damage modification from abilities, for example FUR_COAT", async () => { diff --git a/test/moves/flower-shield.test.ts b/test/moves/flower-shield.test.ts index 425d0443ca7..5fc671895d3 100644 --- a/test/moves/flower-shield.test.ts +++ b/test/moves/flower-shield.test.ts @@ -38,8 +38,8 @@ describe("Moves - Flower Shield", () => { game.override.enemySpecies(SpeciesId.CHERRIM); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const cherrim = game.scene.getEnemyPokemon()!; - const magikarp = game.scene.getPlayerPokemon()!; + const cherrim = game.field.getEnemyPokemon(); + const magikarp = game.field.getPlayerPokemon(); expect(magikarp.getStatStage(Stat.DEF)).toBe(0); expect(cherrim.getStatStage(Stat.DEF)).toBe(0); @@ -78,8 +78,8 @@ describe("Moves - Flower Shield", () => { game.override.enemySpecies(SpeciesId.PARAS).enemyMoveset(MoveId.DIG).enemyLevel(50); await game.classicMode.startBattle([SpeciesId.CHERRIM]); - const paras = game.scene.getEnemyPokemon()!; - const cherrim = game.scene.getPlayerPokemon()!; + const paras = game.field.getEnemyPokemon(); + const cherrim = game.field.getPlayerPokemon(); expect(paras.getStatStage(Stat.DEF)).toBe(0); expect(cherrim.getStatStage(Stat.DEF)).toBe(0); @@ -97,8 +97,8 @@ describe("Moves - Flower Shield", () => { game.override.enemySpecies(SpeciesId.MAGIKARP); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyPokemon()!; - const ally = game.scene.getPlayerPokemon()!; + const enemy = game.field.getEnemyPokemon(); + const ally = game.field.getPlayerPokemon(); expect(enemy.getStatStage(Stat.DEF)).toBe(0); expect(ally.getStatStage(Stat.DEF)).toBe(0); diff --git a/test/moves/fly.test.ts b/test/moves/fly.test.ts index 3682fce3d0c..dc40b4a439b 100644 --- a/test/moves/fly.test.ts +++ b/test/moves/fly.test.ts @@ -41,8 +41,8 @@ describe("Moves - Fly", () => { it("should make the user semi-invulnerable, then attack over 2 turns", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.FLY); @@ -67,8 +67,8 @@ describe("Moves - Fly", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.FLY); @@ -82,7 +82,7 @@ describe("Moves - Fly", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.FLY); @@ -99,8 +99,8 @@ describe("Moves - Fly", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.FLY); diff --git a/test/moves/focus-punch.test.ts b/test/moves/focus-punch.test.ts index c67053ef7ec..9a76dbec0db 100644 --- a/test/moves/focus-punch.test.ts +++ b/test/moves/focus-punch.test.ts @@ -41,8 +41,8 @@ describe("Moves - Focus Punch", () => { it("should deal damage at the end of turn if uninterrupted", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); const enemyStartingHp = enemyPokemon.hp; @@ -65,8 +65,8 @@ describe("Moves - Focus Punch", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); const enemyStartingHp = enemyPokemon.hp; @@ -89,8 +89,8 @@ describe("Moves - Focus Punch", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.FOCUS_PUNCH); diff --git a/test/moves/foresight.test.ts b/test/moves/foresight.test.ts index c3b29d8fabb..7de628ba172 100644 --- a/test/moves/foresight.test.ts +++ b/test/moves/foresight.test.ts @@ -33,7 +33,7 @@ describe("Moves - Foresight", () => { it("should allow Normal and Fighting moves to hit Ghost types", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.QUICK_ATTACK); await game.toNextTurn(); @@ -57,7 +57,7 @@ describe("Moves - Foresight", () => { game.override.enemyMoveset([MoveId.MINIMIZE]); await game.classicMode.startBattle(); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); vi.spyOn(pokemon, "getAccuracyMultiplier"); game.move.select(MoveId.FORESIGHT); diff --git a/test/moves/forests-curse.test.ts b/test/moves/forests-curse.test.ts index 4467a5c4037..db88c1f79c4 100644 --- a/test/moves/forests-curse.test.ts +++ b/test/moves/forests-curse.test.ts @@ -35,13 +35,13 @@ describe("Moves - Forest's Curse", () => { it("will replace the added type from Trick Or Treat", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemyPokemon = game.scene.getEnemyPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.TRICK_OR_TREAT); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon!.summonData.addedType).toBe(PokemonType.GHOST); + expect(enemyPokemon.summonData.addedType).toBe(PokemonType.GHOST); game.move.select(MoveId.FORESTS_CURSE); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon?.summonData.addedType).toBe(PokemonType.GRASS); + expect(enemyPokemon.summonData.addedType).toBe(PokemonType.GRASS); }); }); diff --git a/test/moves/freeze-dry.test.ts b/test/moves/freeze-dry.test.ts index 5d84d6be795..0b22d4f0997 100644 --- a/test/moves/freeze-dry.test.ts +++ b/test/moves/freeze-dry.test.ts @@ -36,7 +36,7 @@ describe("Moves - Freeze-Dry", () => { it("should deal 2x damage to pure water types", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -50,7 +50,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemySpecies(SpeciesId.WINGULL); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -64,7 +64,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemySpecies(SpeciesId.VOLCANION); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -85,7 +85,7 @@ describe("Moves - Freeze-Dry", () => { .moveset([MoveId.SOAK, MoveId.FREEZE_DRY]); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.SOAK); @@ -103,7 +103,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemySpecies(SpeciesId.QUAGSIRE); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FORESTS_CURSE); @@ -120,7 +120,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemySpecies(SpeciesId.SKARMORY); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.teraType = PokemonType.WATER; enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); @@ -136,7 +136,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemySpecies(SpeciesId.PELIPPER); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.teraType = PokemonType.FIRE; enemy.isTerastallized = true; vi.spyOn(enemy, "getMoveEffectiveness"); @@ -152,7 +152,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemySpecies(SpeciesId.TERAPAGOS).enemyAbility(AbilityId.TERA_SHELL); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.SOAK); @@ -169,7 +169,7 @@ describe("Moves - Freeze-Dry", () => { game.override.ability(AbilityId.NORMALIZE); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -183,7 +183,7 @@ describe("Moves - Freeze-Dry", () => { game.override.ability(AbilityId.NORMALIZE).enemySpecies(SpeciesId.SHIELDON); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -197,7 +197,7 @@ describe("Moves - Freeze-Dry", () => { game.override.ability(AbilityId.NORMALIZE).enemySpecies(SpeciesId.JELLICENT); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -211,7 +211,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemyMoveset([MoveId.ELECTRIFY]); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -225,7 +225,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemyMoveset([MoveId.ELECTRIFY]).enemySpecies(SpeciesId.GYARADOS); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -239,7 +239,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemyMoveset([MoveId.ELECTRIFY]).enemySpecies(SpeciesId.BARBOACH); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -253,7 +253,7 @@ describe("Moves - Freeze-Dry", () => { game.override.enemyMoveset([MoveId.ELECTRIFY]).enemySpecies(SpeciesId.FLAPPLE); await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -269,7 +269,7 @@ describe("Moves - Freeze-Dry", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -285,7 +285,7 @@ describe("Moves - Freeze-Dry", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -301,7 +301,7 @@ describe("Moves - Freeze-Dry", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); @@ -318,7 +318,7 @@ describe("Moves - Freeze-Dry", () => { await game.challengeMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); game.move.select(MoveId.FREEZE_DRY); diff --git a/test/moves/freezy-frost.test.ts b/test/moves/freezy-frost.test.ts index 8a8a47013ca..e25c29c9302 100644 --- a/test/moves/freezy-frost.test.ts +++ b/test/moves/freezy-frost.test.ts @@ -37,8 +37,8 @@ describe("Moves - Freezy Frost", () => { it("should clear stat changes of user and opponent", async () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const user = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const user = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.HOWL); await game.toNextTurn(); @@ -56,7 +56,7 @@ describe("Moves - Freezy Frost", () => { it("should clear all stat changes even when enemy uses the move", async () => { game.override.enemyMoveset(MoveId.FREEZY_FROST); await game.classicMode.startBattle([SpeciesId.SHUCKLE]); // Shuckle for slower Howl on first turn so Freezy Frost doesn't affect it. - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); game.move.select(MoveId.HOWL); await game.toNextTurn(); diff --git a/test/moves/fusion-bolt.test.ts b/test/moves/fusion-bolt.test.ts index aa8073c4c1f..9594dcfd15c 100644 --- a/test/moves/fusion-bolt.test.ts +++ b/test/moves/fusion-bolt.test.ts @@ -37,7 +37,7 @@ describe("Moves - Fusion Bolt", () => { it("should not make contact", async () => { await game.classicMode.startBattle([SpeciesId.ZEKROM]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); const initialHp = partyMember.hp; game.move.select(fusionBolt); diff --git a/test/moves/fusion-flare.test.ts b/test/moves/fusion-flare.test.ts index be8ce4eeec4..dd8ae11683d 100644 --- a/test/moves/fusion-flare.test.ts +++ b/test/moves/fusion-flare.test.ts @@ -37,7 +37,7 @@ describe("Moves - Fusion Flare", () => { it("should thaw freeze status condition", async () => { await game.classicMode.startBattle([SpeciesId.RESHIRAM]); - const partyMember = game.scene.getPlayerPokemon()!; + const partyMember = game.field.getPlayerPokemon(); game.move.select(fusionFlare); diff --git a/test/moves/geomancy.test.ts b/test/moves/geomancy.test.ts index b01ad756f9b..df5bb1b4b97 100644 --- a/test/moves/geomancy.test.ts +++ b/test/moves/geomancy.test.ts @@ -37,7 +37,7 @@ describe("Moves - Geomancy", () => { it("should boost the user's stats on the second turn of use", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); const affectedStats: EffectiveStat[] = [Stat.SPATK, Stat.SPDEF, Stat.SPD]; game.move.select(MoveId.GEOMANCY); @@ -58,7 +58,7 @@ describe("Moves - Geomancy", () => { it("should execute over 2 turns between waves", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); const affectedStats: EffectiveStat[] = [Stat.SPATK, Stat.SPDEF, Stat.SPD]; game.move.select(MoveId.GEOMANCY); diff --git a/test/moves/gigaton-hammer.test.ts b/test/moves/gigaton-hammer.test.ts index 6043f9d7f51..e5009310de6 100644 --- a/test/moves/gigaton-hammer.test.ts +++ b/test/moves/gigaton-hammer.test.ts @@ -35,7 +35,7 @@ describe("Moves - Gigaton Hammer", () => { it("can't be used two turns in a row", async () => { await game.classicMode.startBattle(); - const enemy1 = game.scene.getEnemyPokemon()!; + const enemy1 = game.field.getEnemyPokemon(); game.move.select(MoveId.GIGATON_HAMMER); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -49,7 +49,7 @@ describe("Moves - Gigaton Hammer", () => { game.move.select(MoveId.GIGATON_HAMMER); await game.toNextTurn(); - const enemy2 = game.scene.getEnemyPokemon()!; + const enemy2 = game.field.getEnemyPokemon(); expect(enemy2.hp).toBe(enemy2.getMaxHp()); }); @@ -58,7 +58,7 @@ describe("Moves - Gigaton Hammer", () => { game.override.startingWave(4); await game.classicMode.startBattle(); - const enemy1 = game.scene.getEnemyPokemon()!; + const enemy1 = game.field.getEnemyPokemon(); game.move.select(MoveId.GIGATON_HAMMER); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -72,7 +72,7 @@ describe("Moves - Gigaton Hammer", () => { game.move.select(MoveId.GIGATON_HAMMER); await game.toNextTurn(); - const enemy2 = game.scene.getEnemyPokemon()!; + const enemy2 = game.field.getEnemyPokemon(); expect(enemy2.hp).toBeLessThan(enemy2.getMaxHp()); }); diff --git a/test/moves/glaive-rush.test.ts b/test/moves/glaive-rush.test.ts index f20abd68500..c16bd338932 100644 --- a/test/moves/glaive-rush.test.ts +++ b/test/moves/glaive-rush.test.ts @@ -35,7 +35,7 @@ describe("Moves - Glaive Rush", () => { it("takes double damage from attacks", async () => { await game.classicMode.startBattle([SpeciesId.KLINK]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1000; game.move.select(MoveId.SHADOW_SNEAK); @@ -50,7 +50,7 @@ describe("Moves - Glaive Rush", () => { it("always gets hit by attacks", async () => { await game.classicMode.startBattle([SpeciesId.KLINK]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1000; allMoves[MoveId.AVALANCHE].accuracy = 0; @@ -63,8 +63,8 @@ describe("Moves - Glaive Rush", () => { game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]).enemyMoveset([MoveId.AVALANCHE]); await game.classicMode.startBattle([SpeciesId.KLINK]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1000; player.hp = 1000; @@ -83,8 +83,8 @@ describe("Moves - Glaive Rush", () => { game.override.enemyMoveset([MoveId.SHADOW_SNEAK]); await game.classicMode.startBattle([SpeciesId.KLINK]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1000; player.hp = 1000; @@ -108,8 +108,8 @@ describe("Moves - Glaive Rush", () => { game.override.enemyMoveset([MoveId.SHADOW_SNEAK]); await game.classicMode.startBattle([SpeciesId.KLINK, SpeciesId.FEEBAS]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1000; allMoves[MoveId.SHADOW_SNEAK].accuracy = 0; @@ -131,8 +131,8 @@ describe("Moves - Glaive Rush", () => { .enemyMoveset([MoveId.GLAIVE_RUSH, MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.KLINK]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.hp = 1000; player.hp = 1000; diff --git a/test/moves/growth.test.ts b/test/moves/growth.test.ts index 5737f32d891..4c892f0dee2 100644 --- a/test/moves/growth.test.ts +++ b/test/moves/growth.test.ts @@ -35,7 +35,7 @@ describe("Moves - Growth", () => { it("should raise SPATK stat stage by 1", async () => { await game.classicMode.startBattle([SpeciesId.MIGHTYENA]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0); diff --git a/test/moves/grudge.test.ts b/test/moves/grudge.test.ts index d9e2f4f8320..cc75024bfbf 100644 --- a/test/moves/grudge.test.ts +++ b/test/moves/grudge.test.ts @@ -1,5 +1,6 @@ import { AbilityId } from "#enums/ability-id"; import { BattlerIndex } from "#enums/battler-index"; +import { BattlerTagType } from "#enums/battler-tag-type"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; import { WeatherType } from "#enums/weather-type"; @@ -59,6 +60,8 @@ describe("Moves - Grudge", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); + expect(ratatta).toHaveBattlerTag(BattlerTagType.GRUDGE); + game.move.use(MoveId.GUILLOTINE); await game.move.forceEnemyMove(MoveId.SPLASH); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); diff --git a/test/moves/guard-split.test.ts b/test/moves/guard-split.test.ts index fa5dc162a6c..316807f68aa 100644 --- a/test/moves/guard-split.test.ts +++ b/test/moves/guard-split.test.ts @@ -36,8 +36,8 @@ describe("Moves - Guard Split", () => { game.override.enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.INDEEDEE]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); const avgDef = Math.floor((player.getStat(Stat.DEF, false) + enemy.getStat(Stat.DEF, false)) / 2); const avgSpDef = Math.floor((player.getStat(Stat.SPDEF, false) + enemy.getStat(Stat.SPDEF, false)) / 2); @@ -56,8 +56,8 @@ describe("Moves - Guard Split", () => { game.override.enemyMoveset([MoveId.GUARD_SPLIT]); await game.classicMode.startBattle([SpeciesId.INDEEDEE]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); const avgDef = Math.floor((player.getStat(Stat.DEF, false) + enemy.getStat(Stat.DEF, false)) / 2); const avgSpDef = Math.floor((player.getStat(Stat.SPDEF, false) + enemy.getStat(Stat.SPDEF, false)) / 2); diff --git a/test/moves/guard-swap.test.ts b/test/moves/guard-swap.test.ts index e7f8ed1df91..4d30c437a66 100644 --- a/test/moves/guard-swap.test.ts +++ b/test/moves/guard-swap.test.ts @@ -36,8 +36,8 @@ describe("Moves - Guard Swap", () => { it("should swap the user's DEF and SPDEF stat stages with the target's", async () => { await game.classicMode.startBattle([SpeciesId.INDEEDEE]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(1)); diff --git a/test/moves/hard-press.test.ts b/test/moves/hard-press.test.ts index f269373e697..70563052b98 100644 --- a/test/moves/hard-press.test.ts +++ b/test/moves/hard-press.test.ts @@ -49,7 +49,7 @@ describe("Moves - Hard Press", () => { it("should return 50 power if target HP ratio is at 50%", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); const targetHpRatio = 0.5; - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); @@ -62,7 +62,7 @@ describe("Moves - Hard Press", () => { it("should return 1 power if target HP ratio is at 1%", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); const targetHpRatio = 0.01; - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); @@ -75,7 +75,7 @@ describe("Moves - Hard Press", () => { it("should return 1 power if target HP ratio is less than 1%", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); const targetHpRatio = 0.005; - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getHpRatio").mockReturnValue(targetHpRatio); diff --git a/test/moves/haze.test.ts b/test/moves/haze.test.ts index 179a06fba09..1e16b499fa2 100644 --- a/test/moves/haze.test.ts +++ b/test/moves/haze.test.ts @@ -36,8 +36,8 @@ describe("Moves - Haze", () => { it("should reset all stat changes of all Pokemon on field", async () => { await game.classicMode.startBattle([SpeciesId.RATTATA]); - const user = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const user = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); expect(user.getStatStage(Stat.ATK)).toBe(0); expect(enemy.getStatStage(Stat.ATK)).toBe(0); diff --git a/test/moves/heal-block.test.ts b/test/moves/heal-block.test.ts index fc814fda4bc..4c8e6395171 100644 --- a/test/moves/heal-block.test.ts +++ b/test/moves/heal-block.test.ts @@ -38,8 +38,8 @@ describe("Moves - Heal Block", () => { it("shouldn't stop damage from HP-drain attacks, just HP restoration", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); player.damageAndUpdate(player.getMaxHp() - 1); @@ -56,8 +56,8 @@ describe("Moves - Heal Block", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.ABSORB); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -70,7 +70,7 @@ describe("Moves - Heal Block", () => { it("should prevent Wish from restoring HP", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const player = game.field.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.hp = 1; @@ -94,7 +94,7 @@ describe("Moves - Heal Block", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.damageAndUpdate(player.getMaxHp() - 1); @@ -107,7 +107,7 @@ describe("Moves - Heal Block", () => { it("should prevent healing from heal-over-time moves", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.damageAndUpdate(player.getMaxHp() - 1); @@ -123,7 +123,7 @@ describe("Moves - Heal Block", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.damageAndUpdate(player.getMaxHp() - 1); @@ -138,7 +138,7 @@ describe("Moves - Heal Block", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.damageAndUpdate(player.getMaxHp() - 1); game.move.select(MoveId.SPLASH); diff --git a/test/moves/heart-swap.test.ts b/test/moves/heart-swap.test.ts index e876ec06646..f192f74558d 100644 --- a/test/moves/heart-swap.test.ts +++ b/test/moves/heart-swap.test.ts @@ -36,8 +36,8 @@ describe("Moves - Heart Swap", () => { it("should swap all of the user's stat stages with the target's", async () => { await game.classicMode.startBattle([SpeciesId.MANAPHY]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(1)); diff --git a/test/moves/hyper-beam.test.ts b/test/moves/hyper-beam.test.ts index 510dac5f662..c61d503d627 100644 --- a/test/moves/hyper-beam.test.ts +++ b/test/moves/hyper-beam.test.ts @@ -40,8 +40,8 @@ describe("Moves - Hyper Beam", () => { it("should force the user to recharge on the next turn (and only that turn)", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.HYPER_BEAM); diff --git a/test/moves/imprison.test.ts b/test/moves/imprison.test.ts index ed2213bbc7b..3e971707d6e 100644 --- a/test/moves/imprison.test.ts +++ b/test/moves/imprison.test.ts @@ -33,7 +33,7 @@ describe("Moves - Imprison", () => { it("Pokemon under Imprison cannot use shared moves", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.TRANSFORM); await game.move.selectEnemyMove(MoveId.IMPRISON); @@ -60,7 +60,7 @@ describe("Moves - Imprison", () => { it("Imprison applies to Pokemon switched into Battle", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI, SpeciesId.BULBASAUR]); - const playerPokemon1 = game.scene.getPlayerPokemon()!; + const playerPokemon1 = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.move.selectEnemyMove(MoveId.IMPRISON); @@ -74,7 +74,7 @@ describe("Moves - Imprison", () => { game.doSwitchPokemon(1); await game.move.selectEnemyMove(MoveId.SPLASH); await game.toNextTurn(); - const playerPokemon2 = game.scene.getPlayerPokemon()!; + const playerPokemon2 = game.field.getPlayerPokemon(); const imprisonBattlerTag2 = playerPokemon2.getTag(BattlerTagType.IMPRISON); expect(playerPokemon1).not.toEqual(playerPokemon2); expect(imprisonBattlerTag2).toBeDefined(); @@ -84,8 +84,8 @@ describe("Moves - Imprison", () => { game.override.moveset([MoveId.SPLASH, MoveId.IMPRISON]); await game.classicMode.startBattle([SpeciesId.REGIELEKI, SpeciesId.BULBASAUR]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.IMPRISON); await game.move.selectEnemyMove(MoveId.GROWL); await game.toNextTurn(); diff --git a/test/moves/instruct.test.ts b/test/moves/instruct.test.ts index c34626f5e76..27318105783 100644 --- a/test/moves/instruct.test.ts +++ b/test/moves/instruct.test.ts @@ -50,7 +50,7 @@ describe("Moves - Instruct", () => { game.override.moveset(MoveId.INSTRUCT).enemyLevel(1000); // ensures shuckle no die await game.classicMode.startBattle([SpeciesId.AMOONGUSS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.changeMoveset(enemy, MoveId.SONIC_BOOM); game.move.select(MoveId.INSTRUCT); @@ -60,7 +60,7 @@ describe("Moves - Instruct", () => { await game.phaseInterceptor.to("MovePhase"); // enemy attacks us await game.phaseInterceptor.to("MovePhase", false); // instruct let currentPhase = game.scene.phaseManager.getCurrentPhase() as MovePhase; - expect(currentPhase.pokemon).toBe(game.scene.getPlayerPokemon()); + expect(currentPhase.pokemon).toBe(game.field.getPlayerPokemon()); await game.phaseInterceptor.to("MoveEndPhase"); await game.phaseInterceptor.to("MovePhase", false); // enemy repeats move @@ -70,14 +70,14 @@ describe("Moves - Instruct", () => { await game.phaseInterceptor.to("TurnEndPhase", false); instructSuccess(enemy, MoveId.SONIC_BOOM); - expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); + expect(game.field.getPlayerPokemon().getInverseHp()).toBe(40); }); it("should repeat enemy's move through substitute", async () => { game.override.moveset([MoveId.INSTRUCT, MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.AMOONGUSS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.changeMoveset(enemy, [MoveId.SONIC_BOOM, MoveId.SUBSTITUTE]); game.move.select(MoveId.SPLASH); @@ -90,8 +90,8 @@ describe("Moves - Instruct", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase", false); - instructSuccess(game.scene.getEnemyPokemon()!, MoveId.SONIC_BOOM); - expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); + instructSuccess(game.field.getEnemyPokemon(), MoveId.SONIC_BOOM); + expect(game.field.getPlayerPokemon().getInverseHp()).toBe(40); }); it("should repeat ally's attack on enemy", async () => { @@ -116,7 +116,7 @@ describe("Moves - Instruct", () => { game.override.moveset(MoveId.INSTRUCT).enemyLevel(5); await game.classicMode.startBattle([SpeciesId.AMOONGUSS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.changeMoveset(enemy, [MoveId.GIGATON_HAMMER, MoveId.BLOOD_MOON]); game.move.select(MoveId.INSTRUCT); @@ -124,7 +124,7 @@ describe("Moves - Instruct", () => { await game.phaseInterceptor.to("BerryPhase"); instructSuccess(enemy, MoveId.GIGATON_HAMMER); - expect(game.scene.getPlayerPokemon()!.turnData.attacksReceived.length).toBe(2); + expect(game.field.getPlayerPokemon().turnData.attacksReceived.length).toBe(2); }); it("should add moves to move queue for copycat", async () => { @@ -141,7 +141,7 @@ describe("Moves - Instruct", () => { instructSuccess(enemy1, MoveId.WATER_GUN); // amoonguss gets hit by water gun thrice; once by original attack, once by instructed use and once by copycat - expect(game.scene.getPlayerPokemon()!.turnData.attacksReceived.length).toBe(3); + expect(game.field.getPlayerPokemon().turnData.attacksReceived.length).toBe(3); }); it("should fail on metronomed moves, even if also in moveset", async () => { @@ -175,16 +175,16 @@ describe("Moves - Instruct", () => { await game.move.forceStatusActivation(false); await game.phaseInterceptor.to("TurnEndPhase", false); - const moveHistory = game.scene.getEnemyPokemon()?.getLastXMoves(-1)!; + const moveHistory = game.field.getEnemyPokemon().getLastXMoves(-1)!; expect(moveHistory.map(m => m.move)).toEqual([MoveId.SONIC_BOOM, MoveId.NONE, MoveId.SONIC_BOOM]); - expect(game.scene.getPlayerPokemon()?.getInverseHp()).toBe(40); + expect(game.field.getPlayerPokemon().getInverseHp()).toBe(40); }); it("should not repeat enemy's out of pp move", async () => { game.override.moveset(MoveId.INSTRUCT).enemySpecies(SpeciesId.UNOWN); await game.classicMode.startBattle([SpeciesId.AMOONGUSS]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.changeMoveset(enemyPokemon, MoveId.HIDDEN_POWER); const moveUsed = enemyPokemon.moveset.find(m => m?.moveId === MoveId.HIDDEN_POWER)!; moveUsed.ppUsed = moveUsed.getMovePp() - 1; @@ -258,7 +258,7 @@ describe("Moves - Instruct", () => { game.override.enemyMoveset(MoveId.INSTRUCT).enemySpecies(SpeciesId.UNOWN); await game.classicMode.startBattle([SpeciesId.AMOONGUSS, SpeciesId.TOXICROAK]); - const amoonguss = game.scene.getPlayerPokemon()!; + const amoonguss = game.field.getPlayerPokemon(); game.move.changeMoveset(amoonguss, MoveId.SEED_BOMB); amoonguss.pushMoveHistory({ @@ -284,7 +284,7 @@ describe("Moves - Instruct", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("TurnEndPhase", false); - expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should attempt to call enemy's disabled move, but move use itself should fail", async () => { @@ -310,7 +310,7 @@ describe("Moves - Instruct", () => { game.override.moveset([MoveId.INSTRUCT]); await game.classicMode.startBattle([SpeciesId.AMOONGUSS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.changeMoveset(enemy, MoveId.PROTECT); game.move.select(MoveId.INSTRUCT); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -325,8 +325,8 @@ describe("Moves - Instruct", () => { game.override.moveset([MoveId.INSTRUCT]).enemyMoveset([MoveId.SONIC_BOOM, MoveId.HYPER_BEAM]); await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.pushMoveHistory({ move: MoveId.SONIC_BOOM, targets: [BattlerIndex.PLAYER], @@ -353,7 +353,7 @@ describe("Moves - Instruct", () => { game.override.enemyMoveset(MoveId.INSTRUCT); await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const regieleki = game.scene.getPlayerPokemon()!; + const regieleki = game.field.getPlayerPokemon(); regieleki.pushMoveHistory({ move: MoveId.ELECTRO_DRIFT, targets: [BattlerIndex.PLAYER], @@ -371,7 +371,7 @@ describe("Moves - Instruct", () => { game.override.enemyMoveset([MoveId.SPLASH, MoveId.WHIRLWIND]).moveset(MoveId.INSTRUCT); await game.classicMode.startBattle([SpeciesId.LUCARIO, SpeciesId.BANETTE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); enemyPokemon.pushMoveHistory({ move: MoveId.WHIRLWIND, targets: [BattlerIndex.PLAYER], @@ -387,7 +387,7 @@ describe("Moves - Instruct", () => { const instructedMove = enemyPokemon.getLastXMoves(-1)[1]; expect(instructedMove.result).toBe(MoveResult.SUCCESS); expect(instructedMove.move).toBe(MoveId.WHIRLWIND); - expect(game.scene.getPlayerPokemon()?.species.speciesId).toBe(SpeciesId.BANETTE); + expect(game.field.getPlayerPokemon().species.speciesId).toBe(SpeciesId.BANETTE); }); it("should respect moves' original priority for psychic terrain", async () => { @@ -559,7 +559,7 @@ describe("Moves - Instruct", () => { .enemyMoveset(MoveId.BULLET_SEED); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const bulbasaur = game.scene.getPlayerPokemon()!; + const bulbasaur = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.toNextTurn(); diff --git a/test/moves/jaw-lock.test.ts b/test/moves/jaw-lock.test.ts index 919e07ece9a..441c74c7356 100644 --- a/test/moves/jaw-lock.test.ts +++ b/test/moves/jaw-lock.test.ts @@ -42,8 +42,8 @@ describe("Moves - Jaw Lock", () => { it("should trap the move's user and target", async () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.JAW_LOCK); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -63,8 +63,8 @@ describe("Moves - Jaw Lock", () => { game.override.enemyLevel(1); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.JAW_LOCK); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -88,8 +88,8 @@ describe("Moves - Jaw Lock", () => { it("should only trap the user until the target faints", async () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.JAW_LOCK); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -140,8 +140,8 @@ describe("Moves - Jaw Lock", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.JAW_LOCK); diff --git a/test/moves/last-resort.test.ts b/test/moves/last-resort.test.ts index e6f4faacd09..ca4ed6726ed 100644 --- a/test/moves/last-resort.test.ts +++ b/test/moves/last-resort.test.ts @@ -13,7 +13,7 @@ describe("Moves - Last Resort", () => { let game: GameManager; function expectLastResortFail() { - expect(game.scene.getPlayerPokemon()?.getLastXMoves()[0]).toEqual( + expect(game.field.getPlayerPokemon().getLastXMoves()[0]).toEqual( expect.objectContaining({ move: MoveId.LAST_RESORT, result: MoveResult.FAIL, @@ -45,7 +45,7 @@ describe("Moves - Last Resort", () => { game.override.moveset([MoveId.LAST_RESORT, MoveId.SPLASH, MoveId.GROWL, MoveId.GROWTH]); await game.classicMode.startBattle([SpeciesId.BLISSEY]); - const blissey = game.scene.getPlayerPokemon()!; + const blissey = game.field.getPlayerPokemon(); expect(blissey).toBeDefined(); // Last resort by itself @@ -69,7 +69,7 @@ describe("Moves - Last Resort", () => { blissey.pushMoveHistory({ move: MoveId.GROWTH, targets: [BattlerIndex.PLAYER], useMode: MoveUseMode.NORMAL }); game.move.select(MoveId.LAST_RESORT); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.getLastXMoves()[0]).toEqual( + expect(game.field.getPlayerPokemon().getLastXMoves()[0]).toEqual( expect.objectContaining({ move: MoveId.LAST_RESORT, result: MoveResult.SUCCESS, @@ -114,7 +114,7 @@ describe("Moves - Last Resort", () => { game.move.select(MoveId.SLEEP_TALK); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.getLastXMoves(-1)).toEqual([ + expect(game.field.getPlayerPokemon().getLastXMoves(-1)).toEqual([ expect.objectContaining({ move: MoveId.LAST_RESORT, result: MoveResult.SUCCESS, @@ -136,15 +136,15 @@ describe("Moves - Last Resort", () => { await game.doKillOpponents(); await game.toNextWave(); - const oldMoveHistory = game.scene.getPlayerPokemon()?.summonData.moveHistory; + const oldMoveHistory = game.field.getPlayerPokemon().summonData.moveHistory; await game.reload.reloadSession(); - const newMoveHistory = game.scene.getPlayerPokemon()?.summonData.moveHistory; + const newMoveHistory = game.field.getPlayerPokemon().summonData.moveHistory; expect(oldMoveHistory).toEqual(newMoveHistory); // use last resort and it should kill the karp just fine game.move.select(MoveId.LAST_RESORT); - game.scene.getEnemyPokemon()!.hp = 1; + game.field.getEnemyPokemon().hp = 1; await game.phaseInterceptor.to("TurnEndPhase"); expect(game.isVictory()).toBe(true); diff --git a/test/moves/light-screen.test.ts b/test/moves/light-screen.test.ts index 04f7f59f184..c8282037f20 100644 --- a/test/moves/light-screen.test.ts +++ b/test/moves/light-screen.test.ts @@ -53,8 +53,8 @@ describe("Moves - Light Screen", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); @@ -72,8 +72,8 @@ describe("Moves - Light Screen", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); @@ -88,8 +88,8 @@ describe("Moves - Light Screen", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); @@ -106,8 +106,8 @@ describe("Moves - Light Screen", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); expect(mockedDmg).toBe(allMoves[moveToUse].power); diff --git a/test/moves/lucky-chant.test.ts b/test/moves/lucky-chant.test.ts index 1128f79b1d2..7be75631494 100644 --- a/test/moves/lucky-chant.test.ts +++ b/test/moves/lucky-chant.test.ts @@ -37,7 +37,7 @@ describe("Moves - Lucky Chant", () => { game.override.criticalHits(true); await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const charizard = game.scene.getPlayerPokemon()!; + const charizard = game.field.getPlayerPokemon(); expect(charizard).toBeDefined(); const critSpy = vi.spyOn(charizard, "getCriticalHitResult"); // called on the defender (ie player) @@ -59,7 +59,7 @@ describe("Moves - Lucky Chant", () => { game.override.enemyMoveset(MoveId.FLOWER_TRICK); await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const charizard = game.scene.getPlayerPokemon()!; + const charizard = game.field.getPlayerPokemon(); expect(charizard).toBeDefined(); game.move.select(MoveId.SPLASH); @@ -79,7 +79,7 @@ describe("Moves - Lucky Chant", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const charizard = game.scene.getPlayerPokemon()!; + const charizard = game.field.getPlayerPokemon(); expect(charizard).toBeDefined(); game.move.select(MoveId.FOLLOW_ME, BattlerIndex.PLAYER); diff --git a/test/moves/magic-coat.test.ts b/test/moves/magic-coat.test.ts index 2ed09499e95..7c1c703119d 100644 --- a/test/moves/magic-coat.test.ts +++ b/test/moves/magic-coat.test.ts @@ -43,7 +43,7 @@ describe("Moves - Magic Coat", () => { game.move.select(MoveId.PROTECT); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getEnemyPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should fail if called again in the same turn due to moves like instruct", async () => { @@ -52,7 +52,7 @@ describe("Moves - Magic Coat", () => { game.move.select(MoveId.INSTRUCT); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getEnemyPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should not reflect moves used on the next turn", async () => { @@ -68,7 +68,7 @@ describe("Moves - Magic Coat", () => { game.move.select(MoveId.GROWL); await game.move.selectEnemyMove(MoveId.SPLASH); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should reflect basic status moves", async () => { @@ -77,7 +77,7 @@ describe("Moves - Magic Coat", () => { game.move.select(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should individually bounce back multi-target moves when used by both targets in doubles", async () => { @@ -110,13 +110,13 @@ describe("Moves - Magic Coat", () => { it("should still bounce back a move that would otherwise fail", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - game.scene.getEnemyPokemon()?.setStatStage(Stat.ATK, -6); + game.field.getEnemyPokemon().setStatStage(Stat.ATK, -6); game.override.moveset([MoveId.GROWL]); game.move.select(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should not bounce back a move that was just bounced", async () => { @@ -143,7 +143,7 @@ describe("Moves - Magic Coat", () => { game.move.select(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should still bounce back a move from a mold breaker user", async () => { @@ -153,8 +153,8 @@ describe("Moves - Magic Coat", () => { game.move.select(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(0); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(0); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should only bounce spikes back once when both targets use magic coat in doubles", async () => { @@ -175,7 +175,7 @@ describe("Moves - Magic Coat", () => { game.move.select(MoveId.CURSE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getTag(BattlerTagType.CURSED)).toBeDefined(); + expect(game.field.getEnemyPokemon().getTag(BattlerTagType.CURSED)).toBeDefined(); }); // TODO: encore is failing if the last move was virtual. @@ -186,7 +186,7 @@ describe("Moves - Magic Coat", () => { .enemyAbility(AbilityId.MAGIC_BOUNCE); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); // turn 1 game.move.select(MoveId.GROWL); @@ -226,7 +226,7 @@ describe("Moves - Magic Coat", () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); const stomping_tantrum = allMoves[MoveId.STOMPING_TANTRUM]; - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(stomping_tantrum, "calculateBattlePower"); game.move.select(MoveId.SPORE); @@ -252,34 +252,34 @@ describe("Moves - Magic Coat", () => { // Turn 1 - thunder wave immunity test game.move.select(MoveId.THUNDER_WAVE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + expect(game.field.getPlayerPokemon().status).toBeUndefined(); // Turn 2 - soundproof immunity test game.move.select(MoveId.GROWL); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)).toBe(0); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(0); }); it("should bounce back a move before the accuracy check", async () => { game.override.moveset([MoveId.SPORE]); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const attacker = game.scene.getPlayerPokemon()!; + const attacker = game.field.getPlayerPokemon(); vi.spyOn(attacker, "getAccuracyMultiplier").mockReturnValue(0.0); game.move.select(MoveId.SPORE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status?.effect).toBe(StatusEffect.SLEEP); + expect(game.field.getPlayerPokemon().status?.effect).toBe(StatusEffect.SLEEP); }); it("should take the accuracy of the magic bounce user into account", async () => { game.override.moveset([MoveId.SPORE]); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const opponent = game.scene.getEnemyPokemon()!; + const opponent = game.field.getEnemyPokemon(); vi.spyOn(opponent, "getAccuracyMultiplier").mockReturnValue(0); game.move.select(MoveId.SPORE); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.status).toBeUndefined(); + expect(game.field.getPlayerPokemon().status).toBeUndefined(); }); }); diff --git a/test/moves/make-it-rain.test.ts b/test/moves/make-it-rain.test.ts index ab242d0c3a0..a75c1ae59f8 100644 --- a/test/moves/make-it-rain.test.ts +++ b/test/moves/make-it-rain.test.ts @@ -37,7 +37,7 @@ describe("Moves - Make It Rain", () => { it("should only lower SPATK stat stage by 1 once in a double battle", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.MAKE_IT_RAIN); game.move.select(MoveId.SPLASH, 1); @@ -54,8 +54,8 @@ describe("Moves - Make It Rain", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.MAKE_IT_RAIN); @@ -70,7 +70,7 @@ describe("Moves - Make It Rain", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const enemyPokemon = game.scene.getEnemyField(); game.move.select(MoveId.MAKE_IT_RAIN); @@ -85,7 +85,7 @@ describe("Moves - Make It Rain", () => { it("should lower SPATK stat stage by 1 if it only hits the second target", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.MAKE_IT_RAIN); game.move.select(MoveId.SPLASH, 1); diff --git a/test/moves/metronome.test.ts b/test/moves/metronome.test.ts index e39d24c81db..2215c18f451 100644 --- a/test/moves/metronome.test.ts +++ b/test/moves/metronome.test.ts @@ -44,8 +44,8 @@ describe("Moves - Metronome", () => { it("should have one semi-invulnerable turn and deal damage on the second turn when a semi-invulnerable move is called", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(MoveId.DIVE); game.move.select(MoveId.METRONOME); @@ -60,7 +60,7 @@ describe("Moves - Metronome", () => { it("should apply secondary effects of a move", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(MoveId.WOOD_HAMMER); game.move.select(MoveId.METRONOME); @@ -71,7 +71,7 @@ describe("Moves - Metronome", () => { it("should recharge after using recharge move", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(MoveId.HYPER_BEAM); vi.spyOn(allMoves[MoveId.HYPER_BEAM], "accuracy", "get").mockReturnValue(100); @@ -137,7 +137,7 @@ describe("Moves - Metronome", () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); vi.spyOn(randomMoveAttr, "getMoveOverride").mockReturnValue(MoveId.ROAR); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.METRONOME); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/miracle-eye.test.ts b/test/moves/miracle-eye.test.ts index 9ed3824fc28..8ea6653eeb4 100644 --- a/test/moves/miracle-eye.test.ts +++ b/test/moves/miracle-eye.test.ts @@ -34,7 +34,7 @@ describe("Moves - Miracle Eye", () => { it("should allow Psychic moves to hit Dark types", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.CONFUSION); await game.toNextTurn(); diff --git a/test/moves/mirror-move.test.ts b/test/moves/mirror-move.test.ts index 0253932026b..50ea4274f49 100644 --- a/test/moves/mirror-move.test.ts +++ b/test/moves/mirror-move.test.ts @@ -56,7 +56,7 @@ describe("Moves - Mirror Move", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPDEF)).toBe(-2); + expect(game.field.getEnemyPokemon().getStatStage(Stat.SPDEF)).toBe(-2); }); it("should be able to copy status moves", async () => { @@ -67,7 +67,7 @@ describe("Moves - Mirror Move", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); it("should fail if the target has not used any moves", async () => { @@ -77,6 +77,6 @@ describe("Moves - Mirror Move", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); }); diff --git a/test/moves/nightmare.test.ts b/test/moves/nightmare.test.ts index 7b3772d8b71..0b7542f89d1 100644 --- a/test/moves/nightmare.test.ts +++ b/test/moves/nightmare.test.ts @@ -36,7 +36,7 @@ describe("Moves - Nightmare", () => { it("lowers enemy hp by 1/4 each turn while asleep", async () => { await game.classicMode.startBattle([SpeciesId.HYPNO]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const enemyMaxHP = enemyPokemon.hp; game.move.select(MoveId.NIGHTMARE); diff --git a/test/moves/obstruct.test.ts b/test/moves/obstruct.test.ts index 9abc60be129..bc03075b2cc 100644 --- a/test/moves/obstruct.test.ts +++ b/test/moves/obstruct.test.ts @@ -37,8 +37,8 @@ describe("Moves - Obstruct", () => { game.move.select(MoveId.OBSTRUCT); await game.phaseInterceptor.to("BerryPhase"); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); expect(player.isFullHp()).toBe(true); expect(enemy.getStatStage(Stat.DEF)).toBe(-2); @@ -51,8 +51,8 @@ describe("Moves - Obstruct", () => { await game.phaseInterceptor.to("MoveEffectPhase"); await game.move.forceMiss(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); await game.phaseInterceptor.to("TurnEndPhase"); expect(player.isFullHp()).toBe(true); @@ -66,8 +66,8 @@ describe("Moves - Obstruct", () => { game.move.select(MoveId.OBSTRUCT); await game.phaseInterceptor.to("BerryPhase"); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); expect(player.isFullHp()).toBe(true); expect(enemy.getStatStage(Stat.DEF)).toBe(0); @@ -80,7 +80,7 @@ describe("Moves - Obstruct", () => { game.move.select(MoveId.OBSTRUCT); await game.phaseInterceptor.to("BerryPhase"); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); expect(player.getStatStage(Stat.ATK)).toBe(-1); }); @@ -92,6 +92,6 @@ describe("Moves - Obstruct", () => { game.move.select(MoveId.OBSTRUCT); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.DEF)).toBe(0); + expect(game.field.getEnemyPokemon().getStatStage(Stat.DEF)).toBe(0); }); }); diff --git a/test/moves/octolock.test.ts b/test/moves/octolock.test.ts index 09992dd52c7..f51c972f169 100644 --- a/test/moves/octolock.test.ts +++ b/test/moves/octolock.test.ts @@ -37,7 +37,7 @@ describe("Moves - Octolock", () => { it("lowers DEF and SPDEF stat stages of the target Pokemon by 1 each turn", async () => { await game.classicMode.startBattle([SpeciesId.GRAPPLOCT]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); // use Octolock and advance to init phase of next turn to check for stat changes game.move.select(MoveId.OCTOLOCK); @@ -58,7 +58,7 @@ describe("Moves - Octolock", () => { game.override.enemyAbility(AbilityId.BIG_PECKS); await game.classicMode.startBattle([SpeciesId.GRAPPLOCT]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); // use Octolock and advance to init phase of next turn to check for stat changes game.move.select(MoveId.OCTOLOCK); @@ -72,7 +72,7 @@ describe("Moves - Octolock", () => { game.override.enemyAbility(AbilityId.WHITE_SMOKE); await game.classicMode.startBattle([SpeciesId.GRAPPLOCT]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); // use Octolock and advance to init phase of next turn to check for stat changes game.move.select(MoveId.OCTOLOCK); @@ -86,7 +86,7 @@ describe("Moves - Octolock", () => { game.override.enemyAbility(AbilityId.CLEAR_BODY); await game.classicMode.startBattle([SpeciesId.GRAPPLOCT]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); // use Octolock and advance to init phase of next turn to check for stat changes game.move.select(MoveId.OCTOLOCK); @@ -99,7 +99,7 @@ describe("Moves - Octolock", () => { it("traps the target pokemon", async () => { await game.classicMode.startBattle([SpeciesId.GRAPPLOCT]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); // before Octolock - enemy should not be trapped expect(enemyPokemon.findTag(t => t instanceof TrappedTag)).toBeUndefined(); @@ -115,7 +115,7 @@ describe("Moves - Octolock", () => { game.override.enemyMoveset(MoveId.OCTOLOCK); await game.classicMode.startBattle([SpeciesId.GASTLY]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // before Octolock - player should not be trapped expect(playerPokemon.findTag(t => t instanceof TrappedTag)).toBeUndefined(); @@ -132,7 +132,7 @@ describe("Moves - Octolock", () => { it("does not work on pokemon with added ghost type via Trick-or-Treat", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); // before Octolock - pokemon should not be trapped expect(enemy.findTag(t => t instanceof TrappedTag)).toBeUndefined(); diff --git a/test/moves/parting-shot.test.ts b/test/moves/parting-shot.test.ts index 7785bdd3a2f..660edc4565a 100644 --- a/test/moves/parting-shot.test.ts +++ b/test/moves/parting-shot.test.ts @@ -38,7 +38,7 @@ describe("Moves - Parting Shot", () => { game.override.enemySpecies(SpeciesId.POOCHYENA).ability(AbilityId.PRANKSTER); await game.classicMode.startBattle([SpeciesId.MURKROW, SpeciesId.MEOWTH]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon).toBeDefined(); game.move.select(MoveId.PARTING_SHOT); @@ -53,7 +53,7 @@ describe("Moves - Parting Shot", () => { game.override.enemySpecies(SpeciesId.GHOLDENGO).enemyAbility(AbilityId.GOOD_AS_GOLD); await game.classicMode.startBattle([SpeciesId.MURKROW, SpeciesId.MEOWTH]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon).toBeDefined(); game.move.select(MoveId.PARTING_SHOT); @@ -97,7 +97,7 @@ describe("Moves - Parting Shot", () => { // set up done await game.phaseInterceptor.to(TurnInitPhase, false); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon).toBeDefined(); expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-6); @@ -120,7 +120,7 @@ describe("Moves - Parting Shot", () => { game.override.enemySpecies(SpeciesId.ALTARIA).enemyAbility(AbilityId.NONE).enemyMoveset([MoveId.MIST]); await game.classicMode.startBattle([SpeciesId.SNORLAX, SpeciesId.MEOWTH]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon).toBeDefined(); game.move.select(MoveId.PARTING_SHOT); @@ -139,7 +139,7 @@ describe("Moves - Parting Shot", () => { game.override.enemySpecies(SpeciesId.TENTACOOL).enemyAbility(AbilityId.CLEAR_BODY); await game.classicMode.startBattle([SpeciesId.SNORLAX, SpeciesId.MEOWTH]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon).toBeDefined(); game.move.select(MoveId.PARTING_SHOT); @@ -157,7 +157,7 @@ describe("Moves - Parting Shot", () => { async () => { await game.classicMode.startBattle([SpeciesId.MURKROW]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon).toBeDefined(); game.move.select(MoveId.PARTING_SHOT); @@ -186,7 +186,7 @@ describe("Moves - Parting Shot", () => { game.move.select(MoveId.PARTING_SHOT); await game.phaseInterceptor.to(BerryPhase, false); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0); expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0); expect(game.scene.getPlayerField()[0].species.speciesId).toBe(SpeciesId.MEOWTH); diff --git a/test/moves/plasma-fists.test.ts b/test/moves/plasma-fists.test.ts index 569fb1d5c0d..fb6e46feffa 100644 --- a/test/moves/plasma-fists.test.ts +++ b/test/moves/plasma-fists.test.ts @@ -60,8 +60,8 @@ describe("Moves - Plasma Fists", () => { await game.classicMode.startBattle([SpeciesId.ONIX]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(enemyPokemon, "getMoveType"); game.move.select(MoveId.PLASMA_FISTS); @@ -78,8 +78,8 @@ describe("Moves - Plasma Fists", () => { await game.classicMode.startBattle([SpeciesId.DUSCLOPS]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); vi.spyOn(enemyPokemon, "getMoveType"); game.move.select(MoveId.PLASMA_FISTS); diff --git a/test/moves/pledge-moves.test.ts b/test/moves/pledge-moves.test.ts index c67519d417b..7a9c4112d7d 100644 --- a/test/moves/pledge-moves.test.ts +++ b/test/moves/pledge-moves.test.ts @@ -89,8 +89,8 @@ describe("Moves - Pledge Moves", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.FIRE_PLEDGE); diff --git a/test/moves/pollen-puff.test.ts b/test/moves/pollen-puff.test.ts index ecd208f777b..76732a39c43 100644 --- a/test/moves/pollen-puff.test.ts +++ b/test/moves/pollen-puff.test.ts @@ -53,7 +53,7 @@ describe("Moves - Pollen Puff", () => { game.override.moveset([MoveId.POLLEN_PUFF]).ability(AbilityId.PARENTAL_BOND).enemyLevel(100); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const target = game.scene.getEnemyPokemon()!; + const target = game.field.getEnemyPokemon(); game.move.select(MoveId.POLLEN_PUFF); diff --git a/test/moves/powder.test.ts b/test/moves/powder.test.ts index 17f64a95179..cbf70feebe6 100644 --- a/test/moves/powder.test.ts +++ b/test/moves/powder.test.ts @@ -41,7 +41,7 @@ describe("Moves - Powder", () => { game.override.enemyMoveset([]); await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.changeMoveset(enemyPokemon, MoveId.EMBER); game.move.select(MoveId.POWDER); @@ -66,7 +66,7 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -80,7 +80,7 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -94,7 +94,7 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -108,7 +108,7 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -122,7 +122,7 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -137,7 +137,7 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -152,8 +152,8 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); // Turn 1: Roar away 1 opponent game.move.select(MoveId.ROAR, 0, BattlerIndex.ENEMY_2); @@ -184,8 +184,8 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -200,7 +200,7 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -214,7 +214,7 @@ describe("Moves - Powder", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER); @@ -227,7 +227,7 @@ describe("Moves - Powder", () => { game.override.enemyMoveset([MoveId.FIRE_PLEDGE, MoveId.GRASS_PLEDGE]).battleStyle("double"); await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER, 0, BattlerIndex.ENEMY); game.move.select(MoveId.SPLASH, 1); @@ -244,7 +244,7 @@ describe("Moves - Powder", () => { game.override.enemyMoveset([MoveId.FIRE_PLEDGE, MoveId.WATER_PLEDGE]).battleStyle("double"); await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER, 0, BattlerIndex.ENEMY); game.move.select(MoveId.SPLASH, 1); @@ -261,7 +261,7 @@ describe("Moves - Powder", () => { game.override.enemyMoveset([MoveId.FIRE_PLEDGE, MoveId.WATER_PLEDGE]).battleStyle("double"); await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.CHARIZARD]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.POWDER, 0, BattlerIndex.ENEMY); game.move.select(MoveId.SPLASH, 1); diff --git a/test/moves/power-shift.test.ts b/test/moves/power-shift.test.ts index adfd1f0aaa9..84bf6e230d4 100644 --- a/test/moves/power-shift.test.ts +++ b/test/moves/power-shift.test.ts @@ -32,7 +32,7 @@ describe("Moves - Power Shift", () => { it("switches the user's raw Attack stat with its raw Defense stat", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.setStat(Stat.ATK, 10, false); playerPokemon.setStat(Stat.DEF, 20, false); diff --git a/test/moves/power-split.test.ts b/test/moves/power-split.test.ts index 1eaabf6090d..9af57ebb191 100644 --- a/test/moves/power-split.test.ts +++ b/test/moves/power-split.test.ts @@ -36,8 +36,8 @@ describe("Moves - Power Split", () => { game.override.enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.INDEEDEE]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); const avgAtk = Math.floor((player.getStat(Stat.ATK, false) + enemy.getStat(Stat.ATK, false)) / 2); const avgSpAtk = Math.floor((player.getStat(Stat.SPATK, false) + enemy.getStat(Stat.SPATK, false)) / 2); @@ -56,8 +56,8 @@ describe("Moves - Power Split", () => { game.override.enemyMoveset([MoveId.POWER_SPLIT]); await game.classicMode.startBattle([SpeciesId.INDEEDEE]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); const avgAtk = Math.floor((player.getStat(Stat.ATK, false) + enemy.getStat(Stat.ATK, false)) / 2); const avgSpAtk = Math.floor((player.getStat(Stat.SPATK, false) + enemy.getStat(Stat.SPATK, false)) / 2); diff --git a/test/moves/power-swap.test.ts b/test/moves/power-swap.test.ts index b25db40e64c..74cf37e33a5 100644 --- a/test/moves/power-swap.test.ts +++ b/test/moves/power-swap.test.ts @@ -36,8 +36,8 @@ describe("Moves - Power Swap", () => { it("should swap the user's ATK and SPATK stat stages with the target's", async () => { await game.classicMode.startBattle([SpeciesId.INDEEDEE]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(1)); diff --git a/test/moves/power-trick.test.ts b/test/moves/power-trick.test.ts index 3ddd27212e1..a8013f1882b 100644 --- a/test/moves/power-trick.test.ts +++ b/test/moves/power-trick.test.ts @@ -37,7 +37,7 @@ describe("Moves - Power Trick", () => { it("swaps the user's ATK and DEF stats", async () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); const baseATK = player.getStat(Stat.ATK, false); const baseDEF = player.getStat(Stat.DEF, false); @@ -53,7 +53,7 @@ describe("Moves - Power Trick", () => { it("resets initial ATK and DEF stat swap when used consecutively", async () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); const baseATK = player.getStat(Stat.ATK, false); const baseDEF = player.getStat(Stat.DEF, false); @@ -74,7 +74,7 @@ describe("Moves - Power Trick", () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE, SpeciesId.SHUCKLE]); await game.override.moveset([MoveId.POWER_TRICK, MoveId.BATON_PASS]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.addTag(BattlerTagType.POWER_TRICK); game.move.select(MoveId.BATON_PASS); @@ -82,7 +82,7 @@ describe("Moves - Power Trick", () => { await game.phaseInterceptor.to(TurnEndPhase); - const switchedPlayer = game.scene.getPlayerPokemon()!; + const switchedPlayer = game.field.getPlayerPokemon(); const baseATK = switchedPlayer.getStat(Stat.ATK); const baseDEF = switchedPlayer.getStat(Stat.DEF); @@ -95,14 +95,14 @@ describe("Moves - Power Trick", () => { await game.classicMode.startBattle([SpeciesId.SHUCKLE, SpeciesId.SHUCKLE]); await game.override.moveset([MoveId.POWER_TRICK, MoveId.TRANSFORM]); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); player.addTag(BattlerTagType.POWER_TRICK); game.move.select(MoveId.TRANSFORM); await game.phaseInterceptor.to(TurnEndPhase); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); const baseATK = enemy.getStat(Stat.ATK); const baseDEF = enemy.getStat(Stat.DEF); diff --git a/test/moves/protect.test.ts b/test/moves/protect.test.ts index 7da54f268e0..a101fa8e2c8 100644 --- a/test/moves/protect.test.ts +++ b/test/moves/protect.test.ts @@ -41,7 +41,7 @@ describe("Moves - Protect", () => { test("should protect the user from attacks", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.PROTECT); @@ -56,7 +56,7 @@ describe("Moves - Protect", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.PROTECT); @@ -71,7 +71,7 @@ describe("Moves - Protect", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.PROTECT); @@ -85,8 +85,8 @@ describe("Moves - Protect", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.PROTECT); @@ -101,8 +101,8 @@ describe("Moves - Protect", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.PROTECT); diff --git a/test/moves/psycho-shift.test.ts b/test/moves/psycho-shift.test.ts index f2e762f1381..9e63798773c 100644 --- a/test/moves/psycho-shift.test.ts +++ b/test/moves/psycho-shift.test.ts @@ -37,13 +37,14 @@ describe("Moves - Psycho Shift", () => { it("If Psycho Shift is used on a Pokémon with Synchronize, the user of Psycho Shift will already be afflicted with a status condition when Synchronize activates", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const playerPokemon = game.scene.getPlayerPokemon(); - const enemyPokemon = game.scene.getEnemyPokemon(); - expect(enemyPokemon?.status).toBeUndefined(); + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + expect(playerPokemon.status).toBeDefined(); + expect(enemyPokemon.status).toBeFalsy(); game.move.select(MoveId.PSYCHO_SHIFT); await game.phaseInterceptor.to("TurnEndPhase"); - expect(playerPokemon?.status).toBeNull(); - expect(enemyPokemon?.status).toBeDefined(); + expect(playerPokemon.status).toBeNull(); + expect(enemyPokemon.status).toBeDefined(); }); }); diff --git a/test/moves/purify.test.ts b/test/moves/purify.test.ts index 88e0da802a3..1f3102616b5 100644 --- a/test/moves/purify.test.ts +++ b/test/moves/purify.test.ts @@ -38,8 +38,8 @@ describe("Moves - Purify", () => { test("Purify heals opponent status effect and restores user hp", async () => { await game.classicMode.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; - const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon: EnemyPokemon = game.field.getEnemyPokemon(); + const playerPokemon: PlayerPokemon = game.field.getPlayerPokemon(); playerPokemon.hp = playerPokemon.getMaxHp() - 1; enemyPokemon.status = new Status(StatusEffect.BURN); @@ -55,7 +55,7 @@ describe("Moves - Purify", () => { test("Purify does not heal if opponent doesnt have any status effect", async () => { await game.classicMode.startBattle(); - const playerPokemon: PlayerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon: PlayerPokemon = game.field.getPlayerPokemon(); playerPokemon.hp = playerPokemon.getMaxHp() - 1; const playerInitialHp = playerPokemon.hp; diff --git a/test/moves/quick-guard.test.ts b/test/moves/quick-guard.test.ts index d14eada2445..1805048edb5 100644 --- a/test/moves/quick-guard.test.ts +++ b/test/moves/quick-guard.test.ts @@ -85,8 +85,8 @@ describe("Moves - Quick Guard", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.QUICK_GUARD); diff --git a/test/moves/rage-fist.test.ts b/test/moves/rage-fist.test.ts index 8ed0a71306b..61164b5710c 100644 --- a/test/moves/rage-fist.test.ts +++ b/test/moves/rage-fist.test.ts @@ -65,7 +65,7 @@ describe("Moves - Rage Fist", () => { await game.phaseInterceptor.to("TurnEndPhase"); // hit 8 times, but nothing else - expect(game.scene.getPlayerPokemon()?.battleData.hitCount).toBe(8); + expect(game.field.getPlayerPokemon().battleData.hitCount).toBe(8); expect(move.calculateBattlePower).toHaveLastReturnedWith(350); }); @@ -80,7 +80,7 @@ describe("Moves - Rage Fist", () => { await game.toNextTurn(); // no increase due to substitute - expect(game.scene.getPlayerPokemon()?.battleData.hitCount).toBe(0); + expect(game.field.getPlayerPokemon().battleData.hitCount).toBe(0); // remove substitute and get confused game.move.select(MoveId.TIDY_UP); @@ -95,7 +95,7 @@ describe("Moves - Rage Fist", () => { await game.toNextTurn(); // didn't go up from hitting ourself - expect(game.scene.getPlayerPokemon()?.battleData.hitCount).toBe(0); + expect(game.field.getPlayerPokemon().battleData.hitCount).toBe(0); }); it("should maintain hits recieved between wild waves", async () => { @@ -105,20 +105,20 @@ describe("Moves - Rage Fist", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextWave(); - expect(game.scene.getPlayerPokemon()?.battleData.hitCount).toBe(2); + expect(game.field.getPlayerPokemon().battleData.hitCount).toBe(2); game.move.select(MoveId.RAGE_FIST); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.battleData.hitCount).toBe(4); + expect(game.field.getPlayerPokemon().battleData.hitCount).toBe(4); expect(move.calculateBattlePower).toHaveLastReturnedWith(250); }); it("should reset hits recieved before trainer battles", async () => { await game.classicMode.startBattle([SpeciesId.IRON_HANDS]); - const ironHands = game.scene.getPlayerPokemon()!; + const ironHands = game.field.getPlayerPokemon(); expect(ironHands).toBeDefined(); // beat up a magikarp @@ -184,7 +184,7 @@ describe("Moves - Rage Fist", () => { game.move.select(MoveId.RAGE_FIST); await game.phaseInterceptor.to("MoveEndPhase"); - const charizard = game.scene.getPlayerPokemon()!; + const charizard = game.field.getPlayerPokemon(); expect(charizard).toBeDefined(); expect(charizard.species.speciesId).toBe(SpeciesId.CHARIZARD); expect(move.calculateBattlePower).toHaveLastReturnedWith(150); diff --git a/test/moves/reflect.test.ts b/test/moves/reflect.test.ts index 228730e9fb6..b8fa2b1ce80 100644 --- a/test/moves/reflect.test.ts +++ b/test/moves/reflect.test.ts @@ -52,8 +52,8 @@ describe("Moves - Reflect", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); @@ -71,8 +71,8 @@ describe("Moves - Reflect", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); @@ -88,8 +88,8 @@ describe("Moves - Reflect", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); @@ -105,8 +105,8 @@ describe("Moves - Reflect", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); @@ -122,8 +122,8 @@ describe("Moves - Reflect", () => { await game.phaseInterceptor.to(TurnEndPhase); const mockedDmg = getMockedMoveDamage( - game.scene.getEnemyPokemon()!, - game.scene.getPlayerPokemon()!, + game.field.getEnemyPokemon(), + game.field.getPlayerPokemon(), allMoves[moveToUse], ); expect(mockedDmg).toBe(allMoves[moveToUse].power); diff --git a/test/moves/relic-song.test.ts b/test/moves/relic-song.test.ts index 62069ac3cd3..c834ccbee24 100644 --- a/test/moves/relic-song.test.ts +++ b/test/moves/relic-song.test.ts @@ -34,7 +34,7 @@ describe("Moves - Relic Song", () => { it("swaps Meloetta's form between Aria and Pirouette", async () => { await game.classicMode.startBattle([SpeciesId.MELOETTA]); - const meloetta = game.scene.getPlayerPokemon()!; + const meloetta = game.field.getPlayerPokemon(); game.move.select(MoveId.RELIC_SONG); await game.toNextTurn(); @@ -51,7 +51,7 @@ describe("Moves - Relic Song", () => { game.challengeMode.addChallenge(Challenges.SINGLE_TYPE, PokemonType.PSYCHIC + 1, 0); await game.challengeMode.startBattle([SpeciesId.MELOETTA]); - const meloetta = game.scene.getPlayerPokemon()!; + const meloetta = game.field.getPlayerPokemon(); expect(meloetta.formIndex).toBe(0); @@ -66,7 +66,7 @@ describe("Moves - Relic Song", () => { game.override.starterForms({ [SpeciesId.MELOETTA]: 1 }).startingWave(10); await game.classicMode.startBattle([SpeciesId.MELOETTA]); - const meloetta = game.scene.getPlayerPokemon()!; + const meloetta = game.field.getPlayerPokemon(); game.move.select(MoveId.SPLASH); await game.doKillOpponents(); diff --git a/test/moves/revival-blessing.test.ts b/test/moves/revival-blessing.test.ts index 89a1996fe03..d14fa89c738 100644 --- a/test/moves/revival-blessing.test.ts +++ b/test/moves/revival-blessing.test.ts @@ -41,7 +41,7 @@ describe("Moves - Revival Blessing", () => { game.doSelectPartyPokemon(1, "SwitchPhase"); await game.toNextTurn(); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); expect(player.species.speciesId).toBe(SpeciesId.MAGIKARP); game.move.select(MoveId.REVIVAL_BLESSING); @@ -82,7 +82,7 @@ describe("Moves - Revival Blessing", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase", false); - const player = game.scene.getPlayerPokemon()!; + const player = game.field.getPlayerPokemon(); expect(player.getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); diff --git a/test/moves/role-play.test.ts b/test/moves/role-play.test.ts index af9fc68efa4..ff5d487ddf0 100644 --- a/test/moves/role-play.test.ts +++ b/test/moves/role-play.test.ts @@ -38,7 +38,7 @@ describe("Moves - Role Play", () => { game.move.select(MoveId.ROLE_PLAY); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(AbilityId.BALL_FETCH); + expect(game.field.getPlayerPokemon().getAbility().id).toBe(AbilityId.BALL_FETCH); }); it("should activate post-summon abilities", async () => { @@ -48,6 +48,6 @@ describe("Moves - Role Play", () => { game.move.select(MoveId.ROLE_PLAY); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.ATK)).toBe(-1); }); }); diff --git a/test/moves/roost.test.ts b/test/moves/roost.test.ts index e4ea09e245c..bb567a41cd0 100644 --- a/test/moves/roost.test.ts +++ b/test/moves/roost.test.ts @@ -49,7 +49,7 @@ describe("Moves - Roost", () => { test("Non flying type uses roost -> no type change, took damage", async () => { await game.classicMode.startBattle([SpeciesId.DUNSPARCE]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerPokemonStartingHP = playerPokemon.hp; game.move.select(MoveId.ROOST); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -73,7 +73,7 @@ describe("Moves - Roost", () => { test("Pure flying type -> becomes normal after roost and takes damage from ground moves -> regains flying", async () => { await game.classicMode.startBattle([SpeciesId.TORNADUS]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerPokemonStartingHP = playerPokemon.hp; game.move.select(MoveId.ROOST); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -97,7 +97,7 @@ describe("Moves - Roost", () => { test("Dual X/flying type -> becomes type X after roost and takes damage from ground moves -> regains flying", async () => { await game.classicMode.startBattle([SpeciesId.HAWLUCHA]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerPokemonStartingHP = playerPokemon.hp; game.move.select(MoveId.ROOST); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -122,7 +122,7 @@ describe("Moves - Roost", () => { test("Pokemon with levitate after using roost should lose flying type but still be unaffected by ground moves", async () => { game.override.starterForms({ [SpeciesId.ROTOM]: 4 }); await game.classicMode.startBattle([SpeciesId.ROTOM]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerPokemonStartingHP = playerPokemon.hp; game.move.select(MoveId.ROOST); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -146,7 +146,7 @@ describe("Moves - Roost", () => { test("A fire/flying type that uses burn up, then roost should be typeless until end of turn", async () => { await game.classicMode.startBattle([SpeciesId.MOLTRES]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerPokemonStartingHP = playerPokemon.hp; game.move.select(MoveId.BURN_UP); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -182,7 +182,7 @@ describe("Moves - Roost", () => { test("An electric/flying type that uses double shock, then roost should be typeless until end of turn", async () => { game.override.enemySpecies(SpeciesId.ZEKROM); await game.classicMode.startBattle([SpeciesId.ZAPDOS]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); const playerPokemonStartingHP = playerPokemon.hp; game.move.select(MoveId.DOUBLE_SHOCK); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -223,7 +223,7 @@ describe("Moves - Roost", () => { MoveId.TRICK_OR_TREAT, ]); await game.classicMode.startBattle([SpeciesId.MOLTRES]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.ROOST); await game.phaseInterceptor.to(MoveEffectPhase); diff --git a/test/moves/safeguard.test.ts b/test/moves/safeguard.test.ts index 19b56cd759f..2157f01fee4 100644 --- a/test/moves/safeguard.test.ts +++ b/test/moves/safeguard.test.ts @@ -37,7 +37,7 @@ describe("Moves - Safeguard", () => { it("protects from damaging moves with additional effects", async () => { await game.classicMode.startBattle(); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.NUZZLE); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -48,7 +48,7 @@ describe("Moves - Safeguard", () => { it("protects from status moves", async () => { await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SPORE); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -60,7 +60,7 @@ describe("Moves - Safeguard", () => { it("protects from confusion", async () => { game.override.moveset([MoveId.CONFUSE_RAY]); await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.CONFUSE_RAY); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -89,7 +89,7 @@ describe("Moves - Safeguard", () => { it("protects from Yawn", async () => { await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.YAWN); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); @@ -100,7 +100,7 @@ describe("Moves - Safeguard", () => { it("doesn't protect from already existing Yawn", async () => { await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.YAWN); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -115,7 +115,7 @@ describe("Moves - Safeguard", () => { it("doesn't protect from self-inflicted status from Rest or Flame Orb", async () => { game.override.enemyHeldItems([{ name: "FLAME_ORB" }]); await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); enemyPokemon.hp = 1; game.move.select(MoveId.SPLASH); diff --git a/test/moves/scale-shot.test.ts b/test/moves/scale-shot.test.ts index 7e5c60577ce..4a3369ce9fc 100644 --- a/test/moves/scale-shot.test.ts +++ b/test/moves/scale-shot.test.ts @@ -42,7 +42,7 @@ describe("Moves - Scale Shot", () => { game.override.enemySpecies(SpeciesId.FORRETRESS); await game.classicMode.startBattle([SpeciesId.MINCCINO]); - const minccino = game.scene.getPlayerPokemon()!; + const minccino = game.field.getPlayerPokemon(); game.move.select(MoveId.SCALE_SHOT); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -70,7 +70,7 @@ describe("Moves - Scale Shot", () => { vi.spyOn(moveToCheck, "calculateBattlePower"); await game.classicMode.startBattle([SpeciesId.MINCCINO]); - const minccino = game.scene.getPlayerPokemon()!; + const minccino = game.field.getPlayerPokemon(); game.move.select(MoveId.SCALE_SHOT); await game.phaseInterceptor.to(TurnEndPhase); diff --git a/test/moves/secret-power.test.ts b/test/moves/secret-power.test.ts index 16090bebcbe..b8f713f59cf 100644 --- a/test/moves/secret-power.test.ts +++ b/test/moves/secret-power.test.ts @@ -43,7 +43,7 @@ describe("Moves - Secret Power", () => { vi.spyOn(allMoves[MoveId.SECRET_POWER], "chance", "get").mockReturnValue(100); await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); // No Terrain + BiomeId.VOLCANO --> Burn game.move.select(MoveId.SECRET_POWER); diff --git a/test/moves/shed-tail.test.ts b/test/moves/shed-tail.test.ts index ff2b29e846d..b53af269875 100644 --- a/test/moves/shed-tail.test.ts +++ b/test/moves/shed-tail.test.ts @@ -34,14 +34,14 @@ describe("Moves - Shed Tail", () => { it("transfers a Substitute doll to the switched in Pokemon", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); - const magikarp = game.scene.getPlayerPokemon()!; + const magikarp = game.field.getPlayerPokemon(); game.move.select(MoveId.SHED_TAIL); game.doSelectPartyPokemon(1); await game.phaseInterceptor.to("TurnEndPhase", false); - const feebas = game.scene.getPlayerPokemon()!; + const feebas = game.field.getPlayerPokemon(); const substituteTag = feebas.getTag(SubstituteTag); expect(feebas).not.toBe(magikarp); @@ -55,7 +55,7 @@ describe("Moves - Shed Tail", () => { it("should fail if no ally is available to switch in", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const magikarp = game.scene.getPlayerPokemon()!; + const magikarp = game.field.getPlayerPokemon(); expect(game.scene.getPlayerParty().length).toBe(1); game.move.select(MoveId.SHED_TAIL); diff --git a/test/moves/shell-trap.test.ts b/test/moves/shell-trap.test.ts index d2908278d93..5ecad3116af 100644 --- a/test/moves/shell-trap.test.ts +++ b/test/moves/shell-trap.test.ts @@ -133,8 +133,8 @@ describe("Moves - Shell Trap", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SHELL_TRAP); diff --git a/test/moves/simple-beam.test.ts b/test/moves/simple-beam.test.ts index f45c19c690e..a5ad6c5af8f 100644 --- a/test/moves/simple-beam.test.ts +++ b/test/moves/simple-beam.test.ts @@ -37,6 +37,6 @@ describe("Moves - Simple Beam", () => { game.move.select(MoveId.SIMPLE_BEAM); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(AbilityId.SIMPLE); + expect(game.field.getEnemyPokemon().getAbility().id).toBe(AbilityId.SIMPLE); }); }); diff --git a/test/moves/sketch.test.ts b/test/moves/sketch.test.ts index fff9be97e2d..ed010b8a883 100644 --- a/test/moves/sketch.test.ts +++ b/test/moves/sketch.test.ts @@ -38,7 +38,7 @@ describe("Moves - Sketch", () => { it("Sketch should not fail even if a previous Sketch failed to retrieve a valid move and ran out of PP", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // can't use normal moveset override because we need to check moveset changes playerPokemon.moveset = [new PokemonMove(MoveId.SKETCH), new PokemonMove(MoveId.SKETCH)]; @@ -60,8 +60,8 @@ describe("Moves - Sketch", () => { it("Sketch should retrieve the most recent valid move from its target history", async () => { game.override.enemyStatusEffect(StatusEffect.PARALYSIS); await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); playerPokemon.moveset = [new PokemonMove(MoveId.SKETCH), new PokemonMove(MoveId.GROWL)]; game.move.select(MoveId.GROWL); @@ -88,7 +88,7 @@ describe("Moves - Sketch", () => { game.override.enemyMoveset([MoveId.METRONOME]); await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.moveset = [new PokemonMove(MoveId.SKETCH)]; // Opponent uses Metronome -> False Swipe, then player uses Sketch, which should sketch Metronome diff --git a/test/moves/skill-swap.test.ts b/test/moves/skill-swap.test.ts index 50a0a232f6e..1b3c0255895 100644 --- a/test/moves/skill-swap.test.ts +++ b/test/moves/skill-swap.test.ts @@ -39,8 +39,8 @@ describe("Moves - Skill Swap", () => { game.move.select(MoveId.SKILL_SWAP); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()?.getAbility().id).toBe(AbilityId.BALL_FETCH); - expect(game.scene.getEnemyPokemon()?.getAbility().id).toBe(AbilityId.ADAPTABILITY); + expect(game.field.getPlayerPokemon().getAbility().id).toBe(AbilityId.BALL_FETCH); + expect(game.field.getEnemyPokemon().getAbility().id).toBe(AbilityId.ADAPTABILITY); }); it("should activate post-summon abilities", async () => { @@ -51,6 +51,6 @@ describe("Moves - Skill Swap", () => { await game.phaseInterceptor.to("BerryPhase"); // player atk should be -1 after opponent gains intimidate and it activates - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(-1); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)).toBe(-1); }); }); diff --git a/test/moves/sleep-talk.test.ts b/test/moves/sleep-talk.test.ts index 8593f4b4d07..9e8db2e3615 100644 --- a/test/moves/sleep-talk.test.ts +++ b/test/moves/sleep-talk.test.ts @@ -42,7 +42,7 @@ describe("Moves - Sleep Talk", () => { game.move.select(MoveId.SLEEP_TALK); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should fail if the user has no valid moves", async () => { @@ -51,7 +51,7 @@ describe("Moves - Sleep Talk", () => { game.move.select(MoveId.SLEEP_TALK); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(game.field.getPlayerPokemon().getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); it("should call a random valid move if the user is asleep", async () => { @@ -60,7 +60,7 @@ describe("Moves - Sleep Talk", () => { game.move.select(MoveId.SLEEP_TALK); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.getStatStage(Stat.ATK)); + expect(game.field.getPlayerPokemon().getStatStage(Stat.ATK)); }); it("should apply secondary effects of a move", async () => { @@ -70,6 +70,6 @@ describe("Moves - Sleep Talk", () => { game.move.select(MoveId.SLEEP_TALK); await game.toNextTurn(); - expect(game.scene.getPlayerPokemon()!.isFullHp()).toBeFalsy(); // Wood Hammer recoil effect should be applied + expect(game.field.getPlayerPokemon().isFullHp()).toBeFalsy(); // Wood Hammer recoil effect should be applied }); }); diff --git a/test/moves/solar-beam.test.ts b/test/moves/solar-beam.test.ts index f4347493de5..6a413776972 100644 --- a/test/moves/solar-beam.test.ts +++ b/test/moves/solar-beam.test.ts @@ -38,8 +38,8 @@ describe("Moves - Solar Beam", () => { it("should deal damage in two turns if no weather is active", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SOLAR_BEAM); @@ -66,8 +66,8 @@ describe("Moves - Solar Beam", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SOLAR_BEAM); diff --git a/test/moves/sparkly-swirl.test.ts b/test/moves/sparkly-swirl.test.ts index 6e43211ed50..7cda68438e1 100644 --- a/test/moves/sparkly-swirl.test.ts +++ b/test/moves/sparkly-swirl.test.ts @@ -36,7 +36,7 @@ describe("Moves - Sparkly Swirl", () => { game.override.battleStyle("double").statusEffect(StatusEffect.BURN); await game.classicMode.startBattle([SpeciesId.RATTATA, SpeciesId.RATTATA, SpeciesId.RATTATA]); const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getPlayerParty(); - const leftOpp = game.scene.getEnemyPokemon()!; + const leftOpp = game.field.getEnemyPokemon(); vi.spyOn(leftPlayer, "resetStatus"); vi.spyOn(rightPlayer, "resetStatus"); diff --git a/test/moves/spectral-thief.test.ts b/test/moves/spectral-thief.test.ts index dd988ac667a..45005ccf32d 100644 --- a/test/moves/spectral-thief.test.ts +++ b/test/moves/spectral-thief.test.ts @@ -36,8 +36,8 @@ describe("Moves - Spectral Thief", () => { it("should steal max possible positive stat changes and ignore negative ones.", async () => { await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.setStatStage(Stat.ATK, 6); enemy.setStatStage(Stat.DEF, -6); @@ -69,8 +69,8 @@ describe("Moves - Spectral Thief", () => { game.override.enemySpecies(SpeciesId.MAGIKARP).enemyLevel(50); await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); const moveToCheck = allMoves[MoveId.SPECTRAL_THIEF]; const dmgBefore = enemy.getAttackDamage({ source: player, move: moveToCheck }).damage; @@ -88,8 +88,8 @@ describe("Moves - Spectral Thief", () => { game.override.ability(AbilityId.CONTRARY); await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.setStatStage(Stat.ATK, 6); @@ -106,8 +106,8 @@ describe("Moves - Spectral Thief", () => { game.override.ability(AbilityId.SIMPLE); await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.setStatStage(Stat.ATK, 3); @@ -124,8 +124,8 @@ describe("Moves - Spectral Thief", () => { game.override.enemyAbility(AbilityId.CLEAR_BODY); await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.setStatStage(Stat.ATK, 3); @@ -142,8 +142,8 @@ describe("Moves - Spectral Thief", () => { game.override.enemyAbility(AbilityId.WHITE_SMOKE); await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.setStatStage(Stat.ATK, 3); @@ -160,8 +160,8 @@ describe("Moves - Spectral Thief", () => { game.override.enemyAbility(AbilityId.HYPER_CUTTER); await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.setStatStage(Stat.ATK, 3); @@ -178,8 +178,8 @@ describe("Moves - Spectral Thief", () => { game.override.enemyMoveset(MoveId.SUBSTITUTE); await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.setStatStage(Stat.ATK, 3); @@ -198,8 +198,8 @@ describe("Moves - Spectral Thief", () => { game.override.enemyMoveset(MoveId.PROTECT); await game.classicMode.startBattle(); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); enemy.setStatStage(Stat.ATK, 3); diff --git a/test/moves/speed-swap.test.ts b/test/moves/speed-swap.test.ts index b67ad68746a..1b8e1d24a61 100644 --- a/test/moves/speed-swap.test.ts +++ b/test/moves/speed-swap.test.ts @@ -36,8 +36,8 @@ describe("Moves - Speed Swap", () => { it("should swap the user's SPD and the target's SPD stats", async () => { await game.classicMode.startBattle([SpeciesId.INDEEDEE]); - const player = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); const playerSpd = player.getStat(Stat.SPD, false); const enemySpd = enemy.getStat(Stat.SPD, false); diff --git a/test/moves/spit-up.test.ts b/test/moves/spit-up.test.ts index 22722cfed2b..8b110b0ea04 100644 --- a/test/moves/spit-up.test.ts +++ b/test/moves/spit-up.test.ts @@ -50,7 +50,7 @@ describe("Moves - Spit Up", () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); pokemon.addTag(BattlerTagType.STOCKPILING); const stockpilingTag = pokemon.getTag(StockpilingTag)!; @@ -72,7 +72,7 @@ describe("Moves - Spit Up", () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); pokemon.addTag(BattlerTagType.STOCKPILING); pokemon.addTag(BattlerTagType.STOCKPILING); @@ -95,7 +95,7 @@ describe("Moves - Spit Up", () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); pokemon.addTag(BattlerTagType.STOCKPILING); pokemon.addTag(BattlerTagType.STOCKPILING); pokemon.addTag(BattlerTagType.STOCKPILING); @@ -117,7 +117,7 @@ describe("Moves - Spit Up", () => { it("fails without stacks", async () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); const stockpilingTag = pokemon.getTag(StockpilingTag)!; expect(stockpilingTag).toBeUndefined(); @@ -128,7 +128,7 @@ describe("Moves - Spit Up", () => { expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: MoveId.SPIT_UP, result: MoveResult.FAIL, - targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + targets: [game.field.getEnemyPokemon().getBattlerIndex()], }); expect(spitUp.calculateBattlePower).not.toHaveBeenCalled(); @@ -138,7 +138,7 @@ describe("Moves - Spit Up", () => { it("decreases stats based on stored values (both boosts equal)", async () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); pokemon.addTag(BattlerTagType.STOCKPILING); const stockpilingTag = pokemon.getTag(StockpilingTag)!; @@ -155,7 +155,7 @@ describe("Moves - Spit Up", () => { expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: MoveId.SPIT_UP, result: MoveResult.SUCCESS, - targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + targets: [game.field.getEnemyPokemon().getBattlerIndex()], }); expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); @@ -169,7 +169,7 @@ describe("Moves - Spit Up", () => { it("decreases stats based on stored values (different boosts)", async () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); pokemon.addTag(BattlerTagType.STOCKPILING); const stockpilingTag = pokemon.getTag(StockpilingTag)!; @@ -187,7 +187,7 @@ describe("Moves - Spit Up", () => { expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: MoveId.SPIT_UP, result: MoveResult.SUCCESS, - targets: [game.scene.getEnemyPokemon()!.getBattlerIndex()], + targets: [game.field.getEnemyPokemon().getBattlerIndex()], }); expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce(); diff --git a/test/moves/steamroller.test.ts b/test/moves/steamroller.test.ts index 2219b95e733..75b2b66560e 100644 --- a/test/moves/steamroller.test.ts +++ b/test/moves/steamroller.test.ts @@ -32,12 +32,12 @@ describe("Moves - Steamroller", () => { game.override.enemySpecies(SpeciesId.DITTO).enemyMoveset(MoveId.MINIMIZE); await game.classicMode.startBattle([SpeciesId.IRON_BOULDER]); - const ditto = game.scene.getEnemyPokemon()!; + const ditto = game.field.getEnemyPokemon(); vi.spyOn(ditto, "getAttackDamage"); ditto.hp = 5000; const steamroller = allMoves[MoveId.STEAMROLLER]; vi.spyOn(steamroller, "calculateBattleAccuracy"); - const ironBoulder = game.scene.getPlayerPokemon()!; + const ironBoulder = game.field.getPlayerPokemon(); vi.spyOn(ironBoulder, "getAccuracyMultiplier"); // Turn 1 game.move.select(MoveId.STEAMROLLER); diff --git a/test/moves/stockpile.test.ts b/test/moves/stockpile.test.ts index 5b170c10fcb..2da1285ace2 100644 --- a/test/moves/stockpile.test.ts +++ b/test/moves/stockpile.test.ts @@ -38,7 +38,7 @@ describe("Moves - Stockpile", () => { it("gains a stockpile stack and raises user's DEF and SPDEF stat stages by 1 on each use, fails at max stacks (3)", async () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); // Unfortunately, Stockpile stacks are not directly queryable (i.e. there is no pokemon.getStockpileStacks()), // we just have to know that they're implemented as a BattlerTag. @@ -78,7 +78,7 @@ describe("Moves - Stockpile", () => { it("gains a stockpile stack even if user's DEF and SPDEF stat stages are at +6", async () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); user.setStatStage(Stat.DEF, 6); user.setStatStage(Stat.SPDEF, 6); diff --git a/test/moves/struggle.test.ts b/test/moves/struggle.test.ts index 21c4e204974..cba049e7277 100644 --- a/test/moves/struggle.test.ts +++ b/test/moves/struggle.test.ts @@ -35,7 +35,7 @@ describe("Moves - Struggle", () => { game.override.moveset([MoveId.STRUGGLE]).ability(AbilityId.ADAPTABILITY); await game.classicMode.startBattle([SpeciesId.RATTATA]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.STRUGGLE); const stabSpy = vi.spyOn(enemy, "calculateStabMultiplier"); @@ -49,7 +49,7 @@ describe("Moves - Struggle", () => { game.override.moveset([MoveId.STRUGGLE]); await game.classicMode.startBattle([SpeciesId.GASTLY]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.STRUGGLE); const moveEffectivenessSpy = vi.spyOn(enemy, "getMoveEffectiveness"); diff --git a/test/moves/substitute.test.ts b/test/moves/substitute.test.ts index 15fd770805a..89018a8d592 100644 --- a/test/moves/substitute.test.ts +++ b/test/moves/substitute.test.ts @@ -49,7 +49,7 @@ describe("Moves - Substitute", () => { it("should cause the user to take damage", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SUBSTITUTE); @@ -63,7 +63,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.SKARMORY]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SUBSTITUTE); @@ -86,7 +86,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SUBSTITUTE); @@ -107,7 +107,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SUBSTITUTE); @@ -122,7 +122,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SUBSTITUTE); @@ -142,7 +142,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SUBSTITUTE); @@ -160,7 +160,7 @@ describe("Moves - Substitute", () => { it("shouldn't block the user's own status moves", async () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.SUBSTITUTE); @@ -179,7 +179,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); vi.spyOn(leadPokemon, "getMoveEffectiveness"); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -197,7 +197,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); vi.spyOn(leadPokemon, "getMoveEffectiveness"); game.move.select(MoveId.SUBSTITUTE); @@ -233,8 +233,8 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -251,7 +251,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -268,7 +268,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -284,7 +284,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -301,7 +301,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -317,7 +317,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); enemyPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, enemyPokemon.id); const enemyNumItems = enemyPokemon.getHeldItems().length; @@ -334,8 +334,8 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -355,7 +355,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -372,7 +372,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -389,7 +389,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE, SpeciesId.CHARIZARD]); - const leadPokemon = game.scene.getPlayerPokemon()!; + const leadPokemon = game.field.getPlayerPokemon(); leadPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, leadPokemon.id); @@ -400,7 +400,7 @@ describe("Moves - Substitute", () => { await game.phaseInterceptor.to("MovePhase", false); - const switchedPokemon = game.scene.getPlayerPokemon()!; + const switchedPokemon = game.field.getPlayerPokemon(); const subTag = switchedPokemon.getTag(SubstituteTag)!; expect(subTag).toBeDefined(); expect(subTag.hp).toBe(Math.floor((leadPokemon.getMaxHp() * 1) / 4)); @@ -411,7 +411,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SUBSTITUTE); @@ -428,8 +428,8 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, playerPokemon.id); @@ -446,7 +446,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, playerPokemon.id); @@ -462,8 +462,8 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, playerPokemon.id); @@ -479,8 +479,8 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, playerPokemon.id); @@ -497,7 +497,7 @@ describe("Moves - Substitute", () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.addTag(BattlerTagType.SUBSTITUTE, 0, MoveId.NONE, playerPokemon.id); diff --git a/test/moves/swallow.test.ts b/test/moves/swallow.test.ts index 1ae31517cb6..f896a4c9c77 100644 --- a/test/moves/swallow.test.ts +++ b/test/moves/swallow.test.ts @@ -43,7 +43,7 @@ describe("Moves - Swallow", () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); pokemon["hp"] = 1; @@ -70,7 +70,7 @@ describe("Moves - Swallow", () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); pokemon["hp"] = 1; @@ -98,7 +98,7 @@ describe("Moves - Swallow", () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); vi.spyOn(pokemon, "getMaxHp").mockReturnValue(100); pokemon["hp"] = 0.0001; @@ -125,7 +125,7 @@ describe("Moves - Swallow", () => { it("fails without stacks", async () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); const stockpilingTag = pokemon.getTag(StockpilingTag)!; expect(stockpilingTag).toBeUndefined(); @@ -144,7 +144,7 @@ describe("Moves - Swallow", () => { it("decreases stats based on stored values (both boosts equal)", async () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); pokemon.addTag(BattlerTagType.STOCKPILING); const stockpilingTag = pokemon.getTag(StockpilingTag)!; @@ -173,7 +173,7 @@ describe("Moves - Swallow", () => { it("lower stat stages based on stored values (different boosts)", async () => { await game.classicMode.startBattle([SpeciesId.ABOMASNOW]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); pokemon.addTag(BattlerTagType.STOCKPILING); const stockpilingTag = pokemon.getTag(StockpilingTag)!; diff --git a/test/moves/synchronoise.test.ts b/test/moves/synchronoise.test.ts index 3cfeaf04af9..98178b66d00 100644 --- a/test/moves/synchronoise.test.ts +++ b/test/moves/synchronoise.test.ts @@ -34,8 +34,8 @@ describe("Moves - Synchronoise", () => { it("should consider the user's tera type if it is terastallized", async () => { await game.classicMode.startBattle([SpeciesId.BIDOOF]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); // force the player to be terastallized playerPokemon.teraType = PokemonType.WATER; diff --git a/test/moves/syrup-bomb.test.ts b/test/moves/syrup-bomb.test.ts index 3e5bddf1e7b..75f76595730 100644 --- a/test/moves/syrup-bomb.test.ts +++ b/test/moves/syrup-bomb.test.ts @@ -40,7 +40,7 @@ describe("Moves - SYRUP BOMB", () => { it("decreases the target Pokemon's speed stat once per turn for 3 turns", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const targetPokemon = game.scene.getEnemyPokemon()!; + const targetPokemon = game.field.getEnemyPokemon(); expect(targetPokemon.getStatStage(Stat.SPD)).toBe(0); game.move.select(MoveId.SYRUP_BOMB); @@ -65,7 +65,7 @@ describe("Moves - SYRUP BOMB", () => { game.override.enemyAbility(AbilityId.BULLETPROOF); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const targetPokemon = game.scene.getEnemyPokemon()!; + const targetPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.SYRUP_BOMB); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); @@ -87,6 +87,6 @@ describe("Moves - SYRUP BOMB", () => { game.doSwitchPokemon(1); await game.toNextTurn(); - expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPD)).toBe(-1); + expect(game.field.getEnemyPokemon().getStatStage(Stat.SPD)).toBe(-1); }); }); diff --git a/test/moves/tail-whip.test.ts b/test/moves/tail-whip.test.ts index c872b2535e3..8d2dfbda096 100644 --- a/test/moves/tail-whip.test.ts +++ b/test/moves/tail-whip.test.ts @@ -39,7 +39,7 @@ describe("Moves - Tail whip", () => { const moveToUse = MoveId.TAIL_WHIP; await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.MIGHTYENA]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0); game.move.select(moveToUse); diff --git a/test/moves/tailwind.test.ts b/test/moves/tailwind.test.ts index 436c854066f..5c91a37f786 100644 --- a/test/moves/tailwind.test.ts +++ b/test/moves/tailwind.test.ts @@ -81,8 +81,8 @@ describe("Moves - Tailwind", () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const ally = game.scene.getPlayerPokemon()!; - const enemy = game.scene.getEnemyPokemon()!; + const ally = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); const allySpd = ally.getStat(Stat.SPD); const enemySpd = enemy.getStat(Stat.SPD); diff --git a/test/moves/tar-shot.test.ts b/test/moves/tar-shot.test.ts index 719b5e4c7fe..d8da8c3437e 100644 --- a/test/moves/tar-shot.test.ts +++ b/test/moves/tar-shot.test.ts @@ -36,7 +36,7 @@ describe("Moves - Tar Shot", () => { it("lowers the target's Speed stat by one stage and doubles the effectiveness of Fire-type moves used on the target", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); @@ -57,7 +57,7 @@ describe("Moves - Tar Shot", () => { it("will not double the effectiveness of Fire-type moves used on a target that is already under the effect of Tar Shot (but may still lower its Speed)", async () => { await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); @@ -86,7 +86,7 @@ describe("Moves - Tar Shot", () => { game.override.enemySpecies(SpeciesId.SPRIGATITO); await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); enemy.teraType = PokemonType.GRASS; enemy.isTerastallized = true; @@ -110,7 +110,7 @@ describe("Moves - Tar Shot", () => { game.override.enemySpecies(SpeciesId.SPRIGATITO); await game.classicMode.startBattle([SpeciesId.PIKACHU]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); vi.spyOn(enemy, "getMoveEffectiveness"); diff --git a/test/moves/taunt.test.ts b/test/moves/taunt.test.ts index f16a019ce2c..6ac158d3a8f 100644 --- a/test/moves/taunt.test.ts +++ b/test/moves/taunt.test.ts @@ -33,7 +33,7 @@ describe("Moves - Taunt", () => { it("Pokemon should not be able to use Status Moves", async () => { await game.classicMode.startBattle([SpeciesId.REGIELEKI]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // First turn, Player Pokemon succeeds using Growl without Taunt game.move.select(MoveId.GROWL); diff --git a/test/moves/telekinesis.test.ts b/test/moves/telekinesis.test.ts index 4c452c24ec6..f14c42d1dcc 100644 --- a/test/moves/telekinesis.test.ts +++ b/test/moves/telekinesis.test.ts @@ -37,7 +37,7 @@ describe("Moves - Telekinesis", () => { it("Telekinesis makes the affected vulnerable to most attacking moves regardless of accuracy", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyOpponent = game.scene.getEnemyPokemon()!; + const enemyOpponent = game.field.getEnemyPokemon(); game.move.select(MoveId.TELEKINESIS); await game.phaseInterceptor.to("TurnEndPhase"); @@ -54,7 +54,7 @@ describe("Moves - Telekinesis", () => { it("Telekinesis makes the affected airborne and immune to most Ground-moves", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyOpponent = game.scene.getEnemyPokemon()!; + const enemyOpponent = game.field.getEnemyPokemon(); game.move.select(MoveId.TELEKINESIS); await game.phaseInterceptor.to("TurnEndPhase"); @@ -72,7 +72,7 @@ describe("Moves - Telekinesis", () => { game.override.enemyMoveset(MoveId.TRANSFORM); await game.classicMode.startBattle([SpeciesId.DIGLETT]); - const enemyOpponent = game.scene.getEnemyPokemon()!; + const enemyOpponent = game.field.getEnemyPokemon(); game.move.select(MoveId.TELEKINESIS); await game.phaseInterceptor.to("TurnEndPhase"); @@ -84,7 +84,7 @@ describe("Moves - Telekinesis", () => { it("Moves like Smack Down and 1000 Arrows remove all effects of Telekinesis from the target Pokemon", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemyOpponent = game.scene.getEnemyPokemon()!; + const enemyOpponent = game.field.getEnemyPokemon(); game.move.select(MoveId.TELEKINESIS); await game.phaseInterceptor.to("TurnEndPhase"); @@ -102,8 +102,8 @@ describe("Moves - Telekinesis", () => { game.override.enemyMoveset([MoveId.SPLASH, MoveId.INGRAIN]); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; - const enemyOpponent = game.scene.getEnemyPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); + const enemyOpponent = game.field.getEnemyPokemon(); game.move.select(MoveId.TELEKINESIS); await game.move.selectEnemyMove(MoveId.SPLASH); @@ -134,6 +134,6 @@ describe("Moves - Telekinesis", () => { game.doSelectPartyPokemon(1); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase"); - expect(game.scene.getPlayerPokemon()!.getTag(BattlerTagType.TELEKINESIS)).toBeUndefined(); + expect(game.field.getPlayerPokemon().getTag(BattlerTagType.TELEKINESIS)).toBeUndefined(); }); }); diff --git a/test/moves/tera-blast.test.ts b/test/moves/tera-blast.test.ts index 37dd8f53eaf..c23c990ec87 100644 --- a/test/moves/tera-blast.test.ts +++ b/test/moves/tera-blast.test.ts @@ -49,10 +49,10 @@ describe("Moves - Tera Blast", () => { it("changes type to match user's tera type", async () => { game.override.enemySpecies(SpeciesId.FURRET); await game.classicMode.startBattle(); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const spy = vi.spyOn(enemyPokemon, "getMoveEffectiveness"); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.teraType = PokemonType.FIGHTING; playerPokemon.isTerastallized = true; @@ -66,7 +66,7 @@ describe("Moves - Tera Blast", () => { it("increases power if user is Stellar tera type", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.teraType = PokemonType.STELLAR; playerPokemon.isTerastallized = true; @@ -80,11 +80,11 @@ describe("Moves - Tera Blast", () => { it("is super effective against terastallized targets if user is Stellar tera type", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.teraType = PokemonType.STELLAR; playerPokemon.isTerastallized = true; - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); const spy = vi.spyOn(enemyPokemon, "getMoveEffectiveness"); enemyPokemon.isTerastallized = true; @@ -98,7 +98,7 @@ describe("Moves - Tera Blast", () => { it("uses the higher ATK for damage calculation", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.stats[Stat.ATK] = 100; playerPokemon.stats[Stat.SPATK] = 1; playerPokemon.isTerastallized = true; @@ -113,7 +113,7 @@ describe("Moves - Tera Blast", () => { it("uses the higher SPATK for damage calculation", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.stats[Stat.ATK] = 1; playerPokemon.stats[Stat.SPATK] = 100; @@ -128,7 +128,7 @@ describe("Moves - Tera Blast", () => { game.override.enemyMoveset([MoveId.CHARM]); await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.stats[Stat.ATK] = 51; playerPokemon.stats[Stat.SPATK] = 50; @@ -146,7 +146,7 @@ describe("Moves - Tera Blast", () => { .starterSpecies(SpeciesId.CUBONE); await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.stats[Stat.ATK] = 50; playerPokemon.stats[Stat.SPATK] = 51; @@ -164,7 +164,7 @@ describe("Moves - Tera Blast", () => { game.override.ability(AbilityId.HUGE_POWER); await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.stats[Stat.ATK] = 50; playerPokemon.stats[Stat.SPATK] = 51; @@ -179,7 +179,7 @@ describe("Moves - Tera Blast", () => { it("causes stat drops if user is Stellar tera type", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); playerPokemon.teraType = PokemonType.STELLAR; playerPokemon.isTerastallized = true; @@ -199,14 +199,14 @@ describe("Moves - Tera Blast", () => { ])("should be $ty type if the user has $ab", async ({ ab_id, ty_id }) => { game.override.ability(ab_id).moveset([MoveId.TERA_BLAST]).enemyAbility(AbilityId.BALL_FETCH); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getMoveType(allMoves[MoveId.TERA_BLAST])).toBe(ty_id); }); it("should not be affected by normalize when the user is terastallized with tera normal", async () => { game.override.moveset([MoveId.TERA_BLAST]).ability(AbilityId.NORMALIZE); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // override the tera state for the pokemon playerPokemon.isTerastallized = true; playerPokemon.teraType = PokemonType.NORMAL; diff --git a/test/moves/tera-starstorm.test.ts b/test/moves/tera-starstorm.test.ts index d13ab3fb3b0..869cf597dde 100644 --- a/test/moves/tera-starstorm.test.ts +++ b/test/moves/tera-starstorm.test.ts @@ -36,7 +36,7 @@ describe("Moves - Tera Starstorm", () => { game.override.battleStyle("single"); await game.classicMode.startBattle([SpeciesId.TERAPAGOS]); - const terapagos = game.scene.getPlayerPokemon()!; + const terapagos = game.field.getPlayerPokemon(); terapagos.isTerastallized = true; vi.spyOn(terapagos, "getMoveType"); diff --git a/test/moves/thousand-arrows.test.ts b/test/moves/thousand-arrows.test.ts index e42e92d35d2..47bdce8476c 100644 --- a/test/moves/thousand-arrows.test.ts +++ b/test/moves/thousand-arrows.test.ts @@ -36,7 +36,7 @@ describe("Moves - Thousand Arrows", () => { it("move should hit and ground Flying-type targets", async () => { await game.classicMode.startBattle([SpeciesId.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THOUSAND_ARROWS); @@ -55,7 +55,7 @@ describe("Moves - Thousand Arrows", () => { await game.classicMode.startBattle([SpeciesId.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THOUSAND_ARROWS); @@ -74,7 +74,7 @@ describe("Moves - Thousand Arrows", () => { await game.classicMode.startBattle([SpeciesId.ILLUMISE]); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); enemyPokemon.addTag(BattlerTagType.FLOATING, undefined, MoveId.MAGNET_RISE); diff --git a/test/moves/throat-chop.test.ts b/test/moves/throat-chop.test.ts index f5e6a978e3d..a4f090b2de1 100644 --- a/test/moves/throat-chop.test.ts +++ b/test/moves/throat-chop.test.ts @@ -34,7 +34,7 @@ describe("Moves - Throat Chop", () => { it("prevents the target from using sound-based moves for two turns", async () => { await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.GROWL); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); diff --git a/test/moves/thunder-wave.test.ts b/test/moves/thunder-wave.test.ts index 84408ace7e9..9c630852d48 100644 --- a/test/moves/thunder-wave.test.ts +++ b/test/moves/thunder-wave.test.ts @@ -36,7 +36,7 @@ describe("Moves - Thunder Wave", () => { game.override.enemySpecies(SpeciesId.MAGIKARP); await game.classicMode.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon: EnemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDER_WAVE); await game.move.forceHit(); @@ -49,7 +49,7 @@ describe("Moves - Thunder Wave", () => { game.override.enemySpecies(SpeciesId.DIGLETT); await game.classicMode.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon: EnemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDER_WAVE); await game.move.forceHit(); @@ -62,7 +62,7 @@ describe("Moves - Thunder Wave", () => { game.override.enemySpecies(SpeciesId.MAGIKARP).enemyStatusEffect(StatusEffect.BURN); await game.classicMode.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon: EnemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDER_WAVE); await game.move.forceHit(); @@ -75,7 +75,7 @@ describe("Moves - Thunder Wave", () => { game.override.ability(AbilityId.NORMALIZE).enemySpecies(SpeciesId.DIGLETT); await game.classicMode.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon: EnemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDER_WAVE); await game.move.forceHit(); @@ -88,7 +88,7 @@ describe("Moves - Thunder Wave", () => { game.override.ability(AbilityId.NORMALIZE).enemySpecies(SpeciesId.HAUNTER); await game.classicMode.startBattle(); - const enemyPokemon: EnemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon: EnemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.THUNDER_WAVE); await game.move.forceHit(); diff --git a/test/moves/tidy-up.test.ts b/test/moves/tidy-up.test.ts index 8dd74e4ab78..51399552a08 100644 --- a/test/moves/tidy-up.test.ts +++ b/test/moves/tidy-up.test.ts @@ -92,7 +92,7 @@ describe("Moves - Tidy Up", () => { game.move.select(MoveId.TIDY_UP); await game.phaseInterceptor.to(MoveEndPhase); - const pokemon = [game.scene.getPlayerPokemon()!, game.scene.getEnemyPokemon()!]; + const pokemon = [game.field.getPlayerPokemon(), game.field.getEnemyPokemon()]; pokemon.forEach(p => { expect(p).toBeDefined(); expect(p!.getTag(SubstituteTag)).toBeUndefined(); @@ -102,7 +102,7 @@ describe("Moves - Tidy Up", () => { it("user's stats are raised with no traps set", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); expect(playerPokemon.getStatStage(Stat.ATK)).toBe(0); expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); diff --git a/test/moves/torment.test.ts b/test/moves/torment.test.ts index 1ed4529fcbd..cdefd8ef005 100644 --- a/test/moves/torment.test.ts +++ b/test/moves/torment.test.ts @@ -36,7 +36,7 @@ describe("Moves - Torment", () => { it("Pokemon should not be able to use the same move consecutively", async () => { await game.classicMode.startBattle([SpeciesId.CHANSEY]); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); // First turn, Player Pokemon uses Tackle successfully game.move.select(MoveId.TACKLE); diff --git a/test/moves/toxic-spikes.test.ts b/test/moves/toxic-spikes.test.ts index 1315eaa31c3..0a0bf8baefc 100644 --- a/test/moves/toxic-spikes.test.ts +++ b/test/moves/toxic-spikes.test.ts @@ -86,7 +86,7 @@ describe("Moves - Toxic Spikes", () => { it("should be removed if a grounded poison pokemon switches in", async () => { await game.classicMode.runToSummon([SpeciesId.MUK, SpeciesId.PIDGEY]); - const muk = game.scene.getPlayerPokemon()!; + const muk = game.field.getPlayerPokemon(); game.move.select(MoveId.TOXIC_SPIKES); await game.toNextTurn(); diff --git a/test/moves/toxic.test.ts b/test/moves/toxic.test.ts index 13af6cf48fd..8044d2f9a90 100644 --- a/test/moves/toxic.test.ts +++ b/test/moves/toxic.test.ts @@ -37,7 +37,7 @@ describe("Moves - Toxic", () => { game.move.select(MoveId.TOXIC); await game.phaseInterceptor.to("BerryPhase", false); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.TOXIC); + expect(game.field.getEnemyPokemon().status?.effect).toBe(StatusEffect.TOXIC); }); it("may miss if user is not Poison-type", async () => { @@ -47,7 +47,7 @@ describe("Moves - Toxic", () => { game.move.select(MoveId.TOXIC); await game.phaseInterceptor.to("BerryPhase", false); - expect(game.scene.getEnemyPokemon()!.status).toBeUndefined(); + expect(game.field.getEnemyPokemon().status).toBeUndefined(); }); it("should hit semi-invulnerable targets if user is Poison-type", async () => { @@ -59,7 +59,7 @@ describe("Moves - Toxic", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); - expect(game.scene.getEnemyPokemon()!.status?.effect).toBe(StatusEffect.TOXIC); + expect(game.field.getEnemyPokemon().status?.effect).toBe(StatusEffect.TOXIC); }); it("should miss semi-invulnerable targets if user is not Poison-type", async () => { @@ -71,7 +71,7 @@ describe("Moves - Toxic", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); - expect(game.scene.getEnemyPokemon()!.status).toBeUndefined(); + expect(game.field.getEnemyPokemon().status).toBeUndefined(); }); it("moves other than Toxic should not hit semi-invulnerable targets even if user is Poison-type", async () => { @@ -82,7 +82,7 @@ describe("Moves - Toxic", () => { await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("BerryPhase", false); - const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyPokemon = game.field.getEnemyPokemon(); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); }); }); diff --git a/test/moves/trick-or-treat.test.ts b/test/moves/trick-or-treat.test.ts index 095cda873e0..3e32c877b9e 100644 --- a/test/moves/trick-or-treat.test.ts +++ b/test/moves/trick-or-treat.test.ts @@ -35,13 +35,13 @@ describe("Moves - Trick Or Treat", () => { it("will replace added type from Forest's Curse", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemyPokemon = game.scene.getEnemyPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.FORESTS_CURSE); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon!.summonData.addedType).toBe(PokemonType.GRASS); + expect(enemyPokemon.summonData.addedType).toBe(PokemonType.GRASS); game.move.select(MoveId.TRICK_OR_TREAT); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemyPokemon?.summonData.addedType).toBe(PokemonType.GHOST); + expect(enemyPokemon.summonData.addedType).toBe(PokemonType.GHOST); }); }); diff --git a/test/moves/u-turn.test.ts b/test/moves/u-turn.test.ts index fb34490fdf4..25c333e58e1 100644 --- a/test/moves/u-turn.test.ts +++ b/test/moves/u-turn.test.ts @@ -37,7 +37,7 @@ describe("Moves - U-turn", () => { const playerHp = 1; game.override.ability(AbilityId.REGENERATOR); await game.classicMode.startBattle([SpeciesId.RAICHU, SpeciesId.SHUCKLE]); - game.scene.getPlayerPokemon()!.hp = playerHp; + game.field.getPlayerPokemon().hp = playerHp; // act game.move.select(MoveId.U_TURN); @@ -49,7 +49,7 @@ describe("Moves - U-turn", () => { Math.floor(game.scene.getPlayerParty()[1].getMaxHp() * 0.33 + playerHp), ); expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(SpeciesId.SHUCKLE); + expect(game.field.getPlayerPokemon().species.speciesId).toBe(SpeciesId.SHUCKLE); }); it("triggers rough skin on the u-turn user before a new pokemon is switched in", async () => { @@ -63,9 +63,9 @@ describe("Moves - U-turn", () => { await game.phaseInterceptor.to("SwitchPhase", false); // assert - const playerPkm = game.scene.getPlayerPokemon()!; + const playerPkm = game.field.getPlayerPokemon(); expect(playerPkm.hp).not.toEqual(playerPkm.getMaxHp()); - expect(game.scene.getEnemyPokemon()!.waveData.abilityRevealed).toBe(true); // proxy for asserting ability activated + expect(game.field.getEnemyPokemon().waveData.abilityRevealed).toBe(true); // proxy for asserting ability activated expect(playerPkm.species.speciesId).toEqual(SpeciesId.RAICHU); expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); }); @@ -74,24 +74,24 @@ describe("Moves - U-turn", () => { // arrange game.override.enemyAbility(AbilityId.POISON_POINT); await game.classicMode.startBattle([SpeciesId.RAICHU, SpeciesId.SHUCKLE]); - vi.spyOn(game.scene.getEnemyPokemon()!, "randBattleSeedInt").mockReturnValue(0); + vi.spyOn(game.field.getEnemyPokemon(), "randBattleSeedInt").mockReturnValue(0); // act game.move.select(MoveId.U_TURN); await game.phaseInterceptor.to("SwitchPhase", false); // assert - const playerPkm = game.scene.getPlayerPokemon()!; + const playerPkm = game.field.getPlayerPokemon(); expect(playerPkm.status?.effect).toEqual(StatusEffect.POISON); expect(playerPkm.species.speciesId).toEqual(SpeciesId.RAICHU); - expect(game.scene.getEnemyPokemon()!.waveData.abilityRevealed).toBe(true); // proxy for asserting ability activated + expect(game.field.getEnemyPokemon().waveData.abilityRevealed).toBe(true); // proxy for asserting ability activated expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); }); it("still forces a switch if u-turn KO's the opponent", async () => { game.override.startingLevel(1000); // Ensure that U-Turn KO's the opponent await game.classicMode.startBattle([SpeciesId.RAICHU, SpeciesId.SHUCKLE]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); // KO the opponent with U-Turn game.move.select(MoveId.U_TURN); @@ -101,6 +101,6 @@ describe("Moves - U-turn", () => { // Check that U-Turn forced a switch expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); - expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(SpeciesId.SHUCKLE); + expect(game.field.getPlayerPokemon().species.speciesId).toBe(SpeciesId.SHUCKLE); }); }); diff --git a/test/moves/upper-hand.test.ts b/test/moves/upper-hand.test.ts index 91f3a34b9c6..b2e8dca2afc 100644 --- a/test/moves/upper-hand.test.ts +++ b/test/moves/upper-hand.test.ts @@ -38,8 +38,8 @@ describe("Moves - Upper Hand", () => { it("should flinch the opponent before they use a priority attack", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const feebas = game.scene.getPlayerPokemon()!; - const magikarp = game.scene.getEnemyPokemon()!; + const feebas = game.field.getPlayerPokemon(); + const magikarp = game.field.getEnemyPokemon(); game.move.select(MoveId.UPPER_HAND); await game.phaseInterceptor.to("BerryPhase"); @@ -57,7 +57,7 @@ describe("Moves - Upper Hand", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const feebas = game.scene.getPlayerPokemon()!; + const feebas = game.field.getPlayerPokemon(); game.move.select(MoveId.UPPER_HAND); await game.phaseInterceptor.to("BerryPhase"); @@ -70,8 +70,8 @@ describe("Moves - Upper Hand", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const feebas = game.scene.getPlayerPokemon()!; - const magikarp = game.scene.getEnemyPokemon()!; + const feebas = game.field.getPlayerPokemon(); + const magikarp = game.field.getEnemyPokemon(); game.move.select(MoveId.UPPER_HAND); await game.phaseInterceptor.to("BerryPhase"); @@ -86,7 +86,7 @@ describe("Moves - Upper Hand", () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const feebas = game.scene.getPlayerPokemon()!; + const feebas = game.field.getPlayerPokemon(); game.move.select(MoveId.UPPER_HAND); diff --git a/test/moves/whirlwind.test.ts b/test/moves/whirlwind.test.ts index 2aadb76b019..bbb2afe621a 100644 --- a/test/moves/whirlwind.test.ts +++ b/test/moves/whirlwind.test.ts @@ -48,7 +48,7 @@ describe("Moves - Whirlwind", () => { // Must have a pokemon in the back so that the move misses instead of fails. await game.classicMode.startBattle([SpeciesId.STARAPTOR, SpeciesId.MAGIKARP]); - const staraptor = game.scene.getPlayerPokemon()!; + const staraptor = game.field.getPlayerPokemon(); game.move.select(move); await game.move.selectEnemyMove(MoveId.WHIRLWIND); @@ -56,7 +56,7 @@ describe("Moves - Whirlwind", () => { await game.phaseInterceptor.to("BerryPhase", false); expect(staraptor.findTag(t => t.tagType === BattlerTagType.FLYING)).toBeDefined(); - expect(game.scene.getEnemyPokemon()!.getLastXMoves(1)[0].result).toBe(MoveResult.MISS); + expect(game.field.getEnemyPokemon().getLastXMoves(1)[0].result).toBe(MoveResult.MISS); }); it("should force switches randomly", async () => { @@ -208,7 +208,7 @@ describe("Moves - Whirlwind", () => { // expect the enemy to have at least 4 pokemon, necessary for this check to even work expect(game.scene.getEnemyParty().length, "enemy must have exactly 4 pokemon").toBeGreaterThanOrEqual(4); - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); console.log(user.getMoveset(false)); @@ -219,7 +219,7 @@ describe("Moves - Whirlwind", () => { await game.toNextTurn(); // Get the enemy pokemon id so we can check if is the same after switch. - const enemy_id = game.scene.getEnemyPokemon()!.id; + const enemy_id = game.field.getEnemyPokemon().id; // Hit the enemy that fainted with whirlwind. game.move.select(MoveId.WHIRLWIND, 0, BattlerIndex.ENEMY); @@ -231,7 +231,7 @@ describe("Moves - Whirlwind", () => { await game.toNextTurn(); // Expect the enemy pokemon to not have switched out. - expect(game.scene.getEnemyPokemon()!.id).toBe(enemy_id); + expect(game.field.getEnemyPokemon().id).toBe(enemy_id); }); it("should force a wild pokemon to flee", async () => { @@ -242,7 +242,7 @@ describe("Moves - Whirlwind", () => { .ability(AbilityId.BALL_FETCH); await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const user = game.scene.getPlayerPokemon()!; + const user = game.field.getPlayerPokemon(); game.move.select(MoveId.WHIRLWIND); await game.phaseInterceptor.to("BerryPhase"); diff --git a/test/moves/will-o-wisp.test.ts b/test/moves/will-o-wisp.test.ts index 5cb94c4617c..864413b0ce7 100644 --- a/test/moves/will-o-wisp.test.ts +++ b/test/moves/will-o-wisp.test.ts @@ -36,7 +36,7 @@ describe("Moves - Will-O-Wisp", () => { it("should burn the opponent", async () => { await game.classicMode.startBattle([SpeciesId.FEEBAS]); - const enemy = game.scene.getEnemyPokemon()!; + const enemy = game.field.getEnemyPokemon(); game.move.select(MoveId.WILL_O_WISP); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); diff --git a/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index 8ec9b4cb345..a48422c459f 100644 --- a/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -268,7 +268,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); - const leadPokemonItems = scene.getPlayerParty()?.[0].getHeldItems() as PokemonHeldItemModifier[]; + const leadPokemonItems = scene.getPlayerParty()[0].getHeldItems() as PokemonHeldItemModifier[]; const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier); expect(item).toBeDefined; }); diff --git a/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts index b66d0e95ad0..3025b08b8b6 100644 --- a/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts +++ b/test/mystery-encounter/encounters/fun-and-games-encounter.test.ts @@ -144,9 +144,9 @@ describe("Fun And Games! - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }, true); expect(scene.phaseManager.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); - expect(scene.getEnemyPokemon()?.species.speciesId).toBe(SpeciesId.WOBBUFFET); - expect(scene.getEnemyPokemon()?.ivs).toEqual([0, 0, 0, 0, 0, 0]); - expect(scene.getEnemyPokemon()?.nature).toBe(Nature.MILD); + expect(game.field.getEnemyPokemon().species.speciesId).toBe(SpeciesId.WOBBUFFET); + expect(game.field.getEnemyPokemon().ivs).toEqual([0, 0, 0, 0, 0, 0]); + expect(game.field.getEnemyPokemon().nature).toBe(Nature.MILD); game.onNextPrompt("MessagePhase", UiMode.MESSAGE, () => { game.endPhase(); @@ -206,7 +206,7 @@ describe("Fun And Games! - Mystery Encounter", () => { }); // Skip minigame - const wobbuffet = scene.getEnemyPokemon()!; + const wobbuffet = game.field.getEnemyPokemon(); wobbuffet.hp = Math.floor(0.2 * wobbuffet.getMaxHp()); scene.currentBattle.mysteryEncounter!.misc.turnsRemaining = 0; (game.scene.phaseManager.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, 0, MoveUseMode.NORMAL); @@ -236,7 +236,7 @@ describe("Fun And Games! - Mystery Encounter", () => { }); // Skip minigame - const wobbuffet = scene.getEnemyPokemon()!; + const wobbuffet = game.field.getEnemyPokemon(); wobbuffet.hp = Math.floor(0.1 * wobbuffet.getMaxHp()); scene.currentBattle.mysteryEncounter!.misc.turnsRemaining = 0; (game.scene.phaseManager.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, 0, MoveUseMode.NORMAL); @@ -266,7 +266,7 @@ describe("Fun And Games! - Mystery Encounter", () => { }); // Skip minigame - const wobbuffet = scene.getEnemyPokemon()!; + const wobbuffet = game.field.getEnemyPokemon(); wobbuffet.hp = 1; scene.currentBattle.mysteryEncounter!.misc.turnsRemaining = 0; (game.scene.phaseManager.getCurrentPhase() as CommandPhase).handleCommand(Command.FIGHT, 0, MoveUseMode.NORMAL); diff --git a/test/phases/frenzy-move-reset.test.ts b/test/phases/frenzy-move-reset.test.ts index 93406ddd577..feedd1b5865 100644 --- a/test/phases/frenzy-move-reset.test.ts +++ b/test/phases/frenzy-move-reset.test.ts @@ -52,7 +52,7 @@ describe("Frenzy Move Reset", () => { it("should cancel frenzy move if move fails turn 2", async () => { await game.classicMode.startBattle(); - const playerPokemon = game.scene.getPlayerPokemon()!; + const playerPokemon = game.field.getPlayerPokemon(); game.move.select(MoveId.THRASH); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); diff --git a/test/phases/learn-move-phase.test.ts b/test/phases/learn-move-phase.test.ts index 77902a0d959..3181f9238dd 100644 --- a/test/phases/learn-move-phase.test.ts +++ b/test/phases/learn-move-phase.test.ts @@ -29,7 +29,7 @@ describe("Learn Move Phase", () => { it("If Pokemon has less than 4 moves, its newest move will be added to the lowest empty index", async () => { game.override.moveset([MoveId.SPLASH]); await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const pokemon = game.scene.getPlayerPokemon()!; + const pokemon = game.field.getPlayerPokemon(); const newMovePos = pokemon?.getMoveset().length; game.move.select(MoveId.SPLASH); await game.doKillOpponents(); @@ -43,7 +43,7 @@ describe("Learn Move Phase", () => { it("If a pokemon has 4 move slots filled, the chosen move will be deleted and replaced", async () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const bulbasaur = game.scene.getPlayerPokemon()!; + const bulbasaur = game.field.getPlayerPokemon(); const prevMoveset = [MoveId.SPLASH, MoveId.ABSORB, MoveId.ACID, MoveId.VINE_WHIP]; const moveSlotNum = 3; @@ -74,7 +74,7 @@ describe("Learn Move Phase", () => { it("selecting the newly deleted move will reject it and keep old moveset", async () => { await game.classicMode.startBattle([SpeciesId.BULBASAUR]); - const bulbasaur = game.scene.getPlayerPokemon()!; + const bulbasaur = game.field.getPlayerPokemon(); const prevMoveset = [MoveId.SPLASH, MoveId.ABSORB, MoveId.ACID, MoveId.VINE_WHIP]; game.move.changeMoveset(bulbasaur, [MoveId.SPLASH, MoveId.ABSORB, MoveId.ACID, MoveId.VINE_WHIP]); From 375587213e344ab3531391b2c96ceb75bac08e5d Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 4 Aug 2025 21:24:58 -0700 Subject: [PATCH 075/106] [Misc] Replace `Moves.MOVE_NAME` with `MoveId.MOVE_NAME` in comments --- src/data/abilities/ability.ts | 2 +- src/data/battler-tags.ts | 2 +- src/data/moves/invalid-moves.ts | 4 ++-- src/data/moves/move.ts | 10 +++++----- src/field/pokemon.ts | 24 ++++++++++++------------ src/phases/move-phase.ts | 2 -- 6 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index 0ee1a51a78e..2f57df4a551 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -1768,7 +1768,7 @@ export interface AddSecondStrikeAbAttrParams extends Omit = new Set([ MoveId.HIDDEN_POWER, ]); -/** Set of all moves that cannot be copied by {@linkcode Moves.SKETCH}. */ +/** Set of all moves that cannot be copied by {@linkcode MoveId.SKETCH}. */ export const invalidSketchMoves: ReadonlySet = new Set([ MoveId.NONE, MoveId.CHATTER, @@ -270,7 +270,7 @@ export const invalidSketchMoves: ReadonlySet = new Set([ MoveId.BREAKNECK_BLITZ__SPECIAL, ]); -/** Set of all moves that cannot be locked into by {@linkcode Moves.ENCORE}. */ +/** Set of all moves that cannot be locked into by {@linkcode MoveId.ENCORE}. */ export const invalidEncoreMoves: ReadonlySet = new Set([ MoveId.MIMIC, MoveId.MIRROR_MOVE, diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index bde5f2977d8..5f52f48bfca 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -2587,7 +2587,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { } /** - * Applies the effect of {@linkcode Moves.PSYCHO_SHIFT} to its target. + * Applies the effect of {@linkcode MoveId.PSYCHO_SHIFT} to its target. * Psycho Shift takes the user's status effect and passes it onto the target. * The user is then healed after the move has been successfully executed. * @param user - The {@linkcode Pokemon} using the move @@ -2927,7 +2927,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { /** * Attribute to add the {@linkcode BattlerTagType.BYPASS_SLEEP | BYPASS_SLEEP Battler Tag} for 1 turn to the user before move use. - * Used by {@linkcode Moves.SNORE} and {@linkcode Moves.SLEEP_TALK}. + * Used by {@linkcode MoveId.SNORE} and {@linkcode MoveId.SLEEP_TALK}. */ // TODO: Should this use a battler tag? // TODO: Give this `userSleptOrComatoseCondition` by default @@ -7139,7 +7139,7 @@ export class CopyMoveAttr extends CallMoveAttr { /** * Attribute used for moves that cause the target to repeat their last used move. * - * Used by {@linkcode Moves.INSTRUCT | Instruct}. + * Used by {@linkcode MoveId.INSTRUCT | Instruct}. * @see [Instruct on Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Instruct_(move)) */ export class RepeatMoveAttr extends MoveEffectAttr { @@ -7402,7 +7402,7 @@ const targetMoveCopiableCondition: MoveConditionFunc = (user, target, move) => { /** * Attribute to temporarily copy the last move in the target's moveset. - * Used by {@linkcode Moves.MIMIC}. + * Used by {@linkcode MoveId.MIMIC}. */ export class MovesetCopyMoveAttr extends OverrideMoveEffectAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -7966,7 +7966,7 @@ export class VariableTargetAttr extends MoveAttr { /** * Attribute to cause the target to move immediately after the user. * - * Used by {@linkcode Moves.AFTER_YOU}. + * Used by {@linkcode MoveId.AFTER_YOU}. */ export class AfterYouAttr extends MoveEffectAttr { /** diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 0523671ee5f..221068d2f6e 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -725,7 +725,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { /** * Load all assets needed for this Pokemon's use in battle - * @param ignoreOverride - Whether to ignore overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `true` + * @param ignoreOverride - Whether to ignore overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `true` * @param useIllusion - Whether to consider this pokemon's active illusion; default `false` * @returns A promise that resolves once all the corresponding assets have been loaded. */ @@ -1032,7 +1032,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { /** * Return this Pokemon's {@linkcode PokemonSpeciesForm | SpeciesForm}. - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * and overrides `useIllusion`. * @param useIllusion - Whether to consider this Pokemon's illusion if present; default `false`. * @returns This Pokemon's {@linkcode PokemonSpeciesForm}. @@ -1088,7 +1088,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { /** * Return the {@linkcode PokemonSpeciesForm | SpeciesForm} of this Pokemon's fusion counterpart. - * @param ignoreOverride - Whether to ignore species overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore species overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @param useIllusion - Whether to consider the species of this Pokemon's illusion; default `false` * @returns The {@linkcode PokemonSpeciesForm} of this Pokemon's fusion counterpart. */ @@ -1659,7 +1659,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { /** * Return this Pokemon's {@linkcode Gender}. - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @param useIllusion - Whether to consider this pokemon's illusion if present; default `false` * @returns the {@linkcode Gender} of this {@linkcode Pokemon}. */ @@ -1675,7 +1675,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { /** * Return this Pokemon's fusion's {@linkcode Gender}. - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @param useIllusion - Whether to consider this pokemon's illusion if present; default `false` * @returns The {@linkcode Gender} of this {@linkcode Pokemon}'s fusion. */ @@ -1817,7 +1817,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { /** * Return all the {@linkcode PokemonMove}s that make up this Pokemon's moveset. * Takes into account player/enemy moveset overrides (which will also override PP count). - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @returns An array of {@linkcode PokemonMove}, as described above. */ getMoveset(ignoreOverride = false): PokemonMove[] { @@ -1883,7 +1883,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * Evaluate and return this Pokemon's typing. * @param includeTeraType - Whether to use this Pokemon's tera type if Terastallized; default `false` * @param forDefend - Whether this Pokemon is currently receiving an attack; default `false` - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @param useIllusion - Whether to consider this Pokemon's illusion if present; default `false` * @returns An array of {@linkcode PokemonType}s corresponding to this Pokemon's typing (real or percieved). */ @@ -2006,7 +2006,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @param type - The {@linkcode PokemonType} to check * @param includeTeraType - Whether to use this Pokemon's tera type if Terastallized; default `true` * @param forDefend - Whether this Pokemon is currently receiving an attack; default `false` - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @returns Whether this Pokemon is of the specified type. */ public isOfType(type: PokemonType, includeTeraType = true, forDefend = false, ignoreOverride = false): boolean { @@ -2019,7 +2019,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * Should rarely be called directly in favor of {@linkcode hasAbility} or {@linkcode hasAbilityWithAttr}, * both of which check both ability slots and account for suppression. * @see {@linkcode hasAbility} and {@linkcode hasAbilityWithAttr} are the intended ways to check abilities in most cases - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @returns The non-passive {@linkcode Ability} of this Pokemon. */ public getAbility(ignoreOverride = false): Ability { @@ -2201,7 +2201,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * Accounts for all the various effects which can disable or modify abilities. * @param ability - The {@linkcode Abilities | Ability} to check for * @param canApply - Whether to check if the ability is currently active; default `true` - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @returns Whether this {@linkcode Pokemon} has the given ability */ public hasAbility(ability: AbilityId, canApply = true, ignoreOverride = false): boolean { @@ -2216,7 +2216,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * Accounts for all the various effects which can disable or modify abilities. * @param attrType - The {@linkcode AbAttr | attribute} to check for * @param canApply - Whether to check if the ability is currently active; default `true` - * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode Moves.TRANSFORM | Transform}; default `false` + * @param ignoreOverride - Whether to ignore any overrides caused by {@linkcode MoveId.TRANSFORM | Transform}; default `false` * @returns Whether this Pokemon has an ability with the given {@linkcode AbAttr}. */ public hasAbilityWithAttr(attrType: AbAttrString, canApply = true, ignoreOverride = false): boolean { @@ -4466,7 +4466,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * Return the most recently executed {@linkcode TurnMove} this {@linkcode Pokemon} has used that is: * - Not {@linkcode MoveId.NONE} * - Non-virtual ({@linkcode MoveUseMode | useMode} < {@linkcode MoveUseMode.INDIRECT}) - * @param ignoreStruggle - Whether to additionally ignore {@linkcode Moves.STRUGGLE}; default `false` + * @param ignoreStruggle - Whether to additionally ignore {@linkcode MoveId.STRUGGLE}; default `false` * @param ignoreFollowUp - Whether to ignore moves with a use type of {@linkcode MoveUseMode.FOLLOW_UP} * (e.g. ones called by Copycat/Mirror Move); default `true`. * @returns The last move this Pokemon has used satisfying the aforementioned conditions, diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index cd7c7a8f48f..f88f9d0cad1 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -649,7 +649,6 @@ export class MovePhase extends BattlePhase { * Displays the move's usage text to the player as applicable for the move being used. */ public showMoveText(): void { - // No text for Moves.NONE, recharging/2-turn moves or interrupted moves if ( this.move.moveId === MoveId.NONE || this.pokemon.getTag(BattlerTagType.RECHARGING) || @@ -658,7 +657,6 @@ export class MovePhase extends BattlePhase { return; } - // Play message for magic coat reflection // TODO: This should be done by the move... globalScene.phaseManager.queueMessage( i18next.t(isReflected(this.useMode) ? "battle:magicCoatActivated" : "battle:useMove", { From 3b36ab17e45523532dccbda2d7615e2591a26361 Mon Sep 17 00:00:00 2001 From: Jimmybald1 <122436263+Jimmybald1@users.noreply.github.com> Date: Tue, 5 Aug 2025 07:35:14 +0200 Subject: [PATCH 076/106] [Bug] Protect now tracks success chance properly (#5869) * Protect rng now resets on new waves and fixed to look at all turns in the same wave. * Added per-wave move history object to fix issues @Jimmybald1 I added a commented out `console.log` in the protect code (L5797) for you to use for testing * Added many tests * Wave move history has to be looped in reverse * Update src/data/moves/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/data/moves/move.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * comments * Fixed forceEnemyMove references after merge * Removed console log Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> * Fixed test message Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Apply Biome * Fix merge issues * Fix Crafty Shield test * Remove protect chance reset on wave change * Fix merge issue --------- Co-authored-by: Jimmybald1 <147992650+IBBCalc@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Amani H. <109637146+xsn34kzx@users.noreply.github.com> Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/data/moves/move.ts | 21 ++-- src/data/pokemon/pokemon-data.ts | 1 - src/field/pokemon.ts | 1 + src/phases/battle-end-phase.ts | 6 - test/moves/baneful-bunker.test.ts | 52 ++++---- test/moves/crafty-shield.test.ts | 108 +++++++++++------ test/moves/endure.test.ts | 34 +++--- test/moves/protect.test.ts | 195 ++++++++++++++++++++++++------ test/moves/quick-guard.test.ts | 87 +++++++------ test/moves/wide-guard.test.ts | 94 ++++++++------ 10 files changed, 376 insertions(+), 223 deletions(-) diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 5f52f48bfca..0dfbc78d7ae 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -5912,20 +5912,21 @@ export class ProtectAttr extends AddBattlerTagAttr { getCondition(): MoveConditionFunc { return ((user, target, move): boolean => { let timesUsed = 0; - const moveHistory = user.getLastXMoves(); - let turnMove: TurnMove | undefined; - while (moveHistory.length) { - turnMove = moveHistory.shift(); - if (!allMoves[turnMove?.move ?? MoveId.NONE].hasAttr("ProtectAttr") || turnMove?.result !== MoveResult.SUCCESS) { + for (const turnMove of user.getLastXMoves(-1).slice()) { + if ( + // Quick & Wide guard increment the Protect counter without using it for fail chance + !(allMoves[turnMove.move].hasAttr("ProtectAttr") || + [MoveId.QUICK_GUARD, MoveId.WIDE_GUARD].includes(turnMove.move)) || + turnMove.result !== MoveResult.SUCCESS + ) { break; } - timesUsed++; + + timesUsed++ } - if (timesUsed) { - return !user.randBattleSeedInt(Math.pow(3, timesUsed)); - } - return true; + + return timesUsed === 0 || user.randBattleSeedInt(Math.pow(3, timesUsed)) === 0; }); } } diff --git a/src/data/pokemon/pokemon-data.ts b/src/data/pokemon/pokemon-data.ts index 9c264c4c1bc..0bd6af0bb04 100644 --- a/src/data/pokemon/pokemon-data.ts +++ b/src/data/pokemon/pokemon-data.ts @@ -253,7 +253,6 @@ export class PokemonTempSummonData { * Only currently used for positioning the battle cursor. */ turnCount = 1; - /** * The number of turns this pokemon has spent in the active position since the start of the wave * without switching out. diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 221068d2f6e..d4f332d887c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -5094,6 +5094,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { */ resetWaveData(): void { this.waveData = new PokemonWaveData(); + this.tempSummonData.waveTurnCount = 1; } resetTera(): void { diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts index 8d199915385..2dbb74c4a85 100644 --- a/src/phases/battle-end-phase.ts +++ b/src/phases/battle-end-phase.ts @@ -58,12 +58,6 @@ export class BattleEndPhase extends BattlePhase { globalScene.phaseManager.unshiftNew("GameOverPhase", true); } - for (const pokemon of globalScene.getField()) { - if (pokemon) { - pokemon.tempSummonData.waveTurnCount = 1; - } - } - for (const pokemon of globalScene.getPokemonAllowedInBattle()) { applyAbAttrs("PostBattleAbAttr", { pokemon, victory: this.isVictory }); } diff --git a/test/moves/baneful-bunker.test.ts b/test/moves/baneful-bunker.test.ts index 8c6661c03b6..07fb74ce6a8 100644 --- a/test/moves/baneful-bunker.test.ts +++ b/test/moves/baneful-bunker.test.ts @@ -5,7 +5,7 @@ import { SpeciesId } from "#enums/species-id"; import { StatusEffect } from "#enums/status-effect"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Baneful Bunker", () => { let phaserGame: Phaser.Game; @@ -26,55 +26,51 @@ describe("Moves - Baneful Bunker", () => { game.override .battleStyle("single") - .moveset(MoveId.SLASH) - .enemySpecies(SpeciesId.SNORLAX) + .moveset([MoveId.SLASH, MoveId.FLASH_CANNON]) + .enemySpecies(SpeciesId.TOXAPEX) .enemyAbility(AbilityId.INSOMNIA) .enemyMoveset(MoveId.BANEFUL_BUNKER) .startingLevel(100) .enemyLevel(100); }); - test("should protect the user and poison attackers that make contact", async () => { - await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.field.getPlayerPokemon(); - const enemyPokemon = game.field.getEnemyPokemon(); + function expectProtected() { + expect(game.scene.getEnemyPokemon()?.hp).toBe(game.scene.getEnemyPokemon()?.getMaxHp()); + expect(game.scene.getPlayerPokemon()?.status?.effect).toBe(StatusEffect.POISON); + } + + it("should protect the user and poison attackers that make contact", async () => { + await game.classicMode.startBattle([SpeciesId.CHARIZARD]); game.move.select(MoveId.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(); + + expectProtected(); }); - test("should protect the user and poison attackers that make contact, regardless of accuracy checks", async () => { + + it("should ignore accuracy checks", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.field.getPlayerPokemon(); - const enemyPokemon = game.field.getEnemyPokemon(); - game.move.select(MoveId.SLASH); - await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); - await game.phaseInterceptor.to("MoveEffectPhase"); - + await game.phaseInterceptor.to("MoveEndPhase"); // baneful bunker await game.move.forceMiss(); + await game.phaseInterceptor.to("BerryPhase", false); - expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(leadPokemon.status?.effect === StatusEffect.POISON).toBeTruthy(); + + expectProtected(); }); - test("should not poison attackers that don't make contact", async () => { - game.override.moveset(MoveId.FLASH_CANNON); + it("should block non-contact moves without poisoning attackers", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.field.getPlayerPokemon(); - const enemyPokemon = game.field.getEnemyPokemon(); + const charizard = game.field.getPlayerPokemon(); + const toxapex = game.field.getEnemyPokemon(); game.move.select(MoveId.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(); + + expect(toxapex.hp).toBe(toxapex.getMaxHp()); + expect(charizard.status?.effect).toBeUndefined(); }); }); diff --git a/test/moves/crafty-shield.test.ts b/test/moves/crafty-shield.test.ts index d0c148c1f41..0e067a07214 100644 --- a/test/moves/crafty-shield.test.ts +++ b/test/moves/crafty-shield.test.ts @@ -1,12 +1,14 @@ import { AbilityId } from "#enums/ability-id"; +import { ArenaTagSide } from "#enums/arena-tag-side"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerIndex } from "#enums/battler-index"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; import { Stat } from "#enums/stat"; -import { BerryPhase } from "#phases/berry-phase"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Crafty Shield", () => { let phaserGame: Phaser.Game; @@ -27,68 +29,100 @@ describe("Moves - Crafty Shield", () => { game.override .battleStyle("double") - .moveset([MoveId.CRAFTY_SHIELD, MoveId.SPLASH, MoveId.SWORDS_DANCE]) - .enemySpecies(SpeciesId.SNORLAX) - .enemyMoveset([MoveId.GROWL]) + .enemySpecies(SpeciesId.DUSKNOIR) + .enemyMoveset(MoveId.GROWL) .enemyAbility(AbilityId.INSOMNIA) .startingLevel(100) .enemyLevel(100); }); - test("should protect the user and allies from status moves", async () => { + it("should protect the user and allies from status moves", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const [charizard, blastoise] = game.scene.getPlayerField(); + game.move.use(MoveId.CRAFTY_SHIELD, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.GROWL); + await game.move.forceEnemyMove(MoveId.GROWL); - game.move.select(MoveId.CRAFTY_SHIELD); - game.move.select(MoveId.SPLASH, 1); + await game.phaseInterceptor.to("TurnEndPhase"); - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + expect(charizard.getStatStage(Stat.ATK)).toBe(0); + expect(blastoise.getStatStage(Stat.ATK)).toBe(0); }); - test("should not protect the user and allies from attack moves", async () => { - game.override.enemyMoveset([MoveId.TACKLE]); - + it("should not protect the user and allies from attack moves", async () => { + game.override.enemyMoveset(MoveId.TACKLE); await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const [charizard, blastoise] = game.scene.getPlayerField(); - game.move.select(MoveId.CRAFTY_SHIELD); - game.move.select(MoveId.SPLASH, 1); + game.move.use(MoveId.CRAFTY_SHIELD, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.TACKLE, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.TACKLE, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("TurnEndPhase"); - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); + expect(charizard.isFullHp()).toBe(false); + expect(blastoise.isFullHp()).toBe(false); }); - test("should protect the user and allies from moves that ignore other protection", async () => { - game.override.enemySpecies(SpeciesId.DUSCLOPS).enemyMoveset([MoveId.CURSE]); - + it("should not block entry hazards and field-targeted moves", async () => { + game.override.enemyMoveset([MoveId.PERISH_SONG, MoveId.TOXIC_SPIKES]); await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const [charizard, blastoise] = game.scene.getPlayerField(); - game.move.select(MoveId.CRAFTY_SHIELD); - game.move.select(MoveId.SPLASH, 1); + game.move.use(MoveId.CRAFTY_SHIELD, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.PERISH_SONG); + await game.move.forceEnemyMove(MoveId.TOXIC_SPIKES); + await game.phaseInterceptor.to("TurnEndPhase"); - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.getTag(BattlerTagType.CURSED)).toBeUndefined()); + expect(game.scene.arena.getTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.PLAYER)).toBeDefined(); + expect(charizard.getTag(BattlerTagType.PERISH_SONG)).toBeDefined(); + expect(blastoise.getTag(BattlerTagType.PERISH_SONG)).toBeDefined(); }); - test("should not block allies' self-targeted moves", async () => { + it("should protect the user and allies from moves that ignore other protection", async () => { + game.override.moveset(MoveId.CURSE); + await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const [charizard, blastoise] = game.scene.getPlayerField(); - game.move.select(MoveId.CRAFTY_SHIELD); - game.move.select(MoveId.SWORDS_DANCE, 1); + game.move.use(MoveId.CRAFTY_SHIELD, BattlerIndex.PLAYER); + game.move.use(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.CURSE, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.CURSE, BattlerIndex.PLAYER_2); - await game.phaseInterceptor.to(BerryPhase, false); + await game.toEndOfTurn(); - expect(leadPokemon[0].getStatStage(Stat.ATK)).toBe(0); - expect(leadPokemon[1].getStatStage(Stat.ATK)).toBe(2); + expect(charizard.getTag(BattlerTagType.CURSED)).toBeUndefined(); + expect(blastoise.getTag(BattlerTagType.CURSED)).toBeUndefined(); + + const [dusknoir1, dusknoir2] = game.scene.getEnemyField(); + expect(dusknoir1).toHaveFullHp(); + expect(dusknoir2).toHaveFullHp(); + }); + + it("should not block allies' self or ally-targeted moves", async () => { + await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); + + const [charizard, blastoise] = game.scene.getPlayerField(); + + game.move.use(MoveId.CRAFTY_SHIELD, BattlerIndex.PLAYER); + game.move.use(MoveId.SWORDS_DANCE, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(charizard.getStatStage(Stat.ATK)).toBe(0); + expect(blastoise.getStatStage(Stat.ATK)).toBe(2); + + game.move.use(MoveId.HOWL, BattlerIndex.PLAYER); + game.move.use(MoveId.CRAFTY_SHIELD, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(charizard.getStatStage(Stat.ATK)).toBe(1); + expect(blastoise.getStatStage(Stat.ATK)).toBe(3); }); }); diff --git a/test/moves/endure.test.ts b/test/moves/endure.test.ts index e591c82466c..1bac3c5d6ff 100644 --- a/test/moves/endure.test.ts +++ b/test/moves/endure.test.ts @@ -1,9 +1,10 @@ import { AbilityId } from "#enums/ability-id"; +import { HitResult } from "#enums/hit-result"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Endure", () => { let phaserGame: Phaser.Game; @@ -22,7 +23,7 @@ describe("Moves - Endure", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([MoveId.THUNDER, MoveId.BULLET_SEED, MoveId.TOXIC, MoveId.SHEER_COLD]) + .moveset([MoveId.THUNDER, MoveId.BULLET_SEED, MoveId.SHEER_COLD]) .ability(AbilityId.SKILL_LINK) .startingLevel(100) .battleStyle("single") @@ -32,7 +33,7 @@ describe("Moves - Endure", () => { .enemyMoveset(MoveId.ENDURE); }); - it("should let the pokemon survive with 1 HP", async () => { + it("should let the pokemon survive with 1 HP from attacks", async () => { await game.classicMode.startBattle([SpeciesId.ARCEUS]); game.move.select(MoveId.THUNDER); @@ -41,7 +42,7 @@ describe("Moves - Endure", () => { expect(game.field.getEnemyPokemon().hp).toBe(1); }); - it("should let the pokemon survive with 1 HP when hit with a multihit move", async () => { + it("should let the pokemon survive with 1 HP from multi-strike moves", async () => { await game.classicMode.startBattle([SpeciesId.ARCEUS]); game.move.select(MoveId.BULLET_SEED); @@ -57,30 +58,27 @@ describe("Moves - Endure", () => { game.move.select(MoveId.SHEER_COLD); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemy.isFainted()).toBeFalsy(); + expect(enemy.hp).toBe(1); }); // comprehensive indirect damage test copied from Reviver Seed test it.each([ - { moveType: "Damaging Move Chip Damage", move: MoveId.SALT_CURE }, - { moveType: "Chip Damage", move: MoveId.LEECH_SEED }, - { moveType: "Trapping Chip Damage", move: MoveId.WHIRLPOOL }, - { moveType: "Status Effect Damage", move: MoveId.TOXIC }, + { moveType: "Damaging Move Chip", move: MoveId.SALT_CURE }, + { moveType: "Status Move Chip", move: MoveId.LEECH_SEED }, + { moveType: "Partial Trapping move", move: MoveId.WHIRLPOOL }, + { moveType: "Status Effect", move: MoveId.TOXIC }, { moveType: "Weather", move: MoveId.SANDSTORM }, - ])("should not prevent fainting from $moveType", async ({ move }) => { - game.override - .enemyLevel(1) - .startingLevel(100) - .enemySpecies(SpeciesId.MAGIKARP) - .moveset(move) - .enemyMoveset(MoveId.ENDURE); + ])("should not prevent fainting from $moveType Damage", async ({ move }) => { + game.override.moveset(move).enemyLevel(100); await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.FEEBAS]); const enemy = game.field.getEnemyPokemon(); - enemy.damageAndUpdate(enemy.hp - 1); + enemy.hp = 2; + // force attack to do 1 dmg (for salt cure) + vi.spyOn(enemy, "getAttackDamage").mockReturnValue({ cancelled: false, result: HitResult.EFFECTIVE, damage: 1 }); game.move.select(move); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemy.isFainted()).toBeTruthy(); + expect(enemy.isFainted()).toBe(true); }); }); diff --git a/test/moves/protect.test.ts b/test/moves/protect.test.ts index a101fa8e2c8..9a4856d0d99 100644 --- a/test/moves/protect.test.ts +++ b/test/moves/protect.test.ts @@ -1,15 +1,14 @@ -import { ArenaTrapTag } from "#data/arena-tag"; import { allMoves } from "#data/data-lists"; import { AbilityId } from "#enums/ability-id"; -import { ArenaTagSide } from "#enums/arena-tag-side"; import { BattlerIndex } from "#enums/battler-index"; import { MoveId } from "#enums/move-id"; import { MoveResult } from "#enums/move-result"; +import { MoveUseMode } from "#enums/move-use-mode"; import { SpeciesId } from "#enums/species-id"; import { Stat } from "#enums/stat"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Protect", () => { let phaserGame: Phaser.Game; @@ -27,90 +26,210 @@ describe("Moves - Protect", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override .battleStyle("single") - .moveset([MoveId.PROTECT]) + .moveset([MoveId.PROTECT, MoveId.SPIKY_SHIELD, MoveId.ENDURE, MoveId.SPLASH]) .enemySpecies(SpeciesId.SNORLAX) .enemyAbility(AbilityId.INSOMNIA) - .enemyMoveset([MoveId.TACKLE]) + .enemyMoveset(MoveId.LUMINA_CRASH) .startingLevel(100) .enemyLevel(100); }); - test("should protect the user from attacks", async () => { + it("should protect the user from attacks and their secondary effects", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.field.getPlayerPokemon(); + const charizard = game.field.getPlayerPokemon(); game.move.select(MoveId.PROTECT); - await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(charizard.hp).toBe(charizard.getMaxHp()); + expect(charizard.getStatStage(Stat.SPDEF)).toBe(0); + expect(charizard); }); - test("should prevent secondary effects from the opponent's attack", async () => { - game.override.enemyMoveset([MoveId.CEASELESS_EDGE]); - vi.spyOn(allMoves[MoveId.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); - + it.each<{ numTurns: number; chance: number }>([ + { numTurns: 1, chance: 3 }, + { numTurns: 2, chance: 9 }, + { numTurns: 3, chance: 27 }, + { numTurns: 4, chance: 81 }, + ])("should have a 1/$chance success rate after $numTurns successful uses", async ({ numTurns, chance }) => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.field.getPlayerPokemon(); + const charizard = game.scene.getPlayerPokemon()!; + + // mock RNG roll to suceed unless exactly the desired chance is hit + vi.spyOn(charizard, "randBattleSeedInt").mockImplementation(range => (range !== chance ? 0 : 1)); + const conditionSpy = vi.spyOn(allMoves[MoveId.PROTECT]["conditions"][0], "apply"); + + // click protect many times + for (let x = 0; x < numTurns; x++) { + game.move.select(MoveId.PROTECT); + await game.toNextTurn(); + + expect(charizard.hp).toBe(charizard.getMaxHp()); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + expect(conditionSpy).toHaveLastReturnedWith(true); + } game.move.select(MoveId.PROTECT); + await game.toNextTurn(); - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); - expect(game.scene.arena.getTagOnSide(ArenaTrapTag, ArenaTagSide.ENEMY)).toBeUndefined(); + expect(charizard.hp).toBeLessThan(charizard.getMaxHp()); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(conditionSpy).toHaveLastReturnedWith(false); }); - test("should protect the user from status moves", async () => { - game.override.enemyMoveset([MoveId.CHARM]); - + it("should share fail chance with all move variants", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.field.getPlayerPokemon(); + const charizard = game.field.getPlayerPokemon(); + charizard.summonData.moveHistory = [ + { move: MoveId.ENDURE, result: MoveResult.SUCCESS, targets: [BattlerIndex.PLAYER], useMode: MoveUseMode.NORMAL }, + { + move: MoveId.SPIKY_SHIELD, + result: MoveResult.SUCCESS, + targets: [BattlerIndex.PLAYER], + useMode: MoveUseMode.NORMAL, + }, + ]; + // force protect to fail on anything >=2 uses (1/9 chance) + vi.spyOn(charizard, "randBattleSeedInt").mockImplementation(range => (range >= 9 ? 1 : 0)); game.move.select(MoveId.PROTECT); + await game.toNextTurn(); - await game.phaseInterceptor.to("BerryPhase", false); - - expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); - test("should stop subsequent hits of a multi-hit move", async () => { + it("should reset fail chance on move failure", async () => { + await game.classicMode.startBattle([SpeciesId.CHARIZARD]); + + const charizard = game.scene.getPlayerPokemon()!; + // force protect to always fail if RNG roll attempt is made + vi.spyOn(charizard, "randBattleSeedInt").mockReturnValue(1); + + game.move.select(MoveId.PROTECT); + await game.toNextTurn(); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + + game.move.select(MoveId.SPIKY_SHIELD); + await game.toNextTurn(); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + + game.move.select(MoveId.SPIKY_SHIELD); + await game.toNextTurn(); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + }); + + it("should reset fail chance on using another move", async () => { + await game.classicMode.startBattle([SpeciesId.CHARIZARD]); + + const charizard = game.scene.getPlayerPokemon()!; + // force protect to always fail if RNG roll attempt is made + vi.spyOn(charizard, "randBattleSeedInt").mockReturnValue(1); + + game.move.select(MoveId.PROTECT); + await game.toNextTurn(); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + + game.move.select(MoveId.SPLASH); + await game.toNextTurn(); + + game.move.select(MoveId.PROTECT); + await game.toNextTurn(); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + }); + + it("should reset fail chance on starting a new wave", async () => { + await game.classicMode.startBattle([SpeciesId.CHARIZARD]); + + const charizard = game.field.getPlayerPokemon(); + // force protect to always fail if RNG roll attempt is made + vi.spyOn(charizard, "randBattleSeedInt").mockReturnValue(1); + + game.move.select(MoveId.PROTECT); + // Wait until move end phase to kill opponent to ensure protect doesn't fail due to going last + await game.phaseInterceptor.to("MoveEndPhase"); + await game.doKillOpponents(); + await game.toNextWave(); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + + game.move.select(MoveId.SPIKY_SHIELD); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + }); + + it("should not be blocked by Psychic Terrain", async () => { + game.override.ability(AbilityId.PSYCHIC_SURGE); + await game.classicMode.startBattle([SpeciesId.CHARIZARD]); + + const charizard = game.scene.getPlayerPokemon()!; + game.move.select(MoveId.PROTECT); + await game.toNextTurn(); + + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + }); + + it("should stop subsequent hits of multi-hit moves", async () => { game.override.enemyMoveset([MoveId.TACHYON_CUTTER]); - await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.field.getPlayerPokemon(); + const charizard = game.field.getPlayerPokemon(); const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.PROTECT); - await game.phaseInterceptor.to("BerryPhase", false); - expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp()); + expect(charizard.hp).toBe(charizard.getMaxHp()); expect(enemyPokemon.turnData.hitCount).toBe(1); }); - test("should fail if the user is the last to move in the turn", async () => { - game.override.enemyMoveset([MoveId.PROTECT]); - + it("should fail if the user moves last in the turn", async () => { + game.override.enemyMoveset(MoveId.PROTECT); await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const leadPokemon = game.field.getPlayerPokemon(); + const charizard = game.field.getPlayerPokemon(); const enemyPokemon = game.field.getEnemyPokemon(); game.move.select(MoveId.PROTECT); - await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); - await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(leadPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); + + it("should not block Protection-bypassing moves or Future Sight", async () => { + game.override.enemyMoveset([MoveId.FUTURE_SIGHT, MoveId.MIGHTY_CLEAVE, MoveId.SPORE]); + await game.classicMode.startBattle([SpeciesId.AGGRON]); + + const aggron = game.scene.getPlayerPokemon()!; + vi.spyOn(aggron, "randBattleSeedInt").mockReturnValue(0); + + // Turn 1: setup future sight + game.move.select(MoveId.PROTECT); + await game.move.forceEnemyMove(MoveId.FUTURE_SIGHT); + await game.toNextTurn(); + + // Turn 2: mighty cleave + game.move.select(MoveId.PROTECT); + await game.move.forceEnemyMove(MoveId.MIGHTY_CLEAVE); + await game.toNextTurn(); + + expect(aggron.hp).toBeLessThan(aggron.getMaxHp()); + + aggron.hp = aggron.getMaxHp(); + + // turn 3: Future Sight hits + game.move.select(MoveId.PROTECT); + await game.move.forceEnemyMove(MoveId.SPORE); + await game.toNextTurn(); + + expect(aggron.hp).toBeLessThan(aggron.getMaxHp()); + expect(aggron.status?.effect).toBeUndefined(); // check that protect actually worked + }); + + // TODO: Add test + it.todo("should not reset counter when throwing balls"); }); diff --git a/test/moves/quick-guard.test.ts b/test/moves/quick-guard.test.ts index 1805048edb5..173d45b412f 100644 --- a/test/moves/quick-guard.test.ts +++ b/test/moves/quick-guard.test.ts @@ -3,10 +3,9 @@ import { BattlerIndex } from "#enums/battler-index"; import { MoveId } from "#enums/move-id"; import { MoveResult } from "#enums/move-result"; import { SpeciesId } from "#enums/species-id"; -import { Stat } from "#enums/stat"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Quick Guard", () => { let phaserGame: Phaser.Game; @@ -27,74 +26,72 @@ describe("Moves - Quick Guard", () => { game.override .battleStyle("double") - .moveset([MoveId.QUICK_GUARD, MoveId.SPLASH, MoveId.FOLLOW_ME]) + .moveset([MoveId.QUICK_GUARD, MoveId.SPLASH, MoveId.SPIKY_SHIELD]) .enemySpecies(SpeciesId.SNORLAX) - .enemyMoveset([MoveId.QUICK_ATTACK]) - .enemyAbility(AbilityId.INSOMNIA) + .enemyMoveset(MoveId.QUICK_ATTACK) + .enemyAbility(AbilityId.BALL_FETCH) .startingLevel(100) .enemyLevel(100); }); - test("should protect the user and allies from priority moves", async () => { + it("should protect the user and allies from priority moves", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerField(); - - game.move.select(MoveId.QUICK_GUARD); - game.move.select(MoveId.SPLASH, 1); + const [charizard, blastoise] = game.scene.getPlayerField(); + game.move.select(MoveId.QUICK_GUARD, BattlerIndex.PLAYER); + game.move.select(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.QUICK_ATTACK, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.QUICK_ATTACK, BattlerIndex.PLAYER_2); await game.phaseInterceptor.to("BerryPhase", false); - playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + expect(charizard.hp).toBe(charizard.getMaxHp()); + expect(blastoise.hp).toBe(blastoise.getMaxHp()); }); - test("should protect the user and allies from Prankster-boosted moves", async () => { - game.override.enemyAbility(AbilityId.PRANKSTER).enemyMoveset([MoveId.GROWL]); - + it.each<{ name: string; move: MoveId; ability: AbilityId }>([ + { name: "Prankster", move: MoveId.SPORE, ability: AbilityId.PRANKSTER }, + { name: "Gale Wings", move: MoveId.BRAVE_BIRD, ability: AbilityId.GALE_WINGS }, + ])("should protect the user and allies from $name-boosted moves", async ({ move, ability }) => { + game.override.enemyMoveset(move).enemyAbility(ability); await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const playerPokemon = game.scene.getPlayerField(); - - game.move.select(MoveId.QUICK_GUARD); - game.move.select(MoveId.SPLASH, 1); + const [charizard, blastoise] = game.scene.getPlayerField(); + game.move.select(MoveId.QUICK_GUARD, BattlerIndex.PLAYER); + game.move.select(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(move, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(move, BattlerIndex.PLAYER_2); await game.phaseInterceptor.to("BerryPhase", false); - playerPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + expect(charizard.hp).toBe(charizard.getMaxHp()); + expect(blastoise.hp).toBe(blastoise.getMaxHp()); + expect(charizard.status?.effect).toBeUndefined(); + expect(blastoise.status?.effect).toBeUndefined(); }); - test("should stop subsequent hits of a multi-hit priority move", async () => { - game.override.enemyMoveset([MoveId.WATER_SHURIKEN]); - - await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - - const playerPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); - - game.move.select(MoveId.QUICK_GUARD); - game.move.select(MoveId.FOLLOW_ME, 1); - - await game.phaseInterceptor.to("BerryPhase", false); - - playerPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); - enemyPokemon.forEach(p => expect(p.turnData.hitCount).toBe(1)); - }); - - test("should fail if the user is the last to move in the turn", async () => { - game.override.battleStyle("single").enemyMoveset([MoveId.QUICK_GUARD]); - + it("should increment (but not respect) other protection moves' fail counters", async () => { + game.override.battleStyle("single"); await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - const playerPokemon = game.field.getPlayerPokemon(); - const enemyPokemon = game.field.getEnemyPokemon(); + const charizard = game.scene.getPlayerPokemon()!; + // force protect to fail on anything >0 uses + vi.spyOn(charizard, "randBattleSeedInt").mockReturnValue(1); game.move.select(MoveId.QUICK_GUARD); + await game.toNextTurn(); - await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - await game.phaseInterceptor.to("BerryPhase", false); + game.move.select(MoveId.QUICK_GUARD); + await game.toNextTurn(); - expect(enemyPokemon.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(playerPokemon.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + // ignored fail chance + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + + game.move.select(MoveId.SPIKY_SHIELD); + await game.toNextTurn(); + + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); }); diff --git a/test/moves/wide-guard.test.ts b/test/moves/wide-guard.test.ts index e599829e1b9..b45b7327265 100644 --- a/test/moves/wide-guard.test.ts +++ b/test/moves/wide-guard.test.ts @@ -1,11 +1,12 @@ import { AbilityId } from "#enums/ability-id"; +import { BattlerIndex } from "#enums/battler-index"; import { MoveId } from "#enums/move-id"; +import { MoveResult } from "#enums/move-result"; import { SpeciesId } from "#enums/species-id"; import { Stat } from "#enums/stat"; -import { BerryPhase } from "#phases/berry-phase"; import { GameManager } from "#test/test-utils/game-manager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Moves - Wide Guard", () => { let phaserGame: Phaser.Game; @@ -26,71 +27,84 @@ describe("Moves - Wide Guard", () => { game.override .battleStyle("double") - .moveset([MoveId.WIDE_GUARD, MoveId.SPLASH, MoveId.SURF]) + .moveset([MoveId.WIDE_GUARD, MoveId.SPLASH, MoveId.SURF, MoveId.SPIKY_SHIELD]) .enemySpecies(SpeciesId.SNORLAX) - .enemyMoveset(MoveId.SWIFT) + .enemyMoveset([MoveId.SWIFT, MoveId.GROWL, MoveId.TACKLE]) .enemyAbility(AbilityId.INSOMNIA) .startingLevel(100) .enemyLevel(100); }); - test("should protect the user and allies from multi-target attack moves", async () => { + it("should protect the user and allies from multi-target attack and status moves", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); + const [charizard, blastoise] = game.scene.getPlayerField(); - const leadPokemon = game.scene.getPlayerField(); + game.move.select(MoveId.WIDE_GUARD, BattlerIndex.PLAYER); + game.move.select(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.SWIFT); + await game.move.forceEnemyMove(MoveId.GROWL); + await game.phaseInterceptor.to("TurnEndPhase"); - game.move.select(MoveId.WIDE_GUARD); - game.move.select(MoveId.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.hp).toBe(p.getMaxHp())); + expect(charizard.hp).toBe(charizard.getMaxHp()); + expect(blastoise.hp).toBe(blastoise.getMaxHp()); + expect(charizard.getStatStage(Stat.ATK)).toBe(0); + expect(blastoise.getStatStage(Stat.ATK)).toBe(0); }); - test("should protect the user and allies from multi-target status moves", async () => { - game.override.enemyMoveset([MoveId.GROWL]); - + it("should not protect the user and allies from single-target moves", async () => { await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const [charizard, blastoise] = game.scene.getPlayerField(); + game.move.select(MoveId.WIDE_GUARD, BattlerIndex.PLAYER); + game.move.select(MoveId.SPLASH, BattlerIndex.PLAYER_2); + await game.move.forceEnemyMove(MoveId.TACKLE, BattlerIndex.PLAYER); + await game.move.forceEnemyMove(MoveId.TACKLE, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("TurnEndPhase"); - game.move.select(MoveId.WIDE_GUARD); - game.move.select(MoveId.SPLASH, 1); - - await game.phaseInterceptor.to(BerryPhase, false); - - leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + expect(charizard.hp).toBeLessThan(charizard.getMaxHp()); + expect(blastoise.hp).toBeLessThan(blastoise.getMaxHp()); }); - test("should not protect the user and allies from single-target moves", async () => { - game.override.enemyMoveset([MoveId.TACKLE]); + it("should protect the user from its ally's multi-target move", async () => { + game.override.enemyMoveset(MoveId.SPLASH); await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - const leadPokemon = game.scene.getPlayerField(); + const charizard = game.scene.getPlayerPokemon()!; + const [snorlax1, snorlax2] = game.scene.getEnemyField(); - game.move.select(MoveId.WIDE_GUARD); - game.move.select(MoveId.SPLASH, 1); + game.move.select(MoveId.WIDE_GUARD, BattlerIndex.PLAYER); + game.move.select(MoveId.SURF, BattlerIndex.PLAYER_2); + await game.phaseInterceptor.to("TurnEndPhase"); - await game.phaseInterceptor.to(BerryPhase, false); - - expect(leadPokemon.some(p => p.hp < p.getMaxHp())).toBeTruthy(); + expect(charizard.hp).toBe(charizard.getMaxHp()); + expect(snorlax1.hp).toBeLessThan(snorlax1.getMaxHp()); + expect(snorlax2.hp).toBeLessThan(snorlax2.getMaxHp()); }); - test("should protect the user from its ally's multi-target move", async () => { - game.override.enemyMoveset([MoveId.SPLASH]); + it("should increment (but not respect) other protection moves' fail counters", async () => { + game.override.battleStyle("single"); + await game.classicMode.startBattle([SpeciesId.CHARIZARD]); - await game.classicMode.startBattle([SpeciesId.CHARIZARD, SpeciesId.BLASTOISE]); - - const leadPokemon = game.scene.getPlayerField(); - const enemyPokemon = game.scene.getEnemyField(); + const charizard = game.scene.getPlayerPokemon()!; + // force protect to fail on anything other than a guaranteed success + vi.spyOn(charizard, "randBattleSeedInt").mockReturnValue(1); game.move.select(MoveId.WIDE_GUARD); - game.move.select(MoveId.SURF, 1); + await game.toNextTurn(); - await game.phaseInterceptor.to(BerryPhase, false); + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); - expect(leadPokemon[0].hp).toBe(leadPokemon[0].getMaxHp()); - enemyPokemon.forEach(p => expect(p.hp).toBeLessThan(p.getMaxHp())); + // ignored fail chance + game.move.select(MoveId.WIDE_GUARD); + await game.toNextTurn(); + + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.SUCCESS); + + game.move.select(MoveId.SPIKY_SHIELD); + await game.toNextTurn(); + + // ignored fail chance + expect(charizard.getLastXMoves()[0].result).toBe(MoveResult.FAIL); }); }); From 1633df75c4c030c9ff3088429b7c435a2e44ded9 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Tue, 5 Aug 2025 16:35:58 -0600 Subject: [PATCH 077/106] [UI/UX] Add change password ui (#5938) * Add change password ui * Ensure input fields are cleared after submit or cancel * Play select sound on successful submission or cancel --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> --- src/@types/api/pokerogue-account-api.ts | 7 ++ src/enums/ui-mode.ts | 3 +- src/plugins/api/pokerogue-account-api.ts | 16 +++ src/ui/change-password-form-ui-handler.ts | 124 ++++++++++++++++++++++ src/ui/form-modal-ui-handler.ts | 28 +++-- src/ui/menu-ui-handler.ts | 11 ++ src/ui/modal-ui-handler.ts | 2 +- src/ui/ui.ts | 3 + 8 files changed, 186 insertions(+), 8 deletions(-) create mode 100644 src/ui/change-password-form-ui-handler.ts diff --git a/src/@types/api/pokerogue-account-api.ts b/src/@types/api/pokerogue-account-api.ts index 7bcdc766664..779592483fb 100644 --- a/src/@types/api/pokerogue-account-api.ts +++ b/src/@types/api/pokerogue-account-api.ts @@ -15,3 +15,10 @@ export interface AccountRegisterRequest { username: string; password: string; } + +export interface AccountChangePwRequest { + password: string; +} +export interface AccountChangePwResponse { + success: boolean; +} diff --git a/src/enums/ui-mode.ts b/src/enums/ui-mode.ts index dcf6bd2a238..bc93e747be2 100644 --- a/src/enums/ui-mode.ts +++ b/src/enums/ui-mode.ts @@ -43,5 +43,6 @@ export enum UiMode { TEST_DIALOGUE, AUTO_COMPLETE, ADMIN, - MYSTERY_ENCOUNTER + MYSTERY_ENCOUNTER, + CHANGE_PASSWORD_FORM, } diff --git a/src/plugins/api/pokerogue-account-api.ts b/src/plugins/api/pokerogue-account-api.ts index 03f522e8dac..22f86413618 100644 --- a/src/plugins/api/pokerogue-account-api.ts +++ b/src/plugins/api/pokerogue-account-api.ts @@ -1,6 +1,7 @@ import { ApiBase } from "#api/api-base"; import { SESSION_ID_COOKIE_NAME } from "#app/constants"; import type { + AccountChangePwRequest, AccountInfoResponse, AccountLoginRequest, AccountLoginResponse, @@ -95,4 +96,19 @@ export class PokerogueAccountApi extends ApiBase { removeCookie(SESSION_ID_COOKIE_NAME); // we are always clearing the cookie. } + + public async changePassword(changePwData: AccountChangePwRequest) { + try { + const response = await this.doPost("/account/changepw", changePwData, "form-urlencoded"); + if (response.ok) { + return null; + } + console.warn("Change password failed!", response.status, response.statusText); + return response.text(); + } catch (err) { + console.warn("Change password failed!", err); + } + + return "Unknown error!"; + } } diff --git a/src/ui/change-password-form-ui-handler.ts b/src/ui/change-password-form-ui-handler.ts new file mode 100644 index 00000000000..eccc67ffb04 --- /dev/null +++ b/src/ui/change-password-form-ui-handler.ts @@ -0,0 +1,124 @@ +import { globalScene } from "#app/global-scene"; +import { pokerogueApi } from "#app/plugins/api/pokerogue-api"; +import { UiMode } from "#enums/ui-mode"; +import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; +import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; +import type { ModalConfig } from "#ui/modal-ui-handler"; +import i18next from "i18next"; + +export class ChangePasswordFormUiHandler extends FormModalUiHandler { + private readonly ERR_PASSWORD: string = "invalid password"; + private readonly ERR_ACCOUNT_EXIST: string = "account doesn't exist"; + private readonly ERR_PASSWORD_MISMATCH: string = "password doesn't match"; + + constructor(mode: UiMode | null = null) { + super(mode); + } + + setup(): void { + super.setup(); + } + + override getModalTitle(_config?: ModalConfig): string { + return i18next.t("menu:changePassword"); + } + + override getWidth(_config?: ModalConfig): number { + return 160; + } + + override getMargin(_config?: ModalConfig): [number, number, number, number] { + return [0, 0, 48, 0]; + } + + override getButtonLabels(_config?: ModalConfig): string[] { + return [i18next.t("settings:buttonSubmit"), i18next.t("menu:cancel")]; + } + + override getReadableErrorMessage(error: string): string { + const colonIndex = error?.indexOf(":"); + if (colonIndex > 0) { + error = error.slice(0, colonIndex); + } + switch (error) { + case this.ERR_PASSWORD: + return i18next.t("menu:invalidRegisterPassword"); + case this.ERR_ACCOUNT_EXIST: + return i18next.t("menu:accountNonExistent"); + case this.ERR_PASSWORD_MISMATCH: + return i18next.t("menu:passwordNotMatchingConfirmPassword"); + } + + return super.getReadableErrorMessage(error); + } + + override getInputFieldConfigs(): InputFieldConfig[] { + const inputFieldConfigs: InputFieldConfig[] = []; + inputFieldConfigs.push({ + label: i18next.t("menu:password"), + isPassword: true, + }); + inputFieldConfigs.push({ + label: i18next.t("menu:confirmPassword"), + isPassword: true, + }); + return inputFieldConfigs; + } + + override show(args: [ModalConfig, ...any]): boolean { + if (super.show(args)) { + const config = args[0]; + const originalSubmitAction = this.submitAction; + this.submitAction = () => { + if (globalScene.tweens.getTweensOf(this.modalContainer).length === 0) { + // Prevent overlapping overrides on action modification + this.submitAction = originalSubmitAction; + this.sanitizeInputs(); + globalScene.ui.setMode(UiMode.LOADING, { buttonActions: [] }); + const onFail = (error: string | null) => { + globalScene.ui.setMode(UiMode.CHANGE_PASSWORD_FORM, Object.assign(config, { errorMessage: error?.trim() })); + globalScene.ui.playError(); + }; + const [passwordInput, confirmPasswordInput] = this.inputs; + if (!passwordInput?.text) { + return onFail(this.getReadableErrorMessage("invalid password")); + } + if (passwordInput.text !== confirmPasswordInput.text) { + return onFail(this.ERR_PASSWORD_MISMATCH); + } + + pokerogueApi.account.changePassword({ password: passwordInput.text }).then(error => { + if (!error && originalSubmitAction) { + globalScene.ui.playSelect(); + originalSubmitAction(); + // Only clear inputs if the action was successful + for (const input of this.inputs) { + input.setText(""); + } + } else { + onFail(error); + } + }); + } + }; + // Upon pressing cancel, the inputs should be cleared + const originalCancelAction = this.cancelAction; + this.cancelAction = () => { + globalScene.ui.playSelect(); + for (const input of this.inputs) { + input.setText(""); + } + originalCancelAction?.(); + }; + + return true; + } + + return false; + } + + override clear() { + super.clear(); + this.setMouseCursorStyle("default"); //reset cursor + } +} diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 203d98a86c7..5c547465de9 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -19,6 +19,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { protected inputs: InputText[]; protected errorMessage: Phaser.GameObjects.Text; protected submitAction: Function | null; + protected cancelAction: (() => void) | null; protected tween: Phaser.Tweens.Tween; protected formLabels: Phaser.GameObjects.Text[]; @@ -126,22 +127,37 @@ export abstract class FormModalUiHandler extends ModalUiHandler { }); } - show(args: any[]): boolean { + override show(args: any[]): boolean { if (super.show(args)) { this.inputContainers.map(ic => ic.setVisible(true)); const config = args[0] as FormModalConfig; this.submitAction = config.buttonActions.length ? config.buttonActions[0] : null; + this.cancelAction = config.buttonActions[1] ?? null; - if (this.buttonBgs.length) { - this.buttonBgs[0].off("pointerdown"); - this.buttonBgs[0].on("pointerdown", () => { - if (this.submitAction && globalScene.tweens.getTweensOf(this.modalContainer).length === 0) { - this.submitAction(); + // #region: Override button pointerDown + // Override the pointerDown event for the buttonBgs to call the `submitAction` and `cancelAction` + // properties that we set above, allowing their behavior to change after this method terminates + // Some subclasses use this to add behavior to the submit and cancel action + + this.buttonBgs[0].off("pointerdown"); + this.buttonBgs[0].on("pointerdown", () => { + if (this.submitAction && globalScene.tweens.getTweensOf(this.modalContainer).length === 0) { + this.submitAction(); + } + }); + const cancelBg = this.buttonBgs[1]; + if (cancelBg) { + cancelBg.off("pointerdown"); + cancelBg.on("pointerdown", () => { + // The seemingly redundant cancelAction check is intentionally left in as a defensive programming measure + if (this.cancelAction && globalScene.tweens.getTweensOf(this.modalContainer).length === 0) { + this.cancelAction(); } }); } + //#endregion: Override pointerDown events this.modalContainer.y += 24; this.modalContainer.setAlpha(0); diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index fa65cccab2f..30bf9eeff75 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -311,6 +311,17 @@ export class MenuUiHandler extends MessageUiHandler { }, keepOpen: true, }, + { + // Note: i18n key is under `menu`, not `menuUiHandler` to avoid duplication + label: i18next.t("menu:changePassword"), + handler: () => { + ui.setOverlayMode(UiMode.CHANGE_PASSWORD_FORM, { + buttonActions: [() => ui.revertMode(), () => ui.revertMode()], + }); + return true; + }, + keepOpen: true, + }, { label: i18next.t("menuUiHandler:consentPreferences"), handler: () => { diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 228d80968b9..4d1456eec51 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -7,7 +7,7 @@ import { UiHandler } from "#ui/ui-handler"; import { addWindow, WindowVariant } from "#ui/ui-theme"; export interface ModalConfig { - buttonActions: Function[]; + buttonActions: ((...args: any[]) => any)[]; } export abstract class ModalUiHandler extends UiHandler { diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 4c8f0613122..847294dcfc6 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -13,6 +13,7 @@ import { BallUiHandler } from "#ui/ball-ui-handler"; import { BattleMessageUiHandler } from "#ui/battle-message-ui-handler"; import type { BgmBar } from "#ui/bgm-bar"; import { GameChallengesUiHandler } from "#ui/challenges-select-ui-handler"; +import { ChangePasswordFormUiHandler } from "#ui/change-password-form-ui-handler"; import { CommandUiHandler } from "#ui/command-ui-handler"; import { ConfirmUiHandler } from "#ui/confirm-ui-handler"; import { EggGachaUiHandler } from "#ui/egg-gacha-ui-handler"; @@ -102,6 +103,7 @@ const noTransitionModes = [ UiMode.ADMIN, UiMode.MYSTERY_ENCOUNTER, UiMode.RUN_INFO, + UiMode.CHANGE_PASSWORD_FORM, ]; export class UI extends Phaser.GameObjects.Container { @@ -172,6 +174,7 @@ export class UI extends Phaser.GameObjects.Container { new AutoCompleteUiHandler(), new AdminUiHandler(), new MysteryEncounterUiHandler(), + new ChangePasswordFormUiHandler(), ]; } From bb86bdd2a675430c3f1aa0442b07e64d48d5115e Mon Sep 17 00:00:00 2001 From: damocleas Date: Tue, 5 Aug 2025 22:57:51 -0400 Subject: [PATCH 078/106] [Balance] Add Scientist to Lab, Swimmer to Seabed to account for ME's https://github.com/pagefaultgames/pokerogue/pull/6217 --- src/data/balance/biomes.ts | 180 ++++++++----------------------------- src/field/arena.ts | 2 +- 2 files changed, 38 insertions(+), 144 deletions(-) diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index 1298e80c362..d8297636393 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -1641,10 +1641,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [] }, [BiomeId.PLAINS]: { [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.TWINS ], @@ -1652,10 +1649,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CILAN, TrainerType.CHILI, TrainerType.CRESS, TrainerType.CHEREN ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CILAN, TrainerType.CHILI, TrainerType.CRESS, TrainerType.CHEREN ] }, [BiomeId.GRASS]: { [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.SCHOOL_KID ], @@ -1663,10 +1657,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.ERIKA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.ERIKA ] }, [BiomeId.TALL_GRASS]: { [BiomePoolTier.COMMON]: [], @@ -1674,10 +1665,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.GARDENIA, TrainerType.VIOLA, TrainerType.BRASSIUS ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.GARDENIA, TrainerType.VIOLA, TrainerType.BRASSIUS ] }, [BiomeId.METROPOLIS]: { [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY, TrainerType.CLERK, TrainerType.CYCLIST, TrainerType.OFFICER, TrainerType.WAITER ], @@ -1685,10 +1673,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.ARTIST, TrainerType.RICH_KID ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.WHITNEY, TrainerType.NORMAN, TrainerType.IONO, TrainerType.LARRY ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.WHITNEY, TrainerType.NORMAN, TrainerType.IONO, TrainerType.LARRY ] }, [BiomeId.FOREST]: { [BiomePoolTier.COMMON]: [ TrainerType.RANGER ], @@ -1696,10 +1681,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BUGSY, TrainerType.BURGH, TrainerType.KATY ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.BUGSY, TrainerType.BURGH, TrainerType.KATY ] }, [BiomeId.SEA]: { [BiomePoolTier.COMMON]: [ TrainerType.SAILOR, TrainerType.SWIMMER ], @@ -1707,10 +1689,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.MARLON ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.MARLON ] }, [BiomeId.SWAMP]: { [BiomePoolTier.COMMON]: [ TrainerType.PARASOL_LADY ], @@ -1718,10 +1697,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.JANINE, TrainerType.ROXIE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.JANINE, TrainerType.ROXIE ] }, [BiomeId.BEACH]: { [BiomePoolTier.COMMON]: [ TrainerType.FISHERMAN, TrainerType.SAILOR ], @@ -1729,10 +1705,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.MISTY, TrainerType.KOFU ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.MISTY, TrainerType.KOFU ] }, [BiomeId.LAKE]: { [BiomePoolTier.COMMON]: [ TrainerType.BREEDER, TrainerType.FISHERMAN, TrainerType.PARASOL_LADY ], @@ -1740,21 +1713,15 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [ TrainerType.BLACK_BELT ], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CRASHER_WAKE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CRASHER_WAKE ] }, [BiomeId.SEABED]: { - [BiomePoolTier.COMMON]: [], + [BiomePoolTier.COMMON]: [ TrainerType.SWIMMER ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.JUAN ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.JUAN ] }, [BiomeId.MOUNTAIN]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.BLACK_BELT, TrainerType.HIKER ], @@ -1762,10 +1729,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.FALKNER, TrainerType.WINONA, TrainerType.SKYLA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.FALKNER, TrainerType.WINONA, TrainerType.SKYLA ] }, [BiomeId.BADLANDS]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.HIKER ], @@ -1773,10 +1737,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CLAY, TrainerType.GRANT ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CLAY, TrainerType.GRANT ] }, [BiomeId.CAVE]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.HIKER ], @@ -1784,10 +1745,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BROCK, TrainerType.ROXANNE, TrainerType.ROARK ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.BROCK, TrainerType.ROXANNE, TrainerType.ROARK ] }, [BiomeId.DESERT]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.SCIENTIST ], @@ -1795,10 +1753,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.GORDIE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.GORDIE ] }, [BiomeId.ICE_CAVE]: { [BiomePoolTier.COMMON]: [ TrainerType.SNOW_WORKER ], @@ -1806,10 +1761,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.PRYCE, TrainerType.BRYCEN, TrainerType.WULFRIC, TrainerType.GRUSHA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.PRYCE, TrainerType.BRYCEN, TrainerType.WULFRIC, TrainerType.GRUSHA ] }, [BiomeId.MEADOW]: { [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY, TrainerType.MUSICIAN, TrainerType.PARASOL_LADY ], @@ -1817,10 +1769,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.LENORA, TrainerType.MILO ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.LENORA, TrainerType.MILO ] }, [BiomeId.POWER_PLANT]: { [BiomePoolTier.COMMON]: [ TrainerType.GUITARIST, TrainerType.WORKER ], @@ -1828,10 +1777,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.VOLKNER, TrainerType.ELESA, TrainerType.CLEMONT ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.VOLKNER, TrainerType.ELESA, TrainerType.CLEMONT ] }, [BiomeId.VOLCANO]: { [BiomePoolTier.COMMON]: [ TrainerType.FIREBREATHER ], @@ -1839,10 +1785,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BLAINE, TrainerType.FLANNERY, TrainerType.KABU ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.BLAINE, TrainerType.FLANNERY, TrainerType.KABU ] }, [BiomeId.GRAVEYARD]: { [BiomePoolTier.COMMON]: [ TrainerType.PSYCHIC ], @@ -1850,10 +1793,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.MORTY, TrainerType.ALLISTER, TrainerType.RYME ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.MORTY, TrainerType.ALLISTER, TrainerType.RYME ] }, [BiomeId.DOJO]: { [BiomePoolTier.COMMON]: [ TrainerType.BLACK_BELT ], @@ -1861,10 +1801,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.BRAWLY, TrainerType.MAYLENE, TrainerType.KORRINA, TrainerType.BEA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.BRAWLY, TrainerType.MAYLENE, TrainerType.KORRINA, TrainerType.BEA ] }, [BiomeId.FACTORY]: { [BiomePoolTier.COMMON]: [ TrainerType.WORKER ], @@ -1872,10 +1809,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.JASMINE, TrainerType.BYRON ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.JASMINE, TrainerType.BYRON ] }, [BiomeId.RUINS]: { [BiomePoolTier.COMMON]: [ TrainerType.PSYCHIC, TrainerType.SCIENTIST ], @@ -1883,10 +1817,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.SABRINA, TrainerType.TATE, TrainerType.LIZA, TrainerType.TULIP ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.SABRINA, TrainerType.TATE, TrainerType.LIZA, TrainerType.TULIP ] }, [BiomeId.WASTELAND]: { [BiomePoolTier.COMMON]: [ TrainerType.VETERAN ], @@ -1894,10 +1825,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CLAIR, TrainerType.DRAYDEN, TrainerType.RAIHAN ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CLAIR, TrainerType.DRAYDEN, TrainerType.RAIHAN ] }, [BiomeId.ABYSS]: { [BiomePoolTier.COMMON]: [], @@ -1905,10 +1833,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.MARNIE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.MARNIE ] }, [BiomeId.SPACE]: { [BiomePoolTier.COMMON]: [], @@ -1916,10 +1841,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.OLYMPIA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.OLYMPIA ] }, [BiomeId.CONSTRUCTION_SITE]: { [BiomePoolTier.COMMON]: [ TrainerType.OFFICER, TrainerType.WORKER ], @@ -1927,10 +1849,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.LT_SURGE, TrainerType.CHUCK, TrainerType.WATTSON ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.LT_SURGE, TrainerType.CHUCK, TrainerType.WATTSON ] }, [BiomeId.JUNGLE]: { [BiomePoolTier.COMMON]: [ TrainerType.BACKPACKER, TrainerType.RANGER ], @@ -1938,10 +1857,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.RAMOS ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.RAMOS ] }, [BiomeId.FAIRY_CAVE]: { [BiomePoolTier.COMMON]: [ TrainerType.BEAUTY ], @@ -1949,10 +1865,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.VALERIE, TrainerType.OPAL, TrainerType.BEDE ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.VALERIE, TrainerType.OPAL, TrainerType.BEDE ] }, [BiomeId.TEMPLE]: { [BiomePoolTier.COMMON]: [], @@ -1960,10 +1873,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.FANTINA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.FANTINA ] }, [BiomeId.SLUM]: { [BiomePoolTier.COMMON]: [ TrainerType.BIKER, TrainerType.OFFICER, TrainerType.ROUGHNECK ], @@ -1971,10 +1881,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.PIERS ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.PIERS ] }, [BiomeId.SNOWY_FOREST]: { [BiomePoolTier.COMMON]: [ TrainerType.SNOW_WORKER ], @@ -1982,10 +1889,7 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.CANDICE, TrainerType.MELONY ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.CANDICE, TrainerType.MELONY ] }, [BiomeId.ISLAND]: { [BiomePoolTier.COMMON]: [ TrainerType.RICH_KID ], @@ -1993,21 +1897,15 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.NESSA ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.NESSA ] }, [BiomeId.LABORATORY]: { - [BiomePoolTier.COMMON]: [], + [BiomePoolTier.COMMON]: [ TrainerType.SCIENTIST ], [BiomePoolTier.UNCOMMON]: [], [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [ TrainerType.GIOVANNI ], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [ TrainerType.GIOVANNI ] }, [BiomeId.END]: { [BiomePoolTier.COMMON]: [], @@ -2015,13 +1913,9 @@ export const biomeTrainerPools: BiomeTrainerPools = { [BiomePoolTier.RARE]: [], [BiomePoolTier.SUPER_RARE]: [], [BiomePoolTier.ULTRA_RARE]: [], - [BiomePoolTier.BOSS]: [], - [BiomePoolTier.BOSS_RARE]: [], - [BiomePoolTier.BOSS_SUPER_RARE]: [], - [BiomePoolTier.BOSS_ULTRA_RARE]: [] + [BiomePoolTier.BOSS]: [] } }; - export function initBiomes() { const pokemonBiomes = [ [ SpeciesId.BULBASAUR, PokemonType.GRASS, PokemonType.POISON, [ diff --git a/src/field/arena.ts b/src/field/arena.ts index 484450cc5df..ed2f1df9b12 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -145,7 +145,7 @@ export class Arena { ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; console.log(BiomePoolTier[tier]); - while (!this.pokemonPool[tier].length) { + while (!this.pokemonPool[tier]?.length) { console.log(`Downgraded rarity tier from ${BiomePoolTier[tier]} to ${BiomePoolTier[tier - 1]}`); tier--; } From 4edcdc91921fd0dd7d4e9ca22ae85ebe928e6391 Mon Sep 17 00:00:00 2001 From: thisPieonFire Date: Wed, 6 Aug 2025 14:48:11 +0200 Subject: [PATCH 079/106] [Bug] [Move] Court Change now swaps Safeguard and Pledge Effects (#6069) * Add unit test for the "Court Change" move * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Add unit test for the "Court Change" move * Improve formatting in the "Court Change" move unit test * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Update test/moves/court-change.test.ts Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Added missing import * Added missing import (ArenaTagSide) * Update court-change.test.ts --------- Co-authored-by: PieonFire Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/moves/move.ts | 2 +- test/moves/court-change.test.ts | 85 +++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 test/moves/court-change.test.ts diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 0dfbc78d7ae..757f57e0b1f 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -10888,7 +10888,7 @@ export function initMoves() { .attr(MovePowerMultiplierAttr, (_user, target) => target.turnData.acted ? 1 : 2) .bitingMove(), new StatusMove(MoveId.COURT_CHANGE, PokemonType.NORMAL, 100, 10, -1, 0, 8) - .attr(SwapArenaTagsAttr, [ ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.MIST, ArenaTagType.REFLECT, ArenaTagType.SPIKES, ArenaTagType.STEALTH_ROCK, ArenaTagType.STICKY_WEB, ArenaTagType.TAILWIND, ArenaTagType.TOXIC_SPIKES ]), + .attr(SwapArenaTagsAttr, [ ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.MIST, ArenaTagType.REFLECT, ArenaTagType.SPIKES, ArenaTagType.STEALTH_ROCK, ArenaTagType.STICKY_WEB, ArenaTagType.TAILWIND, ArenaTagType.TOXIC_SPIKES, ArenaTagType.SAFEGUARD, ArenaTagType.FIRE_GRASS_PLEDGE, ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagType.GRASS_WATER_PLEDGE ]), /* Unused */ new AttackMove(MoveId.MAX_FLARE, PokemonType.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8) .target(MoveTarget.NEAR_ENEMY) diff --git a/test/moves/court-change.test.ts b/test/moves/court-change.test.ts new file mode 100644 index 00000000000..a27854c12be --- /dev/null +++ b/test/moves/court-change.test.ts @@ -0,0 +1,85 @@ +import { AbilityId } from "#enums/ability-id"; +import { ArenaTagSide } from "#enums/arena-tag-side"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Move - Court Change", () => { + 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 + .ability(AbilityId.BALL_FETCH) + .criticalHits(false) + .enemyAbility(AbilityId.STURDY) + .startingLevel(100) + .battleStyle("single") + .enemySpecies(SpeciesId.MAGIKARP) + .enemyMoveset(MoveId.SPLASH); + }); + + it("should swap combined Pledge effects to the opposite side", async () => { + game.override.battleStyle("double"); + await game.classicMode.startBattle([SpeciesId.REGIELEKI, SpeciesId.SHUCKLE]); + + const regieleki = game.field.getPlayerPokemon(); + const enemyPokemon = game.field.getEnemyPokemon(); + + game.move.use(MoveId.WATER_PLEDGE); + game.move.use(MoveId.GRASS_PLEDGE, 1); + await game.toNextTurn(); + + // enemy team will be in the swamp and slowed + expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined(); + expect(enemyPokemon.getEffectiveStat(Stat.SPD)).toBe(enemyPokemon.getStat(Stat.SPD) / 4); + + game.move.use(MoveId.COURT_CHANGE); + game.move.use(MoveId.SPLASH, 1); + await game.toEndOfTurn(); + + // own team should now be in the swamp and slowed + expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeUndefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); + expect(regieleki.getEffectiveStat(Stat.SPD)).toBe(regieleki.getStat(Stat.SPD) / 4); + }); + + it("should swap safeguard to the enemy side ", async () => { + game.override.enemyMoveset(MoveId.TOXIC_THREAD); + await game.classicMode.startBattle([SpeciesId.NINJASK]); + + const ninjask = game.field.getPlayerPokemon(); + + game.move.use(MoveId.SAFEGUARD); + await game.move.forceEnemyMove(MoveId.TOXIC_THREAD); + await game.toNextTurn(); + + // Ninjask will not be poisoned because of Safeguard + expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaTagSide.PLAYER)).toBeDefined(); + expect(ninjask.status?.effect).toBeUndefined(); + + game.move.use(MoveId.COURT_CHANGE); + await game.toEndOfTurn(); + + // Ninjask should now be poisoned due to lack of Safeguard + expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaTagSide.PLAYER)).toBeUndefined(); + expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaTagSide.ENEMY)).toBeDefined(); + expect(ninjask.status?.effect).toBe(StatusEffect.POISON); + }); +}); From ba5db5607d8199c74896e05674cbe3d5e312f4e1 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:03:20 -0600 Subject: [PATCH 080/106] [Bug][UI/UX][Refactor] Fix empty movesets related to starter forms and general SSUI cleanup (#6080) * Use phaser method chaining * Create updateSelectedStarterMoveset and fix moveset adjustment for pokemon forms Co-authored-by: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> * Apply biome formatting * Remove obsolete comment --------- Co-authored-by: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/ui/starter-select-ui-handler.ts | 1011 +++++++++++++-------------- 1 file changed, 477 insertions(+), 534 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index dac6bc677a2..5a8e6b803a8 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -335,6 +335,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { private natureLabel: Phaser.GameObjects.Text; private teraLabel: Phaser.GameObjects.Text; private goFilterLabel: Phaser.GameObjects.Text; + /** Group holding the UI elements appearing in the instructionsContainer */ + /* TODO: Uncomment this once our testing infra supports mocks of `Phaser.GameObject.Group` + private instructionElemGroup: Phaser.GameObjects.Group; + */ private starterSelectMessageBox: Phaser.GameObjects.NineSlice; private starterSelectMessageBoxContainer: Phaser.GameObjects.Container; @@ -407,70 +411,33 @@ export class StarterSelectUiHandler extends MessageUiHandler { const currentLanguage = i18next.resolvedLanguage ?? "en"; const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)) ?? "en"; const textSettings = languageSettings[langSettingKey]; + /** Scaled canvas height */ + const sHeight = globalScene.scaledCanvas.height; + /** Scaled canvas width */ + const sWidth = globalScene.scaledCanvas.width; - this.starterSelectContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); - this.starterSelectContainer.setVisible(false); + this.starterSelectContainer = globalScene.add.container(0, -sHeight).setVisible(false); ui.add(this.starterSelectContainer); - const bgColor = globalScene.add.rectangle( - 0, - 0, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6, - 0x006860, - ); - bgColor.setOrigin(0, 0); - this.starterSelectContainer.add(bgColor); + const bgColor = globalScene.add.rectangle(0, 0, sWidth, sHeight, 0x006860).setOrigin(0); - const starterSelectBg = globalScene.add.image(0, 0, "starter_select_bg"); - starterSelectBg.setOrigin(0, 0); - this.starterSelectContainer.add(starterSelectBg); - - this.shinyOverlay = globalScene.add.image(6, 6, "summary_overlay_shiny"); - this.shinyOverlay.setOrigin(0, 0); - this.shinyOverlay.setVisible(false); - this.starterSelectContainer.add(this.shinyOverlay); + const starterSelectBg = globalScene.add.image(0, 0, "starter_select_bg").setOrigin(0); + this.shinyOverlay = globalScene.add.image(6, 6, "summary_overlay_shiny").setOrigin(0).setVisible(false); const starterContainerWindow = addWindow(speciesContainerX, filterBarHeight + 1, 175, 161); - const starterContainerBg = globalScene.add.image( - speciesContainerX + 1, - filterBarHeight + 2, - "starter_container_bg", - ); - starterContainerBg.setOrigin(0, 0); - this.starterSelectContainer.add(starterContainerBg); - - this.starterSelectContainer.add( - addWindow( - teamWindowX, - teamWindowY - randomSelectionWindowHeight, - teamWindowWidth, - randomSelectionWindowHeight, - true, - ), - ); - this.starterSelectContainer.add(addWindow(teamWindowX, teamWindowY, teamWindowWidth, teamWindowHeight)); - this.starterSelectContainer.add( - addWindow(teamWindowX, teamWindowY + teamWindowHeight, teamWindowWidth, teamWindowWidth, true), - ); - this.starterSelectContainer.add(starterContainerWindow); + const starterContainerBg = globalScene.add + .image(speciesContainerX + 1, filterBarHeight + 2, "starter_container_bg") + .setOrigin(0); // Create and initialise filter bar this.filterBarContainer = globalScene.add.container(0, 0); this.filterBar = new FilterBar(Math.min(speciesContainerX, teamWindowX), 1, 210, filterBarHeight); // gen filter - const genOptions: DropDownOption[] = [ - new DropDownOption(1, new DropDownLabel(i18next.t("starterSelectUiHandler:gen1"))), - new DropDownOption(2, new DropDownLabel(i18next.t("starterSelectUiHandler:gen2"))), - new DropDownOption(3, new DropDownLabel(i18next.t("starterSelectUiHandler:gen3"))), - new DropDownOption(4, new DropDownLabel(i18next.t("starterSelectUiHandler:gen4"))), - new DropDownOption(5, new DropDownLabel(i18next.t("starterSelectUiHandler:gen5"))), - new DropDownOption(6, new DropDownLabel(i18next.t("starterSelectUiHandler:gen6"))), - new DropDownOption(7, new DropDownLabel(i18next.t("starterSelectUiHandler:gen7"))), - new DropDownOption(8, new DropDownLabel(i18next.t("starterSelectUiHandler:gen8"))), - new DropDownOption(9, new DropDownLabel(i18next.t("starterSelectUiHandler:gen9"))), - ]; + const genOptions: DropDownOption[] = Array.from( + { length: 9 }, + (_, i) => new DropDownOption(i + 1, new DropDownLabel(i18next.t(`starterSelectUiHandler:gen${i + 1}`))), + ); const genDropDown: DropDown = new DropDown(0, 0, genOptions, this.updateStarters, DropDownType.HYBRID); this.filterBar.addFilter(DropDownColumn.GEN, i18next.t("filterBar:genFilter"), genDropDown); @@ -493,21 +460,24 @@ export class StarterSelectUiHandler extends MessageUiHandler { ); // caught filter - const shiny1Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); - shiny1Sprite.setOrigin(0.15, 0.2); - shiny1Sprite.setScale(0.6); - shiny1Sprite.setFrame(getVariantIcon(0)); - shiny1Sprite.setTint(getVariantTint(0)); - const shiny2Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); - shiny2Sprite.setOrigin(0.15, 0.2); - shiny2Sprite.setScale(0.6); - shiny2Sprite.setFrame(getVariantIcon(1)); - shiny2Sprite.setTint(getVariantTint(1)); - const shiny3Sprite = globalScene.add.sprite(0, 0, "shiny_icons"); - shiny3Sprite.setOrigin(0.15, 0.2); - shiny3Sprite.setScale(0.6); - shiny3Sprite.setFrame(getVariantIcon(2)); - shiny3Sprite.setTint(getVariantTint(2)); + const shiny1Sprite = globalScene.add + .sprite(0, 0, "shiny_icons") + .setOrigin(0.15, 0.2) + .setScale(0.6) + .setFrame(getVariantIcon(0)) + .setTint(getVariantTint(0)); + const shiny2Sprite = globalScene.add + .sprite(0, 0, "shiny_icons") + .setOrigin(0.15, 0.2) + .setScale(0.6) + .setFrame(getVariantIcon(1)) + .setTint(getVariantTint(1)); + const shiny3Sprite = globalScene.add + .sprite(0, 0, "shiny_icons") + .setOrigin(0.15, 0.2) + .setScale(0.6) + .setFrame(getVariantIcon(2)) + .setTint(getVariantTint(2)); const caughtOptions = [ new DropDownOption("SHINY3", new DropDownLabel("", shiny3Sprite)), @@ -608,8 +578,6 @@ export class StarterSelectUiHandler extends MessageUiHandler { ); this.filterBarContainer.add(this.filterBar); - this.starterSelectContainer.add(this.filterBarContainer); - // Offset the generation filter dropdown to avoid covering the filtered pokemon this.filterBar.offsetHybridFilters(); @@ -625,15 +593,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { tone: [0.0, 0.0, 0.0, 0.0], ignoreTimeTint: true, }); - this.starterSelectContainer.add(this.pokemonSprite); - this.pokemonNumberText = addTextObject(17, 1, "0000", TextStyle.SUMMARY_DEX_NUM); - this.pokemonNumberText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonNumberText); + this.pokemonNumberText = addTextObject(17, 1, "0000", TextStyle.SUMMARY_DEX_NUM).setOrigin(0); - this.pokemonNameText = addTextObject(6, 112, "", TextStyle.SUMMARY); - this.pokemonNameText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonNameText); + this.pokemonNameText = addTextObject(6, 112, "", TextStyle.SUMMARY).setOrigin(0); this.pokemonGrowthRateLabelText = addTextObject( 8, @@ -641,18 +604,15 @@ export class StarterSelectUiHandler extends MessageUiHandler { i18next.t("starterSelectUiHandler:growthRate"), TextStyle.SUMMARY_ALT, { fontSize: "36px" }, + ) + .setOrigin(0) + .setVisible(false); + + this.pokemonGrowthRateText = addTextObject(34, 106, "", TextStyle.GROWTH_RATE_TYPE, { fontSize: "36px" }).setOrigin( + 0, ); - this.pokemonGrowthRateLabelText.setOrigin(0, 0); - this.pokemonGrowthRateLabelText.setVisible(false); - this.starterSelectContainer.add(this.pokemonGrowthRateLabelText); - this.pokemonGrowthRateText = addTextObject(34, 106, "", TextStyle.GROWTH_RATE_TYPE, { fontSize: "36px" }); - this.pokemonGrowthRateText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonGrowthRateText); - - this.pokemonGenderText = addTextObject(96, 112, "", TextStyle.SUMMARY_ALT); - this.pokemonGenderText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonGenderText); + this.pokemonGenderText = addTextObject(96, 112, "", TextStyle.SUMMARY_ALT).setOrigin(0); this.pokemonUncaughtText = addTextObject( 6, @@ -660,9 +620,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { i18next.t("starterSelectUiHandler:uncaught"), TextStyle.SUMMARY_ALT, { fontSize: "56px" }, - ); - this.pokemonUncaughtText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonUncaughtText); + ).setOrigin(0); // The position should be set per language const starterInfoXPos = textSettings?.starterInfoXPos || 31; @@ -677,19 +635,15 @@ export class StarterSelectUiHandler extends MessageUiHandler { i18next.t("starterSelectUiHandler:ability"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }, - ); - this.pokemonAbilityLabelText.setOrigin(0, 0); - this.pokemonAbilityLabelText.setVisible(false); - - this.starterSelectContainer.add(this.pokemonAbilityLabelText); + ) + .setOrigin(0) + .setVisible(false); this.pokemonAbilityText = addTextObject(starterInfoXPos, 127 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize, - }); - this.pokemonAbilityText.setOrigin(0, 0); - this.pokemonAbilityText.setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains); - - this.starterSelectContainer.add(this.pokemonAbilityText); + }) + .setOrigin(0) + .setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains); this.pokemonPassiveLabelText = addTextObject( 6, @@ -697,29 +651,27 @@ export class StarterSelectUiHandler extends MessageUiHandler { i18next.t("starterSelectUiHandler:passive"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }, - ); - this.pokemonPassiveLabelText.setOrigin(0, 0); - this.pokemonPassiveLabelText.setVisible(false); - this.starterSelectContainer.add(this.pokemonPassiveLabelText); + ) + .setOrigin(0) + .setVisible(false); this.pokemonPassiveText = addTextObject(starterInfoXPos, 136 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize, - }); - this.pokemonPassiveText.setOrigin(0, 0); - this.pokemonPassiveText.setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains); - this.starterSelectContainer.add(this.pokemonPassiveText); + }) + .setOrigin(0) + .setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains); - this.pokemonPassiveDisabledIcon = globalScene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_stop"); - this.pokemonPassiveDisabledIcon.setOrigin(0, 0.5); - this.pokemonPassiveDisabledIcon.setScale(0.35); - this.pokemonPassiveDisabledIcon.setVisible(false); - this.starterSelectContainer.add(this.pokemonPassiveDisabledIcon); + this.pokemonPassiveDisabledIcon = globalScene.add + .sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_stop") + .setOrigin(0, 0.5) + .setScale(0.35) + .setVisible(false); - this.pokemonPassiveLockedIcon = globalScene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_lock"); - this.pokemonPassiveLockedIcon.setOrigin(0, 0.5); - this.pokemonPassiveLockedIcon.setScale(0.42, 0.38); - this.pokemonPassiveLockedIcon.setVisible(false); - this.starterSelectContainer.add(this.pokemonPassiveLockedIcon); + this.pokemonPassiveLockedIcon = globalScene.add + .sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_lock") + .setOrigin(0, 0.5) + .setScale(0.42, 0.38) + .setVisible(false); this.pokemonNatureLabelText = addTextObject( 6, @@ -727,16 +679,13 @@ export class StarterSelectUiHandler extends MessageUiHandler { i18next.t("starterSelectUiHandler:nature"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }, - ); - this.pokemonNatureLabelText.setOrigin(0, 0); - this.pokemonNatureLabelText.setVisible(false); - this.starterSelectContainer.add(this.pokemonNatureLabelText); + ) + .setOrigin(0) + .setVisible(false); this.pokemonNatureText = addBBCodeTextObject(starterInfoXPos, 145 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize, - }); - this.pokemonNatureText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonNatureText); + }).setOrigin(0); this.pokemonMoveContainers = []; this.pokemonMoveBgs = []; @@ -746,54 +695,34 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMoveBgs = []; this.pokemonEggMoveLabels = []; - this.valueLimitLabel = addTextObject(teamWindowX + 17, 150, "0/10", TextStyle.STARTER_VALUE_LIMIT); - this.valueLimitLabel.setOrigin(0.5, 0); - this.starterSelectContainer.add(this.valueLimitLabel); - - const startLabel = addTextObject(teamWindowX + 17, 162, i18next.t("common:start"), TextStyle.TOOLTIP_CONTENT); - startLabel.setOrigin(0.5, 0); - this.starterSelectContainer.add(startLabel); - - this.startCursorObj = globalScene.add.nineslice( - teamWindowX + 4, - 160, - "select_cursor", - undefined, - 26, - 15, - 6, - 6, - 6, - 6, + this.valueLimitLabel = addTextObject(teamWindowX + 17, 150, "0/10", TextStyle.STARTER_VALUE_LIMIT).setOrigin( + 0.5, + 0, ); - this.startCursorObj.setVisible(false); - this.startCursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.startCursorObj); + + const startLabel = addTextObject( + teamWindowX + 17, + 162, + i18next.t("common:start"), + TextStyle.TOOLTIP_CONTENT, + ).setOrigin(0.5, 0); + + this.startCursorObj = globalScene.add + .nineslice(teamWindowX + 4, 160, "select_cursor", undefined, 26, 15, 6, 6, 6, 6) + .setVisible(false) + .setOrigin(0); const randomSelectLabel = addTextObject( teamWindowX + 17, 23, i18next.t("starterSelectUiHandler:randomize"), TextStyle.TOOLTIP_CONTENT, - ); - randomSelectLabel.setOrigin(0.5, 0); - this.starterSelectContainer.add(randomSelectLabel); + ).setOrigin(0.5, 0); - this.randomCursorObj = globalScene.add.nineslice( - teamWindowX + 4, - 21, - "select_cursor", - undefined, - 26, - 15, - 6, - 6, - 6, - 6, - ); - this.randomCursorObj.setVisible(false); - this.randomCursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.randomCursorObj); + this.randomCursorObj = globalScene.add + .nineslice(teamWindowX + 4, 21, "select_cursor", undefined, 26, 15, 6, 6, 6, 6) + .setVisible(false) + .setOrigin(0); const starterSpecies: SpeciesId[] = []; @@ -807,7 +736,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { for (let i = 0; i < POKERUS_STARTER_COUNT; i++) { const cursorObj = globalScene.add.image(0, 0, "select_cursor_pokerus"); cursorObj.setVisible(false); - cursorObj.setOrigin(0, 0); + cursorObj.setOrigin(0); starterBoxContainer.add(cursorObj); this.pokerusCursorObjs.push(cursorObj); } @@ -816,21 +745,21 @@ export class StarterSelectUiHandler extends MessageUiHandler { for (let i = 0; i < 6; i++) { const cursorObj = globalScene.add.image(0, 0, "select_cursor_highlight"); cursorObj.setVisible(false); - cursorObj.setOrigin(0, 0); + cursorObj.setOrigin(0); starterBoxContainer.add(cursorObj); this.starterCursorObjs.push(cursorObj); } - this.cursorObj = globalScene.add.image(0, 0, "select_cursor"); - this.cursorObj.setOrigin(0, 0); - this.starterIconsCursorObj = globalScene.add.image(289, 64, "select_gen_cursor"); - this.starterIconsCursorObj.setName("starter-icons-cursor"); - this.starterIconsCursorObj.setVisible(false); - this.starterIconsCursorObj.setOrigin(0, 0); - this.starterSelectContainer.add(this.starterIconsCursorObj); + this.cursorObj = globalScene.add.image(0, 0, "select_cursor").setOrigin(0); + this.starterIconsCursorObj = globalScene.add + .image(289, 64, "select_gen_cursor") + .setName("starter-icons-cursor") + .setVisible(false) + .setOrigin(0); starterBoxContainer.add(this.cursorObj); + // TODO: Apply the same logic done in the pokedex to only have 81 containers whose sprites are cycled for (const species of allSpecies) { if (!speciesStarterCosts.hasOwnProperty(species.speciesId) || !species.isObtainable()) { continue; @@ -846,109 +775,74 @@ export class StarterSelectUiHandler extends MessageUiHandler { starterBoxContainer.add(starterContainer); } - this.starterSelectContainer.add(starterBoxContainer); - this.starterIcons = []; for (let i = 0; i < 6; i++) { - const icon = globalScene.add.sprite(teamWindowX + 7, calcStarterIconY(i), "pokemon_icons_0"); - icon.setScale(0.5); - icon.setOrigin(0, 0); - icon.setFrame("unknown"); - this.starterSelectContainer.add(icon); + const icon = globalScene.add + .sprite(teamWindowX + 7, calcStarterIconY(i), "pokemon_icons_0") + .setScale(0.5) + .setOrigin(0) + .setFrame("unknown"); this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); this.starterIcons.push(icon); } - this.type1Icon = globalScene.add.sprite(8, 98, getLocalizedSpriteKey("types")); - this.type1Icon.setScale(0.5); - this.type1Icon.setOrigin(0, 0); - this.starterSelectContainer.add(this.type1Icon); + this.type1Icon = globalScene.add.sprite(8, 98, getLocalizedSpriteKey("types")).setScale(0.5).setOrigin(0); - this.type2Icon = globalScene.add.sprite(26, 98, getLocalizedSpriteKey("types")); - this.type2Icon.setScale(0.5); - this.type2Icon.setOrigin(0, 0); - this.starterSelectContainer.add(this.type2Icon); + this.type2Icon = globalScene.add.sprite(26, 98, getLocalizedSpriteKey("types")).setScale(0.5).setOrigin(0); this.pokemonLuckLabelText = addTextObject(8, 89, i18next.t("common:luckIndicator"), TextStyle.WINDOW_ALT, { fontSize: "56px", - }); - this.pokemonLuckLabelText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonLuckLabelText); + }).setOrigin(0); this.pokemonLuckText = addTextObject( 8 + this.pokemonLuckLabelText.displayWidth + 2, 89, "0", TextStyle.LUCK_VALUE, - { - fontSize: "56px", - }, - ); - this.pokemonLuckText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonLuckText); + { fontSize: "56px" }, + ).setOrigin(0); // Candy icon and count - this.pokemonCandyContainer = globalScene.add.container(4.5, 18); + this.pokemonCandyContainer = globalScene.add + .container(4.5, 18) + .setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 20), Phaser.Geom.Rectangle.Contains); + this.pokemonCandyIcon = globalScene.add.sprite(0, 0, "candy").setScale(0.5).setOrigin(0); + this.pokemonCandyOverlayIcon = globalScene.add.sprite(0, 0, "candy_overlay").setScale(0.5).setOrigin(0); + this.pokemonCandyDarknessOverlay = globalScene.add + .sprite(0, 0, "candy") + .setScale(0.5) + .setOrigin(0) + .setTint(0x000000) + .setAlpha(0.5); - this.pokemonCandyIcon = globalScene.add.sprite(0, 0, "candy"); - this.pokemonCandyIcon.setScale(0.5); - this.pokemonCandyIcon.setOrigin(0, 0); - this.pokemonCandyContainer.add(this.pokemonCandyIcon); - - this.pokemonCandyOverlayIcon = globalScene.add.sprite(0, 0, "candy_overlay"); - this.pokemonCandyOverlayIcon.setScale(0.5); - this.pokemonCandyOverlayIcon.setOrigin(0, 0); - this.pokemonCandyContainer.add(this.pokemonCandyOverlayIcon); - - this.pokemonCandyDarknessOverlay = globalScene.add.sprite(0, 0, "candy"); - this.pokemonCandyDarknessOverlay.setScale(0.5); - this.pokemonCandyDarknessOverlay.setOrigin(0, 0); - this.pokemonCandyDarknessOverlay.setTint(0x000000); - this.pokemonCandyDarknessOverlay.setAlpha(0.5); - this.pokemonCandyContainer.add(this.pokemonCandyDarknessOverlay); - - this.pokemonCandyCountText = addTextObject(9.5, 0, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }); - this.pokemonCandyCountText.setOrigin(0, 0); - this.pokemonCandyContainer.add(this.pokemonCandyCountText); - - this.pokemonCandyContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 30, 20), Phaser.Geom.Rectangle.Contains); - this.starterSelectContainer.add(this.pokemonCandyContainer); + this.pokemonCandyCountText = addTextObject(9.5, 0, "x0", TextStyle.WINDOW_ALT, { fontSize: "56px" }).setOrigin(0); + this.pokemonCandyContainer.add([ + this.pokemonCandyIcon, + this.pokemonCandyOverlayIcon, + this.pokemonCandyDarknessOverlay, + this.pokemonCandyCountText, + ]); this.pokemonFormText = addTextObject(6, 42, "Form", TextStyle.WINDOW_ALT, { fontSize: "42px", - }); - this.pokemonFormText.setOrigin(0, 0); - this.starterSelectContainer.add(this.pokemonFormText); + }).setOrigin(0); - this.pokemonCaughtHatchedContainer = globalScene.add.container(2, 25); - this.pokemonCaughtHatchedContainer.setScale(0.5); - this.starterSelectContainer.add(this.pokemonCaughtHatchedContainer); + this.pokemonCaughtHatchedContainer = globalScene.add.container(2, 25).setScale(0.5); - const pokemonCaughtIcon = globalScene.add.sprite(1, 0, "items", "pb"); - pokemonCaughtIcon.setOrigin(0, 0); - pokemonCaughtIcon.setScale(0.75); - this.pokemonCaughtHatchedContainer.add(pokemonCaughtIcon); + const pokemonCaughtIcon = globalScene.add.sprite(1, 0, "items", "pb").setOrigin(0).setScale(0.75); - this.pokemonCaughtCountText = addTextObject(24, 4, "0", TextStyle.SUMMARY_ALT); - this.pokemonCaughtCountText.setOrigin(0, 0); - this.pokemonCaughtHatchedContainer.add(this.pokemonCaughtCountText); - - this.pokemonHatchedIcon = globalScene.add.sprite(1, 14, "egg_icons"); - this.pokemonHatchedIcon.setOrigin(0.15, 0.2); - this.pokemonHatchedIcon.setScale(0.8); - this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedIcon); - - this.pokemonShinyIcon = globalScene.add.sprite(14, 76, "shiny_icons"); - this.pokemonShinyIcon.setOrigin(0.15, 0.2); - this.pokemonShinyIcon.setScale(1); - this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon); - - this.pokemonHatchedCountText = addTextObject(24, 19, "0", TextStyle.SUMMARY_ALT); - this.pokemonHatchedCountText.setOrigin(0, 0); - this.pokemonCaughtHatchedContainer.add(this.pokemonHatchedCountText); - - this.pokemonMovesContainer = globalScene.add.container(102, 16); - this.pokemonMovesContainer.setScale(0.375); + this.pokemonCaughtCountText = addTextObject(24, 4, "0", TextStyle.SUMMARY_ALT).setOrigin(0); + this.pokemonHatchedIcon = globalScene.add.sprite(1, 14, "egg_icons").setOrigin(0.15, 0.2).setScale(0.8); + this.pokemonShinyIcon = globalScene.add.sprite(14, 76, "shiny_icons").setOrigin(0.15, 0.2).setScale(1); + this.pokemonHatchedCountText = addTextObject(24, 19, "0", TextStyle.SUMMARY_ALT).setOrigin(0); + this.pokemonMovesContainer = globalScene.add.container(102, 16).setScale(0.375); + this.pokemonCaughtHatchedContainer.add([ + pokemonCaughtIcon, + this.pokemonCaughtCountText, + this.pokemonHatchedIcon, + this.pokemonShinyIcon, + this.pokemonHatchedCountText, + ]); for (let m = 0; m < 4; m++) { const moveContainer = globalScene.add.container(0, 14 * m); @@ -962,8 +856,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonMoveBgs.push(moveBg); this.pokemonMoveLabels.push(moveLabel); - moveContainer.add(moveBg); - moveContainer.add(moveLabel); + moveContainer.add([moveBg, moveLabel]); this.pokemonMoveContainers.push(moveContainer); this.pokemonMovesContainer.add(moveContainer); @@ -974,18 +867,18 @@ export class StarterSelectUiHandler extends MessageUiHandler { 56, "(+0)", TextStyle.MOVE_LABEL, - ); - this.pokemonAdditionalMoveCountLabel.setOrigin(0.5, 0); + ).setOrigin(0.5, 0); this.pokemonMovesContainer.add(this.pokemonAdditionalMoveCountLabel); - this.starterSelectContainer.add(this.pokemonMovesContainer); + this.pokemonEggMovesContainer = globalScene.add.container(102, 85).setScale(0.375); - this.pokemonEggMovesContainer = globalScene.add.container(102, 85); - this.pokemonEggMovesContainer.setScale(0.375); - - const eggMovesLabel = addTextObject(-46, 0, i18next.t("starterSelectUiHandler:eggMoves"), TextStyle.WINDOW_ALT); - eggMovesLabel.setOrigin(0.5, 0); + const eggMovesLabel = addTextObject( + -46, + 0, + i18next.t("starterSelectUiHandler:eggMoves"), + TextStyle.WINDOW_ALT, + ).setOrigin(0.5, 0); this.pokemonEggMovesContainer.add(eggMovesLabel); @@ -1001,143 +894,103 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMoveBgs.push(eggMoveBg); this.pokemonEggMoveLabels.push(eggMoveLabel); - eggMoveContainer.add(eggMoveBg); - eggMoveContainer.add(eggMoveLabel); + eggMoveContainer.add([eggMoveBg, eggMoveLabel]); this.pokemonEggMoveContainers.push(eggMoveContainer); this.pokemonEggMovesContainer.add(eggMoveContainer); } - this.starterSelectContainer.add(this.pokemonEggMovesContainer); - - this.teraIcon = globalScene.add.sprite(85, 63, "button_tera"); - this.teraIcon.setName("terrastallize-icon"); - this.teraIcon.setFrame("fire"); - this.starterSelectContainer.add(this.teraIcon); + this.teraIcon = globalScene.add.sprite(85, 63, "button_tera").setName("terrastallize-icon").setFrame("fire"); // The font size should be set per language const instructionTextSize = textSettings.instructionTextSize; - this.instructionsContainer = globalScene.add.container(4, 156); - this.instructionsContainer.setVisible(true); - this.starterSelectContainer.add(this.instructionsContainer); + this.instructionsContainer = globalScene.add.container(4, 156).setVisible(true); + + const iRowX = this.instructionRowX; + const iRowY = this.instructionRowY; + const iRowTextX = iRowX + this.instructionRowTextOffset; // instruction rows that will be pushed into the container dynamically based on need // creating new sprites since they will be added to the scene later - this.shinyIconElement = new Phaser.GameObjects.Sprite( - globalScene, - this.instructionRowX, - this.instructionRowY, - "keyboard", - "R.png", - ); - this.shinyIconElement.setName("sprite-shiny-icon-element"); - this.shinyIconElement.setScale(0.675); - this.shinyIconElement.setOrigin(0.0, 0.0); + this.shinyIconElement = new Phaser.GameObjects.Sprite(globalScene, iRowX, iRowY, "keyboard", "R.png") + .setName("sprite-shiny-icon-element") + .setScale(0.675) + .setOrigin(0); this.shinyLabel = addTextObject( - this.instructionRowX + this.instructionRowTextOffset, - this.instructionRowY, + iRowTextX, + iRowY, i18next.t("starterSelectUiHandler:cycleShiny"), TextStyle.INSTRUCTIONS_TEXT, - { fontSize: instructionTextSize }, - ); - this.shinyLabel.setName("text-shiny-label"); + { + fontSize: instructionTextSize, + }, + ).setName("text-shiny-label"); - this.formIconElement = new Phaser.GameObjects.Sprite( - globalScene, - this.instructionRowX, - this.instructionRowY, - "keyboard", - "F.png", - ); - this.formIconElement.setName("sprite-form-icon-element"); - this.formIconElement.setScale(0.675); - this.formIconElement.setOrigin(0.0, 0.0); + this.formIconElement = new Phaser.GameObjects.Sprite(globalScene, iRowX, iRowY, "keyboard", "F.png") + .setName("sprite-form-icon-element") + .setScale(0.675) + .setOrigin(0); this.formLabel = addTextObject( - this.instructionRowX + this.instructionRowTextOffset, - this.instructionRowY, + iRowTextX, + iRowY, i18next.t("starterSelectUiHandler:cycleForm"), TextStyle.INSTRUCTIONS_TEXT, - { fontSize: instructionTextSize }, - ); - this.formLabel.setName("text-form-label"); + { + fontSize: instructionTextSize, + }, + ).setName("text-form-label"); - this.genderIconElement = new Phaser.GameObjects.Sprite( - globalScene, - this.instructionRowX, - this.instructionRowY, - "keyboard", - "G.png", - ); - this.genderIconElement.setName("sprite-gender-icon-element"); - this.genderIconElement.setScale(0.675); - this.genderIconElement.setOrigin(0.0, 0.0); + this.genderIconElement = new Phaser.GameObjects.Sprite(globalScene, iRowX, iRowY, "keyboard", "G.png") + .setName("sprite-gender-icon-element") + .setScale(0.675) + .setOrigin(0); this.genderLabel = addTextObject( - this.instructionRowX + this.instructionRowTextOffset, - this.instructionRowY, + iRowTextX, + iRowY, i18next.t("starterSelectUiHandler:cycleGender"), TextStyle.INSTRUCTIONS_TEXT, { fontSize: instructionTextSize }, - ); - this.genderLabel.setName("text-gender-label"); + ).setName("text-gender-label"); - this.abilityIconElement = new Phaser.GameObjects.Sprite( - globalScene, - this.instructionRowX, - this.instructionRowY, - "keyboard", - "E.png", - ); - this.abilityIconElement.setName("sprite-ability-icon-element"); - this.abilityIconElement.setScale(0.675); - this.abilityIconElement.setOrigin(0.0, 0.0); + this.abilityIconElement = new Phaser.GameObjects.Sprite(globalScene, iRowX, iRowY, "keyboard", "E.png") + .setName("sprite-ability-icon-element") + .setScale(0.675) + .setOrigin(0); this.abilityLabel = addTextObject( - this.instructionRowX + this.instructionRowTextOffset, - this.instructionRowY, + iRowTextX, + iRowY, i18next.t("starterSelectUiHandler:cycleAbility"), TextStyle.INSTRUCTIONS_TEXT, { fontSize: instructionTextSize }, - ); - this.abilityLabel.setName("text-ability-label"); + ).setName("text-ability-label"); - this.natureIconElement = new Phaser.GameObjects.Sprite( - globalScene, - this.instructionRowX, - this.instructionRowY, - "keyboard", - "N.png", - ); - this.natureIconElement.setName("sprite-nature-icon-element"); - this.natureIconElement.setScale(0.675); - this.natureIconElement.setOrigin(0.0, 0.0); + this.natureIconElement = new Phaser.GameObjects.Sprite(globalScene, iRowX, iRowY, "keyboard", "N.png") + .setName("sprite-nature-icon-element") + .setScale(0.675) + .setOrigin(0); this.natureLabel = addTextObject( - this.instructionRowX + this.instructionRowTextOffset, - this.instructionRowY, + iRowTextX, + iRowY, i18next.t("starterSelectUiHandler:cycleNature"), TextStyle.INSTRUCTIONS_TEXT, { fontSize: instructionTextSize }, - ); - this.natureLabel.setName("text-nature-label"); + ).setName("text-nature-label"); - this.teraIconElement = new Phaser.GameObjects.Sprite( - globalScene, - this.instructionRowX, - this.instructionRowY, - "keyboard", - "V.png", - ); - this.teraIconElement.setName("sprite-tera-icon-element"); - this.teraIconElement.setScale(0.675); - this.teraIconElement.setOrigin(0.0, 0.0); + this.teraIconElement = new Phaser.GameObjects.Sprite(globalScene, iRowX, iRowY, "keyboard", "V.png") + .setName("sprite-tera-icon-element") + .setScale(0.675) + .setOrigin(0); this.teraLabel = addTextObject( - this.instructionRowX + this.instructionRowTextOffset, - this.instructionRowY, + iRowTextX, + iRowY, i18next.t("starterSelectUiHandler:cycleTera"), TextStyle.INSTRUCTIONS_TEXT, - { fontSize: instructionTextSize }, - ); - this.teraLabel.setName("text-tera-label"); + { + fontSize: instructionTextSize, + }, + ).setName("text-tera-label"); this.goFilterIconElement = new Phaser.GameObjects.Sprite( globalScene, @@ -1145,48 +998,57 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.filterInstructionRowY, "keyboard", "C.png", - ); - this.goFilterIconElement.setName("sprite-goFilter-icon-element"); - this.goFilterIconElement.setScale(0.675); - this.goFilterIconElement.setOrigin(0.0, 0.0); + ) + .setName("sprite-goFilter-icon-element") + .setScale(0.675) + .setOrigin(0); this.goFilterLabel = addTextObject( this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY, i18next.t("starterSelectUiHandler:goFilter"), TextStyle.INSTRUCTIONS_TEXT, { fontSize: instructionTextSize }, - ); - this.goFilterLabel.setName("text-goFilter-label"); + ).setName("text-goFilter-label"); + + /** TODO: Uncomment this and update `this.hideInstructions` once our testing infra supports mocks of `Phaser.GameObject.Group` */ + /* + this.instructionElemGroup = globalScene.add.group([ + this.shinyIconElement, + this.shinyLabel, + this.formIconElement, + this.formLabel, + this.genderIconElement, + this.genderLabel, + this.abilityIconElement, + this.abilityLabel, + this.natureIconElement, + this.natureLabel, + this.teraIconElement, + this.teraLabel, + this.goFilterIconElement, + this.goFilterLabel, + ]); + */ this.hideInstructions(); - this.filterInstructionsContainer = globalScene.add.container(50, 5); - this.filterInstructionsContainer.setVisible(true); - this.starterSelectContainer.add(this.filterInstructionsContainer); + this.filterInstructionsContainer = globalScene.add.container(50, 5).setVisible(true); - this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); - this.starterSelectMessageBoxContainer.setVisible(false); - this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); + this.starterSelectMessageBoxContainer = globalScene.add.container(0, sHeight).setVisible(false); - this.starterSelectMessageBox = addWindow(1, -1, 318, 28); - this.starterSelectMessageBox.setOrigin(0, 1); + this.starterSelectMessageBox = addWindow(1, -1, 318, 28).setOrigin(0, 1); this.starterSelectMessageBoxContainer.add(this.starterSelectMessageBox); - this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }); - this.message.setOrigin(0, 0); + this.message = addTextObject(8, 8, "", TextStyle.WINDOW, { maxLines: 2 }).setOrigin(0); this.starterSelectMessageBoxContainer.add(this.message); // arrow icon for the message box this.initPromptSprite(this.starterSelectMessageBoxContainer); - this.statsContainer = new StatsContainer(6, 16); + this.statsContainer = new StatsContainer(6, 16).setVisible(false); globalScene.add.existing(this.statsContainer); - this.statsContainer.setVisible(false); - - this.starterSelectContainer.add(this.statsContainer); - // add the info overlay last to be the top most ui element and prevent the IVs from overlaying this const overlayScale = 1; this.moveInfoOverlay = new MoveInfoOverlay({ @@ -1195,10 +1057,65 @@ export class StarterSelectUiHandler extends MessageUiHandler { x: 1, y: globalScene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, }); - this.starterSelectContainer.add(this.moveInfoOverlay); - // Filter bar sits above everything, except the tutorial overlay and message box - this.starterSelectContainer.bringToTop(this.filterBarContainer); + this.starterSelectContainer.add([ + bgColor, + starterSelectBg, + this.shinyOverlay, + starterContainerBg, + addWindow( + teamWindowX, + teamWindowY - randomSelectionWindowHeight, + teamWindowWidth, + randomSelectionWindowHeight, + true, + ), + addWindow(teamWindowX, teamWindowY, teamWindowWidth, teamWindowHeight), + addWindow(teamWindowX, teamWindowY + teamWindowHeight, teamWindowWidth, teamWindowWidth, true), + starterContainerWindow, + this.pokemonSprite, + this.pokemonNumberText, + this.pokemonNameText, + this.pokemonGrowthRateLabelText, + this.pokemonGrowthRateText, + this.pokemonGenderText, + this.pokemonUncaughtText, + this.pokemonAbilityLabelText, + this.pokemonAbilityText, + this.pokemonPassiveLabelText, + this.pokemonPassiveText, + this.pokemonPassiveDisabledIcon, + this.pokemonPassiveLockedIcon, + this.pokemonNatureLabelText, + this.pokemonNatureText, + this.valueLimitLabel, + startLabel, + this.startCursorObj, + randomSelectLabel, + this.randomCursorObj, + this.starterIconsCursorObj, + starterBoxContainer, + ...this.starterIcons, + this.type1Icon, + this.type2Icon, + this.pokemonLuckLabelText, + this.pokemonLuckText, + this.pokemonCandyContainer, + this.pokemonFormText, + this.pokemonCaughtHatchedContainer, + this.pokemonMovesContainer, + this.pokemonEggMovesContainer, + this.teraIcon, + this.instructionsContainer, + this.filterInstructionsContainer, + this.starterSelectMessageBoxContainer, + this.statsContainer, + this.moveInfoOverlay, + // Filter bar sits above everything, except the tutorial overlay and message box. + // Do not put anything below this unless it must appear below the filter bar. + this.filterBarContainer, + ]); + this.initTutorialOverlay(this.starterSelectContainer); this.starterSelectContainer.bringToTop(this.starterSelectMessageBoxContainer); @@ -1390,7 +1307,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectMessageBox.setSize(318, singleLine ? 28 : 42); if (moveToTop) { - this.starterSelectMessageBox.setOrigin(0, 0); + this.starterSelectMessageBox.setOrigin(0); this.starterSelectMessageBoxContainer.setY(0); this.message.setY(4); } else { @@ -1924,9 +1841,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { true, ); if (!isDupe && isValidForChallenge && isOverValueLimit) { - const cursorObj = this.starterCursorObjs[this.starterSpecies.length]; - cursorObj.setVisible(true); - cursorObj.setPosition(this.cursorObj.x, this.cursorObj.y); + this.starterCursorObjs[this.starterSpecies.length] + .setVisible(true) + .setPosition(this.cursorObj.x, this.cursorObj.y); this.addToParty( this.lastSpecies, this.dexAttrCursor, @@ -2409,9 +2326,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { globalScene.playSound("se/sparkle"); // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); - this.pokemonShinyIcon.setTint(tint); - this.pokemonShinyIcon.setVisible(true); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)).setTint(tint).setVisible(true); starterAttributes.shiny = true; } else { @@ -2453,8 +2368,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { }); // Cycle tint based on current sprite tint const tint = getVariantTint(newVariant as Variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); - this.pokemonShinyIcon.setTint(tint); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)).setTint(tint); success = true; } } @@ -2775,56 +2689,64 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.checkIconId(this.starterIcons[index], species, props.female, props.formIndex, props.shiny, props.variant); } - switchMoveHandler(i: number, newMove: MoveId, move: MoveId) { - const speciesId = this.lastSpecies.speciesId; - const existingMoveIndex = this.starterMoveset?.indexOf(newMove)!; // TODO: is this bang correct? - this.starterMoveset![i] = newMove; // TODO: is this bang correct? - if (existingMoveIndex > -1) { - this.starterMoveset![existingMoveIndex] = move; // TODO: is this bang correct? + /** + * Puts a move at the requested index in the current highlighted Pokemon's moveset. + * If the move was already present in the moveset, swap its position with the one at the requested index. + * + * @remarks + * ⚠️ {@linkcode starterMoveset | this.starterMoveset} **must not be null when this method is called** + * @param targetIndex - The index to place the move + * @param newMove - The move to place in the moveset + * @param previousMove - The move that was previously in the spot + */ + switchMoveHandler(targetIndex: number, newMove: MoveId, previousMove: MoveId) { + const starterMoveset = this.starterMoveset; + if (isNullOrUndefined(starterMoveset)) { + console.warn("Trying to update a non-existing moveset"); + return; } - const props: DexAttrProps = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor); + + const speciesId = this.lastSpecies.speciesId; + const existingMoveIndex = starterMoveset.indexOf(newMove); + starterMoveset[targetIndex] = newMove; + if (existingMoveIndex !== -1) { + starterMoveset[existingMoveIndex] = previousMove; + } + const updatedMoveset = starterMoveset.slice() as StarterMoveset; + const formIndex = globalScene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.dexAttrCursor).formIndex; + const starterData = globalScene.gameData.starterData[speciesId]; // species has different forms if (pokemonFormLevelMoves.hasOwnProperty(speciesId)) { - // starterMoveData doesn't have base form moves or is using the single form format - if ( - !globalScene.gameData.starterData[speciesId].moveset || - Array.isArray(globalScene.gameData.starterData[speciesId].moveset) - ) { - globalScene.gameData.starterData[speciesId].moveset = { - [props.formIndex]: this.starterMoveset?.slice(0) as StarterMoveset, - }; - } - const starterMoveData = globalScene.gameData.starterData[speciesId].moveset; - - // starterMoveData doesn't have active form moves - if (!starterMoveData.hasOwnProperty(props.formIndex)) { - globalScene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice( - 0, - ) as StarterMoveset; - } - - // does the species' starter move data have its form's starter moves and has it been updated - if (starterMoveData.hasOwnProperty(props.formIndex)) { - // active form move hasn't been updated - if (starterMoveData[props.formIndex][existingMoveIndex] !== newMove) { - globalScene.gameData.starterData[speciesId].moveset[props.formIndex] = this.starterMoveset?.slice( - 0, - ) as StarterMoveset; - } + // Species has forms with different movesets + if (!starterData.moveset || Array.isArray(starterData.moveset)) { + starterData.moveset = {}; } + starterData.moveset[formIndex] = updatedMoveset; } else { - globalScene.gameData.starterData[speciesId].moveset = this.starterMoveset?.slice(0) as StarterMoveset; + starterData.moveset = updatedMoveset; } this.setSpeciesDetails(this.lastSpecies, { forSeen: false }); - // switch moves of starter if exists - if (this.starterMovesets.length) { - Array.from({ length: this.starterSpecies.length }, (_, i) => { - const starterSpecies = this.starterSpecies[i]; - if (starterSpecies.speciesId === speciesId) { - this.starterMovesets[i] = this.starterMoveset!; // TODO: is this bang correct? - } - }); + this.updateSelectedStarterMoveset(speciesId); + } + + /** + * Update the starter moveset for the given species if it is part of the selected starters. + * + * @remarks + * It is safe to call with a species that is not part of the selected starters. + * + * @param id - The species ID to update the moveset for + */ + private updateSelectedStarterMoveset(id: SpeciesId): void { + if (this.starterMoveset === null) { + return; + } + + for (const [index, species] of this.starterSpecies.entries()) { + if (species.speciesId === id) { + this.starterMovesets[index] = this.starterMoveset; + } } } @@ -2867,12 +2789,14 @@ export class StarterSelectUiHandler extends MessageUiHandler { } else { iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); } - // @ts-expect-error: TODO can iconPath actually be undefined? - iconElement.setTexture(gamepadType, iconPath); - iconElement.setPosition(this.instructionRowX, this.instructionRowY); - controlLabel.setPosition(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY); - iconElement.setVisible(true); - controlLabel.setVisible(true); + // The bang for iconPath is correct as long the cases in the above switch statement handle all `SettingKeyboard` values enabled in touch mode + iconElement + .setTexture(gamepadType, iconPath!) + .setPosition(this.instructionRowX, this.instructionRowY) + .setVisible(true); + controlLabel + .setPosition(this.instructionRowX + this.instructionRowTextOffset, this.instructionRowY) + .setVisible(true); this.instructionsContainer.add([iconElement, controlLabel]); this.instructionRowY += 8; if (this.instructionRowY >= 24) { @@ -2896,11 +2820,13 @@ export class StarterSelectUiHandler extends MessageUiHandler { } else { iconPath = globalScene.inputController?.getIconForLatestInputRecorded(iconSetting); } - iconElement.setTexture(gamepadType, iconPath); - iconElement.setPosition(this.filterInstructionRowX, this.filterInstructionRowY); - controlLabel.setPosition(this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY); - iconElement.setVisible(true); - controlLabel.setVisible(true); + iconElement + .setTexture(gamepadType, iconPath) + .setPosition(this.filterInstructionRowX, this.filterInstructionRowY) + .setVisible(true); + controlLabel + .setPosition(this.filterInstructionRowX + this.instructionRowTextOffset, this.filterInstructionRowY) + .setVisible(true); this.filterInstructionsContainer.add([iconElement, controlLabel]); this.filterInstructionRowY += 8; if (this.filterInstructionRowY >= 24) { @@ -2998,8 +2924,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.filteredStarterContainers = []; this.validStarterContainers = []; + // biome-ignore-start lint/nursery/useIterableCallbackReturn: benign this.pokerusCursorObjs.forEach(cursor => cursor.setVisible(false)); this.starterCursorObjs.forEach(cursor => cursor.setVisible(false)); + // biome-ignore-end lint/nursery/useIterableCallbackReturn: benign this.filterBar.updateFilterLabels(); @@ -3022,7 +2950,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { globalScene.gameData.getSpeciesDexAttrProps(species, tempFormProps), true, ); - allFormsValid = allFormsValid || isValidForChallenge; + allFormsValid ||= isValidForChallenge; } } else { const isValidForChallenge = checkStarterValidForChallenge( @@ -3286,6 +3214,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { override destroy(): void { // Without this the reference gets hung up and no startercontainers get GCd this.starterContainers = []; + /* TODO: Uncomment this once our testing infra supports mocks of `Phaser.GameObject.Group` + this.instructionElemGroup.destroy(true); + */ } updateScroll = () => { @@ -3307,28 +3238,28 @@ export class StarterSelectUiHandler extends MessageUiHandler { container.setVisible(false); if (this.pokerusSpecies.includes(container.species)) { - this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); - this.pokerusCursorObjs[pokerusCursorIndex].setVisible(false); + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1).setVisible(false); pokerusCursorIndex++; } if (this.starterSpecies.includes(container.species)) { - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(false); + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)] + .setPosition(pos.x - 1, pos.y + 1) + .setVisible(false); } return; } container.setVisible(true); if (this.pokerusSpecies.includes(container.species)) { - this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1); - this.pokerusCursorObjs[pokerusCursorIndex].setVisible(true); + this.pokerusCursorObjs[pokerusCursorIndex].setPosition(pos.x - 1, pos.y + 1).setVisible(true); pokerusCursorIndex++; } if (this.starterSpecies.includes(container.species)) { - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setPosition(pos.x - 1, pos.y + 1); - this.starterCursorObjs[this.starterSpecies.indexOf(container.species)].setVisible(true); + this.starterCursorObjs[this.starterSpecies.indexOf(container.species)] + .setPosition(pos.x - 1, pos.y + 1) + .setVisible(true); } const speciesId = container.species.speciesId; @@ -3404,8 +3335,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { ? (this.starterPreferences[species.speciesId].variant as Variant) : defaultProps.variant; const tint = getVariantTint(variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); - this.pokemonShinyIcon.setTint(tint); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)).setTint(tint); this.setSpecies(species); this.updateInstructions(); } @@ -3433,8 +3363,11 @@ export class StarterSelectUiHandler extends MessageUiHandler { } moveStarterIconsCursor(index: number): void { - this.starterIconsCursorObj.x = this.starterIcons[index].x + this.starterIconsCursorXOffset; - this.starterIconsCursorObj.y = this.starterIcons[index].y + this.starterIconsCursorYOffset; + this.starterIconsCursorObj.setPositionRelative( + this.starterIcons[index], + this.starterIconsCursorXOffset, + this.starterIconsCursorYOffset, + ); if (this.starterSpecies.length > 0) { this.starterIconsCursorObj.setVisible(true); this.setSpecies(this.starterSpecies[index]); @@ -3525,9 +3458,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { const colorScheme = starterColors[species.speciesId]; const luck = globalScene.gameData.getDexAttrLuck(this.speciesStarterDexEntry.caughtAttr); - this.pokemonLuckText.setVisible(!!luck); - this.pokemonLuckText.setText(luck.toString()); - this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); + this.pokemonLuckText + .setVisible(!!luck) + .setText(luck.toString()) + .setTint(getVariantTint(Math.min(luck - 1, 2) as Variant)); this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible); //Growth translate @@ -3536,10 +3470,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (i18next.exists("growth:" + growthAux)) { growthReadable = i18next.t(("growth:" + growthAux) as any); } - this.pokemonGrowthRateText.setText(growthReadable); - - this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate)); - this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true)); + this.pokemonGrowthRateText + .setText(growthReadable) + .setColor(getGrowthRateColor(species.growthRate)) + .setShadowColor(getGrowthRateColor(species.growthRate, true)); this.pokemonGrowthRateLabelText.setVisible(true); this.pokemonUncaughtText.setVisible(false); this.pokemonAbilityLabelText.setVisible(true); @@ -3557,16 +3491,13 @@ export class StarterSelectUiHandler extends MessageUiHandler { const defaultProps = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); const variant = defaultProps.variant; const tint = getVariantTint(variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); - this.pokemonShinyIcon.setTint(tint); - this.pokemonShinyIcon.setVisible(defaultProps.shiny); + this.pokemonShinyIcon.setFrame(getVariantIcon(variant)).setTint(tint).setVisible(defaultProps.shiny); this.pokemonCaughtHatchedContainer.setVisible(true); this.pokemonFormText.setVisible(true); if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) { this.pokemonCaughtHatchedContainer.setY(16); - this.pokemonShinyIcon.setY(135); - this.pokemonShinyIcon.setFrame(getVariantIcon(variant)); + this.pokemonShinyIcon.setY(135).setFrame(getVariantIcon(variant)); [this.pokemonCandyContainer, this.pokemonHatchedIcon, this.pokemonHatchedCountText].map(c => c.setVisible(false), ); @@ -3577,7 +3508,6 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonCandyIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[0]))); this.pokemonCandyOverlayIcon.setTint(argbFromRgba(rgbHexToRgba(colorScheme[1]))); this.pokemonCandyCountText.setText(`×${globalScene.gameData.starterData[species.speciesId].candyCount}`); - this.pokemonCandyContainer.setVisible(true); this.pokemonFormText.setY(42); this.pokemonHatchedIcon.setVisible(true); this.pokemonHatchedCountText.setVisible(true); @@ -3586,14 +3516,16 @@ export class StarterSelectUiHandler extends MessageUiHandler { const candyCropY = 16 - 16 * (currentFriendship / friendshipCap); this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY); - this.pokemonCandyContainer.on("pointerover", () => { - globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true); - this.activeTooltip = "CANDY"; - }); - this.pokemonCandyContainer.on("pointerout", () => { - globalScene.ui.hideTooltip(); - this.activeTooltip = undefined; - }); + this.pokemonCandyContainer + .setVisible(true) + .on("pointerover", () => { + globalScene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true); + this.activeTooltip = "CANDY"; + }) + .on("pointerout", () => { + globalScene.ui.hideTooltip(); + this.activeTooltip = undefined; + }); } // Pause the animation when the species is selected @@ -3650,6 +3582,11 @@ export class StarterSelectUiHandler extends MessageUiHandler { }); } + if (!isNullOrUndefined(props.formIndex)) { + // If switching forms while the pokemon is in the team, update its moveset + this.updateSelectedStarterMoveset(species.speciesId); + } + const speciesForm = getPokemonSpeciesForm(species.speciesId, props.formIndex); this.setTypeIcons(speciesForm.type1, speciesForm.type2); @@ -3850,19 +3787,21 @@ export class StarterSelectUiHandler extends MessageUiHandler { const assetLoadCancelled = new BooleanHolder(false); this.assetLoadCancelled = assetLoadCancelled; + female ??= false; if (shouldUpdateSprite) { - species.loadAssets(female!, formIndex, shiny, variant, true).then(() => { - // TODO: is this bang correct? + species.loadAssets(female, formIndex, shiny, variant, true).then(() => { if (assetLoadCancelled.value) { return; } this.assetLoadCancelled = null; this.speciesLoaded.set(species.speciesId, true); - this.pokemonSprite.play(species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? - this.pokemonSprite.setPipelineData("shiny", shiny); - this.pokemonSprite.setPipelineData("variant", variant); - this.pokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female!, formIndex, shiny, variant)); // TODO: is this bang correct? - this.pokemonSprite.setVisible(!this.statsMode); + // Note: Bangs are correct due to `female ??= false` above + this.pokemonSprite + .play(species.getSpriteKey(female!, formIndex, shiny, variant)) + .setPipelineData("shiny", shiny) + .setPipelineData("variant", variant) + .setPipelineData("spriteKey", species.getSpriteKey(female!, formIndex, shiny, variant)) + .setVisible(!this.statsMode); }); } else { this.pokemonSprite.setVisible(!this.statsMode); @@ -3875,7 +3814,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { const starterSprite = currentFilteredContainer.icon as Phaser.GameObjects.Sprite; starterSprite.setTexture( species.getIconAtlasKey(formIndex, shiny, variant), - species.getIconId(female!, formIndex, shiny, variant), + species.getIconId(female, formIndex, shiny, variant), ); currentFilteredContainer.checkIconId(female, formIndex, shiny, variant); } @@ -3921,9 +3860,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (dexEntry.caughtAttr && species.malePercent !== null) { const gender = !female ? Gender.MALE : Gender.FEMALE; - this.pokemonGenderText.setText(getGenderSymbol(gender)); - this.pokemonGenderText.setColor(getGenderColor(gender)); - this.pokemonGenderText.setShadowColor(getGenderColor(gender, true)); + this.pokemonGenderText + .setText(getGenderSymbol(gender)) + .setColor(getGenderColor(gender)) + .setShadowColor(getGenderColor(gender, true)); } else { this.pokemonGenderText.setText(""); } @@ -3935,13 +3875,12 @@ export class StarterSelectUiHandler extends MessageUiHandler { } else { ability = allAbilities[this.lastSpecies.getAbility(abilityIndex!)]; // TODO: is this bang correct? } - this.pokemonAbilityText.setText(ability.name); const isHidden = abilityIndex === (this.lastSpecies.ability2 ? 2 : 1); - this.pokemonAbilityText.setColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD)); - this.pokemonAbilityText.setShadowColor( - this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true), - ); + this.pokemonAbilityText + .setText(ability.name) + .setColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD)) + .setShadowColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true)); const passiveAttr = globalScene.gameData.starterData[species.speciesId].passiveAttr; const passiveAbility = allAbilities[this.lastSpecies.getPassiveAbility(formIndex)]; @@ -3968,14 +3907,16 @@ export class StarterSelectUiHandler extends MessageUiHandler { const textStyle = isUnlocked && isEnabled ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY; const textAlpha = isUnlocked && isEnabled ? 1 : 0.5; - this.pokemonPassiveLabelText.setVisible(true); - this.pokemonPassiveLabelText.setColor(this.getTextColor(TextStyle.SUMMARY_ALT)); - this.pokemonPassiveLabelText.setShadowColor(this.getTextColor(TextStyle.SUMMARY_ALT, true)); - this.pokemonPassiveText.setVisible(true); - this.pokemonPassiveText.setText(passiveAbility.name); - this.pokemonPassiveText.setColor(this.getTextColor(textStyle)); - this.pokemonPassiveText.setAlpha(textAlpha); - this.pokemonPassiveText.setShadowColor(this.getTextColor(textStyle, true)); + this.pokemonPassiveLabelText + .setVisible(true) + .setColor(this.getTextColor(TextStyle.SUMMARY_ALT)) + .setShadowColor(this.getTextColor(TextStyle.SUMMARY_ALT, true)); + this.pokemonPassiveText + .setVisible(true) + .setText(passiveAbility.name) + .setColor(this.getTextColor(textStyle)) + .setAlpha(textAlpha) + .setShadowColor(this.getTextColor(textStyle, true)); if (this.activeTooltip === "PASSIVE") { globalScene.ui.editTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`); @@ -3996,10 +3937,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { x: this.pokemonPassiveText.x + this.pokemonPassiveText.displayWidth + 1, y: this.pokemonPassiveText.y + this.pokemonPassiveText.displayHeight / 2, }; - this.pokemonPassiveDisabledIcon.setVisible(isUnlocked && !isEnabled); - this.pokemonPassiveDisabledIcon.setPosition(iconPosition.x, iconPosition.y); - this.pokemonPassiveLockedIcon.setVisible(!isUnlocked); - this.pokemonPassiveLockedIcon.setPosition(iconPosition.x, iconPosition.y); + this.pokemonPassiveDisabledIcon + .setVisible(isUnlocked && !isEnabled) + .setPosition(iconPosition.x, iconPosition.y); + this.pokemonPassiveLockedIcon.setVisible(!isUnlocked).setPosition(iconPosition.x, iconPosition.y); } else if (this.activeTooltip === "PASSIVE") { // No passive and passive tooltip is active > hide it globalScene.ui.hideTooltip(); @@ -4077,8 +4018,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { } } else { this.shinyOverlay.setVisible(false); - this.pokemonNumberText.setColor(this.getTextColor(TextStyle.SUMMARY)); - this.pokemonNumberText.setShadowColor(this.getTextColor(TextStyle.SUMMARY, true)); + this.pokemonNumberText + .setColor(this.getTextColor(TextStyle.SUMMARY)) + .setShadowColor(this.getTextColor(TextStyle.SUMMARY, true)); this.pokemonGenderText.setText(""); this.pokemonAbilityText.setText(""); this.pokemonPassiveText.setText(""); @@ -4111,8 +4053,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMovesContainer.setVisible(!!this.speciesStarterDexEntry?.caughtAttr && hasEggMoves); - this.pokemonAdditionalMoveCountLabel.setText(`(+${Math.max(this.speciesStarterMoves.length - 4, 0)})`); - this.pokemonAdditionalMoveCountLabel.setVisible(this.speciesStarterMoves.length > 4); + this.pokemonAdditionalMoveCountLabel + .setText(`(+${Math.max(this.speciesStarterMoves.length - 4, 0)})`) + .setVisible(this.speciesStarterMoves.length > 4); this.tryUpdateValue(); @@ -4121,14 +4064,12 @@ export class StarterSelectUiHandler extends MessageUiHandler { setTypeIcons(type1: PokemonType | null, type2: PokemonType | null): void { if (type1 !== null) { - this.type1Icon.setVisible(true); - this.type1Icon.setFrame(PokemonType[type1].toLowerCase()); + this.type1Icon.setVisible(true).setFrame(PokemonType[type1].toLowerCase()); } else { this.type1Icon.setVisible(false); } if (type2 !== null) { - this.type2Icon.setVisible(true); - this.type2Icon.setFrame(PokemonType[type2].toLowerCase()); + this.type2Icon.setVisible(true).setFrame(PokemonType[type2].toLowerCase()); } else { this.type2Icon.setVisible(false); } @@ -4146,17 +4087,18 @@ export class StarterSelectUiHandler extends MessageUiHandler { const species = this.starterSpecies[s]; const currentDexAttr = this.getCurrentDexProps(species.speciesId); const props = globalScene.gameData.getSpeciesDexAttrProps(species, currentDexAttr); - this.starterIcons[s].setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)); - this.starterIcons[s].setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); + this.starterIcons[s] + .setTexture(species.getIconAtlasKey(props.formIndex, props.shiny, props.variant)) + .setFrame(species.getIconId(props.female, props.formIndex, props.shiny, props.variant)); this.checkIconId(this.starterIcons[s], species, props.female, props.formIndex, props.shiny, props.variant); if (s >= index) { - this.starterCursorObjs[s].setPosition(this.starterCursorObjs[s + 1].x, this.starterCursorObjs[s + 1].y); - this.starterCursorObjs[s].setVisible(this.starterCursorObjs[s + 1].visible); + this.starterCursorObjs[s] + .setPosition(this.starterCursorObjs[s + 1].x, this.starterCursorObjs[s + 1].y) + .setVisible(this.starterCursorObjs[s + 1].visible); } } this.starterCursorObjs[this.starterSpecies.length].setVisible(false); - this.starterIcons[this.starterSpecies.length].setTexture("pokemon_icons_0"); - this.starterIcons[this.starterSpecies.length].setFrame("unknown"); + this.starterIcons[this.starterSpecies.length].setTexture("pokemon_icons_0").setFrame("unknown"); if (this.starterIconsCursorObj.visible) { if (this.starterIconsCursorIndex === this.starterSpecies.length) { @@ -4177,7 +4119,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (this.filteredStarterContainers.length > 0) { // Back to the first Pokemon if there is one this.cursorObj.setVisible(true); - this.setCursor(0 + this.scrollCursor * 9); + this.setCursor(this.scrollCursor * 9); } else { // Back to filters this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); @@ -4212,8 +4154,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { break; } if (baseStarterValue - starterValue > 0) { - starter.label.setColor(this.getTextColor(textStyle)); - starter.label.setShadowColor(this.getTextColor(textStyle, true)); + starter.label.setColor(this.getTextColor(textStyle)).setShadowColor(this.getTextColor(textStyle, true)); } } @@ -4232,16 +4173,15 @@ export class StarterSelectUiHandler extends MessageUiHandler { if (newValueStr.startsWith("0.")) { newValueStr = newValueStr.slice(1); } - this.valueLimitLabel.setText(`${newValueStr}/${valueLimit}`); - this.valueLimitLabel.setColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK)); - this.valueLimitLabel.setShadowColor( - this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK, true), - ); + this.valueLimitLabel + .setText(`${newValueStr}/${valueLimit}`) + .setColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK)) + .setShadowColor(this.getTextColor(!overLimit ? TextStyle.TOOLTIP_CONTENT : TextStyle.SUMMARY_PINK, true)); if (overLimit) { globalScene.time.delayedCall(fixedInt(500), () => this.tryUpdateValue()); return false; } - let isPartyValid: boolean = this.isPartyValid(); + let isPartyValid = this.isPartyValid(); if (addingToParty) { const species = this.filteredStarterContainers[this.cursor].species; const isNewPokemonValid = checkStarterValidForChallenge( @@ -4249,7 +4189,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false, ); - isPartyValid = isPartyValid || isNewPokemonValid; + isPartyValid ||= isNewPokemonValid; } /** @@ -4424,7 +4364,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)), false, ); - canStart = canStart || isValidForChallenge; + canStart ||= isValidForChallenge; } return canStart; } @@ -4536,6 +4476,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { } hideInstructions(): void { + // TODO: uncomment this and delete the rest of the method once our testing infra supports mocks of `Phaser.GameObject.Group` + // this.instructionElemGroup.setVisible(false); this.shinyIconElement.setVisible(false); this.shinyLabel.setVisible(false); this.formIconElement.setVisible(false); @@ -4585,8 +4527,9 @@ export class StarterSelectUiHandler extends MessageUiHandler { console.log( `${species.name}'s icon ${icon.frame.name} does not match getIconId with female: ${female}, formIndex: ${formIndex}, shiny: ${shiny}, variant: ${variant}`, ); - icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); - icon.setFrame(species.getIconId(female, formIndex, false, variant)); + icon + .setTexture(species.getIconAtlasKey(formIndex, false, variant)) + .setFrame(species.getIconId(female, formIndex, false, variant)); } } From ce64bad987016bc79841a098d7d0ff6c8e757022 Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Thu, 7 Aug 2025 08:03:46 -0600 Subject: [PATCH 081/106] [Misc] More battler tag fixups (#6194) * More battler tag fixups * Minor fixup for onStatStagesChanged call --- src/data/battler-tags.ts | 42 ++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 455beec6901..1199ac581a6 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2115,8 +2115,8 @@ export class SlowStartTag extends AbilityBattlerTag { export class HighestStatBoostTag extends AbilityBattlerTag { public declare readonly tagType: HighestStatBoostTagType; - public stat: Stat; - public multiplier: number; + public stat: EffectiveStat = Stat.ATK; + public multiplier = 1.3; constructor(tagType: HighestStatBoostTagType, ability: AbilityId) { super(tagType, ability, BattlerTagLapseType.CUSTOM, 1); @@ -2128,28 +2128,28 @@ export class HighestStatBoostTag extends AbilityBattlerTag { */ public override loadTag(source: BaseBattlerTag & Pick): void { super.loadTag(source); - this.stat = source.stat as Stat; + this.stat = source.stat; this.multiplier = source.multiplier; } onAdd(pokemon: Pokemon): void { super.onAdd(pokemon); - let highestStat: EffectiveStat; - EFFECTIVE_STATS.map(s => - pokemon.getEffectiveStat(s, undefined, undefined, undefined, undefined, undefined, undefined, undefined, true), - ).reduce((highestValue: number, value: number, i: number) => { - if (value > highestValue) { - highestStat = EFFECTIVE_STATS[i]; - return value; - } - return highestValue; - }, 0); + const highestStat = EFFECTIVE_STATS.reduce( + (curr: [EffectiveStat, number], stat: EffectiveStat) => { + const value = pokemon.getEffectiveStat(stat, undefined, undefined, true, true, true, false, true, true); + if (value > curr[1]) { + curr[0] = stat; + curr[1] = value; + } + return curr; + }, + [Stat.ATK, 0], + )[0]; - highestStat = highestStat!; // tell TS compiler it's defined! this.stat = highestStat; - this.multiplier = this.stat === Stat.SPD ? 1.5 : 1.3; + this.multiplier = highestStat === Stat.SPD ? 1.5 : 1.3; globalScene.phaseManager.queueMessage( i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), @@ -2614,7 +2614,7 @@ export class IceFaceBlockDamageTag extends FormBlockDamageTag { */ export class CommandedTag extends SerializableBattlerTag { public override readonly tagType = BattlerTagType.COMMANDED; - public readonly tatsugiriFormKey: string; + public readonly tatsugiriFormKey: string = "curly"; constructor(sourceId: number) { super(BattlerTagType.COMMANDED, BattlerTagLapseType.CUSTOM, 0, MoveId.NONE, sourceId); @@ -2668,7 +2668,7 @@ export class StockpilingTag extends SerializableBattlerTag { super(BattlerTagType.STOCKPILING, BattlerTagLapseType.CUSTOM, 1, sourceMove); } - private onStatStagesChanged: StatStageChangeCallback = (_, statsChanged, statChanges) => { + private onStatStagesChanged(_: Pokemon | null, statsChanged: BattleStat[], statChanges: number[]) { const defChange = statChanges[statsChanged.indexOf(Stat.DEF)] ?? 0; const spDefChange = statChanges[statsChanged.indexOf(Stat.SPDEF)] ?? 0; @@ -2678,7 +2678,11 @@ export class StockpilingTag extends SerializableBattlerTag { if (spDefChange) { this.statChangeCounts[Stat.SPDEF]++; } - }; + + // Removed during bundling; used to ensure this method's signature retains parity + // with the `StatStageChangeCallback` type. + this.onStatStagesChanged satisfies StatStageChangeCallback; + } public override loadTag( source: BaseBattlerTag & Pick, @@ -2718,7 +2722,7 @@ export class StockpilingTag extends SerializableBattlerTag { true, false, true, - this.onStatStagesChanged, + this.onStatStagesChanged.bind(this), ); } } From 167e3ae38fd397ca31a616286ade0b540911643d Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 7 Aug 2025 14:03:59 -0400 Subject: [PATCH 082/106] Update locales --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index 7898c0018a7..fa35780fed7 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit 7898c0018a70601a6ead76c9dd497ff966cc2e2a +Subproject commit fa35780fed762017c89d1e9ece8a2779dff56c4d From d7194accdd182ac5082c07291b00fb47ccccb18c Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 7 Aug 2025 17:42:58 -0400 Subject: [PATCH 083/106] [Balance] Minor ME Adjustments and Fixes 1.10 (#6166) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adjusted A Trainer's Test - Adjusted The Expert Pokémon Breeder - Adjusted Trash to Treasure - Adjusted Weird Dream - Reorganized Dark Deal - Adjusted Weird Dream Test --- .../encounters/a-trainers-test-encounter.ts | 8 +- .../encounters/dark-deal-encounter.ts | 27 +++--- .../the-expert-pokemon-breeder-encounter.ts | 84 ++++++++++--------- .../encounters/trash-to-treasure-encounter.ts | 9 +- .../encounters/weird-dream-encounter.ts | 13 +-- .../encounters/weird-dream-encounter.test.ts | 5 +- 6 files changed, 80 insertions(+), 66 deletions(-) diff --git a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts index 5b2805f9310..ac3d4def654 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -63,12 +63,12 @@ export const ATrainersTestEncounter: MysteryEncounter = MysteryEncounterBuilder. break; case 3: trainerType = TrainerType.MIRA; - spriteKeys = getSpriteKeysFromSpecies(SpeciesId.ALAKAZAM, false, 1); + spriteKeys = getSpriteKeysFromSpecies(SpeciesId.ALAKAZAM); trainerNameKey = "mira"; break; case 4: trainerType = TrainerType.RILEY; - spriteKeys = getSpriteKeysFromSpecies(SpeciesId.LUCARIO, false, 1); + spriteKeys = getSpriteKeysFromSpecies(SpeciesId.LUCARIO); trainerNameKey = "riley"; break; default: @@ -164,8 +164,8 @@ export const ATrainersTestEncounter: MysteryEncounter = MysteryEncounterBuilder. encounter.setDialogueToken("eggType", i18next.t(`${namespace}:eggTypes.epic`)); setEncounterRewards( { - guaranteedModifierTypeFuncs: [modifierTypes.SACRED_ASH], - guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA], + guaranteedModifierTypeFuncs: [modifierTypes.RELIC_GOLD], + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], fillRemaining: true, }, [eggOptions], diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 29517ac2531..d90e207cc9a 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -23,12 +23,8 @@ const namespace = "mysteryEncounters/darkDeal"; /** Exclude Ultra Beasts (inludes Cosmog/Solgaleo/Lunala/Necrozma), Paradox (includes Miraidon/Koraidon), Eternatus, and Mythicals */ const excludedBosses = [ - SpeciesId.NECROZMA, - SpeciesId.COSMOG, - SpeciesId.COSMOEM, - SpeciesId.SOLGALEO, - SpeciesId.LUNALA, SpeciesId.ETERNATUS, + /** UBs */ SpeciesId.NIHILEGO, SpeciesId.BUZZWOLE, SpeciesId.PHEROMOSA, @@ -40,6 +36,12 @@ const excludedBosses = [ SpeciesId.NAGANADEL, SpeciesId.STAKATAKA, SpeciesId.BLACEPHALON, + SpeciesId.COSMOG, + SpeciesId.COSMOEM, + SpeciesId.SOLGALEO, + SpeciesId.LUNALA, + SpeciesId.NECROZMA, + /** Paradox */ SpeciesId.GREAT_TUSK, SpeciesId.SCREAM_TAIL, SpeciesId.BRUTE_BONNET, @@ -47,10 +49,10 @@ const excludedBosses = [ SpeciesId.SLITHER_WING, SpeciesId.SANDY_SHOCKS, SpeciesId.ROARING_MOON, - SpeciesId.KORAIDON, SpeciesId.WALKING_WAKE, SpeciesId.GOUGING_FIRE, SpeciesId.RAGING_BOLT, + SpeciesId.KORAIDON, SpeciesId.IRON_TREADS, SpeciesId.IRON_BUNDLE, SpeciesId.IRON_HANDS, @@ -58,22 +60,23 @@ const excludedBosses = [ SpeciesId.IRON_MOTH, SpeciesId.IRON_THORNS, SpeciesId.IRON_VALIANT, - SpeciesId.MIRAIDON, SpeciesId.IRON_LEAVES, SpeciesId.IRON_BOULDER, SpeciesId.IRON_CROWN, + SpeciesId.MIRAIDON, + /** Mythical */ SpeciesId.MEW, SpeciesId.CELEBI, - SpeciesId.DEOXYS, SpeciesId.JIRACHI, - SpeciesId.DARKRAI, + SpeciesId.DEOXYS, SpeciesId.PHIONE, SpeciesId.MANAPHY, - SpeciesId.ARCEUS, + SpeciesId.DARKRAI, SpeciesId.SHAYMIN, + SpeciesId.ARCEUS, SpeciesId.VICTINI, - SpeciesId.MELOETTA, SpeciesId.KELDEO, + SpeciesId.MELOETTA, SpeciesId.GENESECT, SpeciesId.DIANCIE, SpeciesId.HOOPA, @@ -81,9 +84,9 @@ const excludedBosses = [ SpeciesId.MAGEARNA, SpeciesId.MARSHADOW, SpeciesId.ZERAORA, - SpeciesId.ZARUDE, SpeciesId.MELTAN, SpeciesId.MELMETAL, + SpeciesId.ZARUDE, SpeciesId.PECHARUNT, ]; diff --git a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts index 235bd322ef8..7c528e2305b 100644 --- a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts @@ -52,37 +52,6 @@ class BreederSpeciesEvolution { } const POOL_1_POKEMON: (SpeciesId | BreederSpeciesEvolution)[][] = [ - [SpeciesId.MUNCHLAX, new BreederSpeciesEvolution(SpeciesId.SNORLAX, SECOND_STAGE_EVOLUTION_WAVE)], - [ - SpeciesId.HAPPINY, - new BreederSpeciesEvolution(SpeciesId.CHANSEY, FIRST_STAGE_EVOLUTION_WAVE), - new BreederSpeciesEvolution(SpeciesId.BLISSEY, FINAL_STAGE_EVOLUTION_WAVE), - ], - [ - SpeciesId.MAGBY, - new BreederSpeciesEvolution(SpeciesId.MAGMAR, FIRST_STAGE_EVOLUTION_WAVE), - new BreederSpeciesEvolution(SpeciesId.MAGMORTAR, FINAL_STAGE_EVOLUTION_WAVE), - ], - [ - SpeciesId.ELEKID, - new BreederSpeciesEvolution(SpeciesId.ELECTABUZZ, FIRST_STAGE_EVOLUTION_WAVE), - new BreederSpeciesEvolution(SpeciesId.ELECTIVIRE, FINAL_STAGE_EVOLUTION_WAVE), - ], - [SpeciesId.RIOLU, new BreederSpeciesEvolution(SpeciesId.LUCARIO, SECOND_STAGE_EVOLUTION_WAVE)], - [ - SpeciesId.BUDEW, - new BreederSpeciesEvolution(SpeciesId.ROSELIA, FIRST_STAGE_EVOLUTION_WAVE), - new BreederSpeciesEvolution(SpeciesId.ROSERADE, FINAL_STAGE_EVOLUTION_WAVE), - ], - [SpeciesId.TOXEL, new BreederSpeciesEvolution(SpeciesId.TOXTRICITY, SECOND_STAGE_EVOLUTION_WAVE)], - [ - SpeciesId.MIME_JR, - new BreederSpeciesEvolution(SpeciesId.GALAR_MR_MIME, FIRST_STAGE_EVOLUTION_WAVE), - new BreederSpeciesEvolution(SpeciesId.MR_RIME, FINAL_STAGE_EVOLUTION_WAVE), - ], -]; - -const POOL_2_POKEMON: (SpeciesId | BreederSpeciesEvolution)[][] = [ [ SpeciesId.PICHU, new BreederSpeciesEvolution(SpeciesId.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), @@ -93,24 +62,63 @@ const POOL_2_POKEMON: (SpeciesId | BreederSpeciesEvolution)[][] = [ new BreederSpeciesEvolution(SpeciesId.PIKACHU, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(SpeciesId.ALOLA_RAICHU, FINAL_STAGE_EVOLUTION_WAVE), ], - [SpeciesId.SMOOCHUM, new BreederSpeciesEvolution(SpeciesId.JYNX, SECOND_STAGE_EVOLUTION_WAVE)], - [SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONLEE, SECOND_STAGE_EVOLUTION_WAVE)], - [SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONCHAN, SECOND_STAGE_EVOLUTION_WAVE)], - [SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONTOP, SECOND_STAGE_EVOLUTION_WAVE)], [ SpeciesId.IGGLYBUFF, new BreederSpeciesEvolution(SpeciesId.JIGGLYPUFF, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(SpeciesId.WIGGLYTUFF, FINAL_STAGE_EVOLUTION_WAVE), ], + [ + SpeciesId.TOGEPI, + new BreederSpeciesEvolution(SpeciesId.TOGETIC, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(SpeciesId.TOGEKISS, FINAL_STAGE_EVOLUTION_WAVE), + ], + [SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONLEE, SECOND_STAGE_EVOLUTION_WAVE)], + [SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONCHAN, SECOND_STAGE_EVOLUTION_WAVE)], + [SpeciesId.TYROGUE, new BreederSpeciesEvolution(SpeciesId.HITMONTOP, SECOND_STAGE_EVOLUTION_WAVE)], + [SpeciesId.SMOOCHUM, new BreederSpeciesEvolution(SpeciesId.JYNX, FIRST_STAGE_EVOLUTION_WAVE)], [ SpeciesId.AZURILL, new BreederSpeciesEvolution(SpeciesId.MARILL, FIRST_STAGE_EVOLUTION_WAVE), new BreederSpeciesEvolution(SpeciesId.AZUMARILL, FINAL_STAGE_EVOLUTION_WAVE), ], - [SpeciesId.WYNAUT, new BreederSpeciesEvolution(SpeciesId.WOBBUFFET, SECOND_STAGE_EVOLUTION_WAVE)], + [ + SpeciesId.BUDEW, + new BreederSpeciesEvolution(SpeciesId.ROSELIA, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(SpeciesId.ROSERADE, FINAL_STAGE_EVOLUTION_WAVE), + ], [SpeciesId.CHINGLING, new BreederSpeciesEvolution(SpeciesId.CHIMECHO, SECOND_STAGE_EVOLUTION_WAVE)], [SpeciesId.BONSLY, new BreederSpeciesEvolution(SpeciesId.SUDOWOODO, SECOND_STAGE_EVOLUTION_WAVE)], + [SpeciesId.MIME_JR, new BreederSpeciesEvolution(SpeciesId.MR_MIME, SECOND_STAGE_EVOLUTION_WAVE)], + [ + SpeciesId.MIME_JR, + new BreederSpeciesEvolution(SpeciesId.GALAR_MR_MIME, SECOND_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(SpeciesId.MR_RIME, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + SpeciesId.HAPPINY, + new BreederSpeciesEvolution(SpeciesId.CHANSEY, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(SpeciesId.BLISSEY, FINAL_STAGE_EVOLUTION_WAVE), + ], [SpeciesId.MANTYKE, new BreederSpeciesEvolution(SpeciesId.MANTINE, SECOND_STAGE_EVOLUTION_WAVE)], + [SpeciesId.TOXEL, new BreederSpeciesEvolution(SpeciesId.TOXTRICITY, SECOND_STAGE_EVOLUTION_WAVE)], +]; + +const POOL_2_POKEMON: (SpeciesId | BreederSpeciesEvolution)[][] = [ + [SpeciesId.DITTO], + [ + SpeciesId.ELEKID, + new BreederSpeciesEvolution(SpeciesId.ELECTABUZZ, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(SpeciesId.ELECTIVIRE, FINAL_STAGE_EVOLUTION_WAVE), + ], + [ + SpeciesId.MAGBY, + new BreederSpeciesEvolution(SpeciesId.MAGMAR, FIRST_STAGE_EVOLUTION_WAVE), + new BreederSpeciesEvolution(SpeciesId.MAGMORTAR, FINAL_STAGE_EVOLUTION_WAVE), + ], + [SpeciesId.WYNAUT, new BreederSpeciesEvolution(SpeciesId.WOBBUFFET, SECOND_STAGE_EVOLUTION_WAVE)], + [SpeciesId.MUNCHLAX, new BreederSpeciesEvolution(SpeciesId.SNORLAX, SECOND_STAGE_EVOLUTION_WAVE)], + [SpeciesId.RIOLU, new BreederSpeciesEvolution(SpeciesId.LUCARIO, SECOND_STAGE_EVOLUTION_WAVE)], + [SpeciesId.AUDINO], ]; /** @@ -502,7 +510,7 @@ function getPartyConfig(): EnemyPartyConfig { shiny: true, variant: 1, nature: Nature.MODEST, - moveSet: [MoveId.MOONBLAST, MoveId.MYSTICAL_FIRE, MoveId.ICE_BEAM, MoveId.THUNDERBOLT], + moveSet: [MoveId.DAZZLING_GLEAM, MoveId.MYSTICAL_FIRE, MoveId.ICE_BEAM, MoveId.THUNDERBOLT], // Make this one have an item gimmick when we have more items/finish implementations ivs: [31, 31, 31, 31, 31, 31], }, { @@ -515,7 +523,7 @@ function getPartyConfig(): EnemyPartyConfig { shiny: true, variant: 2, nature: Nature.BOLD, - moveSet: [MoveId.TRI_ATTACK, MoveId.STORED_POWER, MoveId.TAKE_HEART, MoveId.MOONLIGHT], + moveSet: [MoveId.TRI_ATTACK, MoveId.STORED_POWER, MoveId.CALM_MIND, MoveId.MOONLIGHT], ivs: [31, 31, 31, 31, 31, 31], }, ); diff --git a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts index 452a9a8bb4b..74a36a280d3 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -13,8 +13,9 @@ import { HitHealModifier, PokemonHeldItemModifier, TurnHealModifier } from "#mod import type { PokemonHeldItemModifierType } from "#modifiers/modifier-type"; import { PokemonMove } from "#moves/pokemon-move"; import { showEncounterText } from "#mystery-encounters/encounter-dialogue-utils"; -import type { EnemyPartyConfig, EnemyPokemonConfig } from "#mystery-encounters/encounter-phase-utils"; import { + type EnemyPartyConfig, + type EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, @@ -23,8 +24,7 @@ import { transitionMysteryEncounterIntroVisuals, } from "#mystery-encounters/encounter-phase-utils"; import { applyModifierTypeToPlayerPokemon } from "#mystery-encounters/encounter-pokemon-utils"; -import type { MysteryEncounter } from "#mystery-encounters/mystery-encounter"; -import { MysteryEncounterBuilder } from "#mystery-encounters/mystery-encounter"; +import { type MysteryEncounter, MysteryEncounterBuilder } from "#mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#mystery-encounters/mystery-encounter-option"; import i18next from "#plugins/i18n"; import { randSeedInt } from "#utils/common"; @@ -200,7 +200,8 @@ export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilde const encounter = globalScene.currentBattle.mysteryEncounter!; setEncounterRewards({ - guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], + guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true, }); encounter.startOfBattleEffects.push( diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 1164d2ca7ca..b4a2ba4abd5 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -47,6 +47,7 @@ const namespace = "mysteryEncounters/weirdDream"; /** Exclude Ultra Beasts, Paradox, Eternatus, and all legendary/mythical/trio pokemon that are below 570 BST */ const EXCLUDED_TRANSFORMATION_SPECIES = [ + SpeciesId.ARCEUS, SpeciesId.ETERNATUS, /** UBs */ SpeciesId.NIHILEGO, @@ -82,20 +83,19 @@ const EXCLUDED_TRANSFORMATION_SPECIES = [ SpeciesId.IRON_BOULDER, SpeciesId.IRON_CROWN, /** These are banned so they don't appear in the < 570 BST pool */ + SpeciesId.PHIONE, + SpeciesId.TYPE_NULL, SpeciesId.COSMOG, + SpeciesId.COSMOEM, SpeciesId.MELTAN, SpeciesId.KUBFU, - SpeciesId.COSMOEM, - SpeciesId.POIPOLE, - SpeciesId.TERAPAGOS, - SpeciesId.TYPE_NULL, - SpeciesId.CALYREX, - SpeciesId.NAGANADEL, SpeciesId.URSHIFU, + SpeciesId.CALYREX, SpeciesId.OGERPON, SpeciesId.OKIDOGI, SpeciesId.MUNKIDORI, SpeciesId.FEZANDIPITI, + SpeciesId.TERAPAGOS, ]; const SUPER_LEGENDARY_BST_THRESHOLD = 600; @@ -226,6 +226,7 @@ export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.wit modifierTypes.MINT, modifierTypes.MINT, modifierTypes.MINT, + modifierTypes.MINT, ], fillRemaining: false, }); diff --git a/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts index e9fcc9797d1..ed0d612e967 100644 --- a/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -147,12 +147,13 @@ describe("Weird Dream - Mystery Encounter", () => { const modifierSelectHandler = scene.ui.handlers.find( h => h instanceof ModifierSelectUiHandler, ) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(5); + expect(modifierSelectHandler.options.length).toEqual(6); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("ROGUE_BALL"); expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("MINT"); expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("MINT"); - expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("MINT"); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.id).toEqual("MINT"); + expect(modifierSelectHandler.options[5].modifierTypeOption.type.id).toEqual("MINT"); }); it("should leave encounter without battle", async () => { From 94650670fd287737785d4da11beb0d514a573d0e Mon Sep 17 00:00:00 2001 From: "Amani H." <109637146+xsn34kzx@users.noreply.github.com> Date: Thu, 7 Aug 2025 20:47:28 -0400 Subject: [PATCH 084/106] [Challenge] Add Nuzlocke-related Challenges (#6186) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Challenge] Add Nuzlocke-related Challenges Co-authored-by: Matilde Simões Co-authored-by: Fuad Ali Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Sirzento * Add Sacred Ash to `revive` Group * Separate Challenge Utility Functions * Misc. Changes * Transition to `BooleanHolder` * Add "Nuzlocke" Achievement * Change Challenge Order * Adjust Nuzlocke Achievement to Include Fresh Start * Fix Infinite Reward Reroll Bug * Fix Party Heal * Minor Change * Adjust TODOs * Add Unit Tests * Tweak Faint Cry in Permanent Faint * Resolve rebase issue * Apply Matthew's Suggestions Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Apply Matthew's Suggestions Pt. 2 Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> * Fix and Lint Suggestions * Revert Accidental Overrides * Fix and Lint Suggestions Pt. 2 * Rename Challenges * Prevent `RandomMoveAttr` from Using Banned Moves * Update Locales --------- Co-authored-by: Matilde Simões Co-authored-by: Fuad Ali Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Sirzento Co-authored-by: Bertie690 <136088738+Bertie690@users.noreply.github.com> --- src/data/challenge.ts | 474 +++++++----------- src/data/moves/move.ts | 14 +- src/data/moves/pokemon-move.ts | 24 +- .../utils/encounter-pokemon-utils.ts | 11 +- src/enums/challenge-type.ts | 42 +- src/enums/challenges.ts | 3 + src/field/pokemon.ts | 20 +- src/game-mode.ts | 16 +- src/modifier/modifier-type.ts | 42 +- src/phases/attempt-capture-phase.ts | 10 + src/phases/command-phase.ts | 28 +- src/phases/party-heal-phase.ts | 11 +- src/phases/select-biome-phase.ts | 10 +- src/phases/select-starter-phase.ts | 2 +- src/phases/victory-phase.ts | 7 +- src/system/achv.ts | 14 + src/system/game-data.ts | 2 +- src/ui/modifier-select-ui-handler.ts | 6 +- src/ui/party-ui-handler.ts | 2 +- src/ui/starter-select-ui-handler.ts | 2 +- src/utils/challenge-utils.ts | 409 +++++++++++++++ test/challenges/hardcore.test.ts | 169 +++++++ test/challenges/limited-catch.test.ts | 55 ++ test/challenges/limited-support.test.ts | 90 ++++ 24 files changed, 1129 insertions(+), 334 deletions(-) create mode 100644 src/utils/challenge-utils.ts create mode 100644 test/challenges/hardcore.test.ts create mode 100644 test/challenges/limited-catch.test.ts create mode 100644 test/challenges/limited-support.test.ts diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 1a1a3774f8f..724d1f302da 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -1,29 +1,26 @@ import type { FixedBattleConfig } from "#app/battle"; import { getRandomTrainerFunc } from "#app/battle"; import { defaultStarterSpecies } from "#app/constants"; -import { globalScene } from "#app/global-scene"; -import { pokemonEvolutions } from "#balance/pokemon-evolutions"; import { speciesStarterCosts } from "#balance/starters"; -import { pokemonFormChanges } from "#data/pokemon-forms"; import type { PokemonSpecies } from "#data/pokemon-species"; import { BattleType } from "#enums/battle-type"; -import { ChallengeType } from "#enums/challenge-type"; import { Challenges } from "#enums/challenges"; import { TypeColor, TypeShadow } from "#enums/color"; import { ClassicFixedBossWaves } from "#enums/fixed-boss-waves"; import { ModifierTier } from "#enums/modifier-tier"; -import type { MoveId } from "#enums/move-id"; +import { MoveId } from "#enums/move-id"; import type { MoveSourceType } from "#enums/move-source-type"; import { Nature } from "#enums/nature"; import { PokemonType } from "#enums/pokemon-type"; import { SpeciesId } from "#enums/species-id"; import { TrainerType } from "#enums/trainer-type"; import { TrainerVariant } from "#enums/trainer-variant"; -import type { Pokemon } from "#field/pokemon"; +import type { EnemyPokemon, PlayerPokemon, Pokemon } from "#field/pokemon"; import { Trainer } from "#field/trainer"; +import type { ModifierTypeOption } from "#modifiers/modifier-type"; import { PokemonMove } from "#moves/pokemon-move"; import type { DexAttrProps, GameData } from "#system/game-data"; -import { BooleanHolder, isBetween, type NumberHolder, randSeedItem } from "#utils/common"; +import { type BooleanHolder, isBetween, type NumberHolder, randSeedItem } from "#utils/common"; import { deepCopy } from "#utils/data"; import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; import { toCamelCase, toSnakeCase } from "#utils/strings"; @@ -341,6 +338,83 @@ export abstract class Challenge { applyFlipStat(_pokemon: Pokemon, _baseStats: number[]) { return false; } + + /** + * An apply function for PARTY_HEAL. Derived classes should alter this. + * @param _status - Whether party healing is enabled or not + * @returns Whether this function did anything + */ + applyPartyHeal(_status: BooleanHolder): boolean { + return false; + } + + /** + * An apply function for SHOP. Derived classes should alter this. + * @param _status - Whether the shop is or is not available after a wave + * @returns Whether this function did anything + */ + applyShop(_status: BooleanHolder) { + return false; + } + + /** + * An apply function for POKEMON_ADD_TO_PARTY. Derived classes should alter this. + * @param _pokemon - The pokemon being caught + * @param _status - Whether the pokemon can be added to the party or not + * @return Whether this function did anything + */ + applyPokemonAddToParty(_pokemon: EnemyPokemon, _status: BooleanHolder): boolean { + return false; + } + + /** + * An apply function for POKEMON_FUSION. Derived classes should alter this. + * @param _pokemon - The pokemon being checked + * @param _status - Whether the selected pokemon is allowed to fuse or not + * @returns Whether this function did anything + */ + applyPokemonFusion(_pokemon: PlayerPokemon, _status: BooleanHolder): boolean { + return false; + } + + /** + * An apply function for POKEMON_MOVE. Derived classes should alter this. + * @param _moveId - The {@linkcode MoveId} being checked + * @param _status - A {@linkcode BooleanHolder} containing the move's usability status + * @returns Whether this function did anything + */ + applyPokemonMove(_moveId: MoveId, _status: BooleanHolder): boolean { + return false; + } + + /** + * An apply function for SHOP_ITEM. Derived classes should alter this. + * @param _shopItem - The item being checked + * @param _status - Whether the item should be added to the shop or not + * @returns Whether this function did anything + */ + applyShopItem(_shopItem: ModifierTypeOption | null, _status: BooleanHolder): boolean { + return false; + } + + /** + * An apply function for WAVE_REWARD. Derived classes should alter this. + * @param _reward - The reward being checked + * @param _status - Whether the reward should be added to the reward options or not + * @returns Whether this function did anything + */ + applyWaveReward(_reward: ModifierTypeOption | null, _status: BooleanHolder): boolean { + return false; + } + + /** + * An apply function for PREVENT_REVIVE. Derived classes should alter this. + * @param _status - Whether fainting is a permanent status or not + * @returns Whether this function did anything + */ + applyPreventRevive(_status: BooleanHolder): boolean { + return false; + } } type ChallengeCondition = (data: GameData) => boolean; @@ -864,208 +938,108 @@ export class LowerStarterPointsChallenge extends Challenge { } /** - * Apply all challenges that modify starter choice. - * @param challengeType {@link ChallengeType} ChallengeType.STARTER_CHOICE - * @param pokemon {@link PokemonSpecies} The pokemon to check the validity of. - * @param valid {@link BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. - * @param dexAttr {@link DexAttrProps} The dex attributes of the pokemon. - * @returns True if any challenge was successfully applied. + * Implements a No Support challenge */ -export function applyChallenges( - challengeType: ChallengeType.STARTER_CHOICE, - pokemon: PokemonSpecies, - valid: BooleanHolder, - dexAttr: DexAttrProps, -): boolean; -/** - * Apply all challenges that modify available total starter points. - * @param challengeType {@link ChallengeType} ChallengeType.STARTER_POINTS - * @param points {@link NumberHolder} The amount of points you have available. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges(challengeType: ChallengeType.STARTER_POINTS, points: NumberHolder): boolean; -/** - * Apply all challenges that modify the cost of a starter. - * @param challengeType {@link ChallengeType} ChallengeType.STARTER_COST - * @param species {@link SpeciesId} The pokemon to change the cost of. - * @param points {@link NumberHolder} The cost of the pokemon. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges( - challengeType: ChallengeType.STARTER_COST, - species: SpeciesId, - cost: NumberHolder, -): boolean; -/** - * Apply all challenges that modify a starter after selection. - * @param challengeType {@link ChallengeType} ChallengeType.STARTER_MODIFY - * @param pokemon {@link Pokemon} The starter pokemon to modify. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges(challengeType: ChallengeType.STARTER_MODIFY, pokemon: Pokemon): boolean; -/** - * Apply all challenges that what pokemon you can have in battle. - * @param challengeType {@link ChallengeType} ChallengeType.POKEMON_IN_BATTLE - * @param pokemon {@link Pokemon} The pokemon to check the validity of. - * @param valid {@link BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges( - challengeType: ChallengeType.POKEMON_IN_BATTLE, - pokemon: Pokemon, - valid: BooleanHolder, -): boolean; -/** - * Apply all challenges that modify what fixed battles there are. - * @param challengeType {@link ChallengeType} ChallengeType.FIXED_BATTLES - * @param waveIndex {@link Number} The current wave index. - * @param battleConfig {@link FixedBattleConfig} The battle config to modify. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges( - challengeType: ChallengeType.FIXED_BATTLES, - waveIndex: number, - battleConfig: FixedBattleConfig, -): boolean; -/** - * Apply all challenges that modify type effectiveness. - * @param challengeType {@linkcode ChallengeType} ChallengeType.TYPE_EFFECTIVENESS - * @param effectiveness {@linkcode NumberHolder} The current effectiveness of the move. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges(challengeType: ChallengeType.TYPE_EFFECTIVENESS, effectiveness: NumberHolder): boolean; -/** - * Apply all challenges that modify what level AI are. - * @param challengeType {@link ChallengeType} ChallengeType.AI_LEVEL - * @param level {@link NumberHolder} The generated level of the pokemon. - * @param levelCap {@link Number} The maximum level cap for the current wave. - * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. - * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges( - challengeType: ChallengeType.AI_LEVEL, - level: NumberHolder, - levelCap: number, - isTrainer: boolean, - isBoss: boolean, -): boolean; -/** - * Apply all challenges that modify how many move slots the AI has. - * @param challengeType {@link ChallengeType} ChallengeType.AI_MOVE_SLOTS - * @param pokemon {@link Pokemon} The pokemon being considered. - * @param moveSlots {@link NumberHolder} The amount of move slots. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges( - challengeType: ChallengeType.AI_MOVE_SLOTS, - pokemon: Pokemon, - moveSlots: NumberHolder, -): boolean; -/** - * Apply all challenges that modify whether a pokemon has its passive. - * @param challengeType {@link ChallengeType} ChallengeType.PASSIVE_ACCESS - * @param pokemon {@link Pokemon} The pokemon to modify. - * @param hasPassive {@link BooleanHolder} Whether it has its passive. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges( - challengeType: ChallengeType.PASSIVE_ACCESS, - pokemon: Pokemon, - hasPassive: BooleanHolder, -): boolean; -/** - * Apply all challenges that modify the game modes settings. - * @param challengeType {@link ChallengeType} ChallengeType.GAME_MODE_MODIFY - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges(challengeType: ChallengeType.GAME_MODE_MODIFY): boolean; -/** - * Apply all challenges that modify what level a pokemon can access a move. - * @param challengeType {@link ChallengeType} ChallengeType.MOVE_ACCESS - * @param pokemon {@link Pokemon} What pokemon would learn the move. - * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. - * @param move {@link MoveId} The move in question. - * @param level {@link NumberHolder} The level threshold for access. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges( - challengeType: ChallengeType.MOVE_ACCESS, - pokemon: Pokemon, - moveSource: MoveSourceType, - move: MoveId, - level: NumberHolder, -): boolean; -/** - * Apply all challenges that modify what weight a pokemon gives to move generation - * @param challengeType {@link ChallengeType} ChallengeType.MOVE_WEIGHT - * @param pokemon {@link Pokemon} What pokemon would learn the move. - * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. - * @param move {@link MoveId} The move in question. - * @param weight {@link NumberHolder} The weight of the move. - * @returns True if any challenge was successfully applied. - */ -export function applyChallenges( - challengeType: ChallengeType.MOVE_WEIGHT, - pokemon: Pokemon, - moveSource: MoveSourceType, - move: MoveId, - weight: NumberHolder, -): boolean; +export class LimitedSupportChallenge extends Challenge { + constructor() { + super(Challenges.LIMITED_SUPPORT, 3); + } -export function applyChallenges(challengeType: ChallengeType.FLIP_STAT, pokemon: Pokemon, baseStats: number[]): boolean; - -export function applyChallenges(challengeType: ChallengeType, ...args: any[]): boolean { - let ret = false; - globalScene.gameMode.challenges.forEach(c => { - if (c.value !== 0) { - switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - ret ||= c.applyStarterChoice(args[0], args[1], args[2]); - break; - case ChallengeType.STARTER_POINTS: - ret ||= c.applyStarterPoints(args[0]); - break; - case ChallengeType.STARTER_COST: - ret ||= c.applyStarterCost(args[0], args[1]); - break; - case ChallengeType.STARTER_MODIFY: - ret ||= c.applyStarterModify(args[0]); - break; - case ChallengeType.POKEMON_IN_BATTLE: - ret ||= c.applyPokemonInBattle(args[0], args[1]); - break; - case ChallengeType.FIXED_BATTLES: - ret ||= c.applyFixedBattle(args[0], args[1]); - break; - case ChallengeType.TYPE_EFFECTIVENESS: - ret ||= c.applyTypeEffectiveness(args[0]); - break; - case ChallengeType.AI_LEVEL: - ret ||= c.applyLevelChange(args[0], args[1], args[2], args[3]); - break; - case ChallengeType.AI_MOVE_SLOTS: - ret ||= c.applyMoveSlot(args[0], args[1]); - break; - case ChallengeType.PASSIVE_ACCESS: - ret ||= c.applyPassiveAccess(args[0], args[1]); - break; - case ChallengeType.GAME_MODE_MODIFY: - ret ||= c.applyGameModeModify(); - break; - case ChallengeType.MOVE_ACCESS: - ret ||= c.applyMoveAccessLevel(args[0], args[1], args[2], args[3]); - break; - case ChallengeType.MOVE_WEIGHT: - ret ||= c.applyMoveWeight(args[0], args[1], args[2], args[3]); - break; - case ChallengeType.FLIP_STAT: - ret ||= c.applyFlipStat(args[0], args[1]); - break; - } + override applyPartyHeal(status: BooleanHolder): boolean { + if (status.value) { + status.value = this.value === 2; + return true; } - }); - return ret; + return false; + } + + override applyShop(status: BooleanHolder): boolean { + if (status.value) { + status.value = this.value === 1; + return true; + } + return false; + } + + static override loadChallenge(source: LimitedSupportChallenge | any): LimitedSupportChallenge { + const newChallenge = new LimitedSupportChallenge(); + newChallenge.value = source.value; + newChallenge.severity = source.severity; + return newChallenge; + } +} + +/** + * Implements a Limited Catch challenge + */ +export class LimitedCatchChallenge extends Challenge { + constructor() { + super(Challenges.LIMITED_CATCH, 1); + } + + override applyPokemonAddToParty(pokemon: EnemyPokemon, status: BooleanHolder): boolean { + if (status.value) { + status.value = pokemon.metWave % 10 === 1; + return true; + } + return false; + } + + static override loadChallenge(source: LimitedCatchChallenge | any): LimitedCatchChallenge { + const newChallenge = new LimitedCatchChallenge(); + newChallenge.value = source.value; + newChallenge.severity = source.severity; + return newChallenge; + } +} + +/** + * Implements a Permanent Faint challenge + */ +export class HardcoreChallenge extends Challenge { + constructor() { + super(Challenges.HARDCORE, 1); + } + + override applyPokemonFusion(pokemon: PlayerPokemon, status: BooleanHolder): boolean { + if (!status.value) { + status.value = pokemon.isFainted(); + return true; + } + return false; + } + + override applyShopItem(shopItem: ModifierTypeOption | null, status: BooleanHolder): boolean { + status.value = shopItem?.type.group !== "revive"; + return true; + } + + override applyWaveReward(reward: ModifierTypeOption | null, status: BooleanHolder): boolean { + return this.applyShopItem(reward, status); + } + + override applyPokemonMove(moveId: MoveId, status: BooleanHolder) { + if (status.value) { + status.value = moveId !== MoveId.REVIVAL_BLESSING; + return true; + } + return false; + } + + override applyPreventRevive(status: BooleanHolder): boolean { + if (!status.value) { + status.value = true; + return true; + } + return false; + } + + static override loadChallenge(source: HardcoreChallenge | any): HardcoreChallenge { + const newChallenge = new HardcoreChallenge(); + newChallenge.value = source.value; + newChallenge.severity = source.severity; + return newChallenge; + } } /** @@ -1089,6 +1063,12 @@ export function copyChallenge(source: Challenge | any): Challenge { return InverseBattleChallenge.loadChallenge(source); case Challenges.FLIP_STAT: return FlipStatChallenge.loadChallenge(source); + case Challenges.LIMITED_CATCH: + return LimitedCatchChallenge.loadChallenge(source); + case Challenges.LIMITED_SUPPORT: + return LimitedSupportChallenge.loadChallenge(source); + case Challenges.HARDCORE: + return HardcoreChallenge.loadChallenge(source); } throw new Error("Unknown challenge copied"); } @@ -1097,87 +1077,13 @@ export const allChallenges: Challenge[] = []; export function initChallenges() { allChallenges.push( + new FreshStartChallenge(), + new HardcoreChallenge(), + new LimitedCatchChallenge(), + new LimitedSupportChallenge(), new SingleGenerationChallenge(), new SingleTypeChallenge(), - new FreshStartChallenge(), new InverseBattleChallenge(), new FlipStatChallenge(), ); } - -/** - * Apply all challenges to the given starter (and form) to check its validity. - * Differs from {@linkcode checkSpeciesValidForChallenge} which only checks form changes. - * @param species - The {@linkcode PokemonSpecies} to check the validity of. - * @param dexAttr - The {@linkcode DexAttrProps | dex attributes} of the species, including its form index. - * @param soft - If `true`, allow it if it could become valid through evolution or form change. - * @returns `true` if the species is considered valid. - */ -export function checkStarterValidForChallenge(species: PokemonSpecies, props: DexAttrProps, soft: boolean) { - if (!soft) { - const isValidForChallenge = new BooleanHolder(true); - applyChallenges(ChallengeType.STARTER_CHOICE, species, isValidForChallenge, props); - return isValidForChallenge.value; - } - // We check the validity of every evolution and form change, and require that at least one is valid - const speciesToCheck = [species.speciesId]; - while (speciesToCheck.length) { - const checking = speciesToCheck.pop(); - // Linter complains if we don't handle this - if (!checking) { - return false; - } - const checkingSpecies = getPokemonSpecies(checking); - if (checkSpeciesValidForChallenge(checkingSpecies, props, true)) { - return true; - } - if (checking && pokemonEvolutions.hasOwnProperty(checking)) { - pokemonEvolutions[checking].forEach(e => { - // Form check to deal with cases such as Basculin -> Basculegion - // TODO: does this miss anything if checking forms of a stage 2 Pokémon? - if (!e?.preFormKey || e.preFormKey === species.forms[props.formIndex].formKey) { - speciesToCheck.push(e.speciesId); - } - }); - } - } - return false; -} - -/** - * Apply all challenges to the given species (and form) to check its validity. - * Differs from {@linkcode checkStarterValidForChallenge} which also checks evolutions. - * @param species - The {@linkcode PokemonSpecies} to check the validity of. - * @param dexAttr - The {@linkcode DexAttrProps | dex attributes} of the species, including its form index. - * @param soft - If `true`, allow it if it could become valid through a form change. - * @returns `true` if the species is considered valid. - */ -function checkSpeciesValidForChallenge(species: PokemonSpecies, props: DexAttrProps, soft: boolean) { - const isValidForChallenge = new BooleanHolder(true); - applyChallenges(ChallengeType.STARTER_CHOICE, species, isValidForChallenge, props); - if (!soft || !pokemonFormChanges.hasOwnProperty(species.speciesId)) { - return isValidForChallenge.value; - } - // If the form in props is valid, return true before checking other form changes - if (soft && isValidForChallenge.value) { - return true; - } - - const result = pokemonFormChanges[species.speciesId].some(f1 => { - // Exclude form changes that require the mon to be on the field to begin with - if (!("item" in f1.trigger)) { - return false; - } - - return species.forms.some((f2, formIndex) => { - if (f1.formKey === f2.formKey) { - const formProps = { ...props, formIndex }; - const isFormValidForChallenge = new BooleanHolder(true); - applyChallenges(ChallengeType.STARTER_CHOICE, species, isFormValidForChallenge, formProps); - return isFormValidForChallenge.value; - } - return false; - }); - }); - return result; -} diff --git a/src/data/moves/move.ts b/src/data/moves/move.ts index 757f57e0b1f..067bd05c2ae 100644 --- a/src/data/moves/move.ts +++ b/src/data/moves/move.ts @@ -22,7 +22,6 @@ import { TypeBoostTag, } from "#data/battler-tags"; import { getBerryEffectFunc } from "#data/berry"; -import { applyChallenges } from "#data/challenge"; import { allAbilities, allMoves } from "#data/data-lists"; import { SpeciesFormChangeRevertWeatherFormTrigger } from "#data/form-change-triggers"; import { DelayedAttackTag } from "#data/positional-tags/positional-tag"; @@ -93,6 +92,7 @@ import { BooleanHolder, type Constructor, isNullOrUndefined, NumberHolder, randS import { getEnumValues } from "#utils/enums"; import { toTitleCase } from "#utils/strings"; import i18next from "i18next"; +import { applyChallenges } from "#utils/challenge-utils"; /** * A function used to conditionally determine execution of a given {@linkcode MoveAttr}. @@ -124,7 +124,7 @@ export abstract class Move implements Localizable { /** * Check if the move is of the given subclass without requiring `instanceof`. * - * ⚠️ Does _not_ work for {@linkcode ChargingAttackMove} and {@linkcode ChargingSelfStatusMove} subclasses. For those, + * ! Does _not_ work for {@linkcode ChargingAttackMove} and {@linkcode ChargingSelfStatusMove} subclasses. For those, * use {@linkcode isChargingMove} instead. * * @param moveKind - The string name of the move to check against @@ -6906,13 +6906,19 @@ export class RandomMoveAttr extends CallMoveAttr { * @param move Move being used * @param args Unused */ - override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + override apply(user: Pokemon, target: Pokemon, _move: Move, args: any[]): boolean { + // TODO: Move this into the constructor to avoid constructing this every call const moveIds = getEnumValues(MoveId).map(m => !this.invalidMoves.has(m) && !allMoves[m].name.endsWith(" (N)") ? m : MoveId.NONE); let moveId: MoveId = MoveId.NONE; + const moveStatus = new BooleanHolder(true); do { moveId = this.getMoveOverride() ?? moveIds[user.randBattleSeedInt(moveIds.length)]; + moveStatus.value = moveId !== MoveId.NONE; + if (user.isPlayer()) { + applyChallenges(ChallengeType.POKEMON_MOVE, moveId, moveStatus); + } } - while (moveId === MoveId.NONE); + while (!moveStatus.value); return super.apply(user, target, allMoves[moveId], args); } } diff --git a/src/data/moves/pokemon-move.ts b/src/data/moves/pokemon-move.ts index d3f68fe9db4..3c96cbea598 100644 --- a/src/data/moves/pokemon-move.ts +++ b/src/data/moves/pokemon-move.ts @@ -1,8 +1,10 @@ import { allMoves } from "#data/data-lists"; -import type { MoveId } from "#enums/move-id"; +import { ChallengeType } from "#enums/challenge-type"; +import { MoveId } from "#enums/move-id"; import type { Pokemon } from "#field/pokemon"; import type { Move } from "#moves/move"; -import { toDmgValue } from "#utils/common"; +import { applyChallenges } from "#utils/challenge-utils"; +import { BooleanHolder, toDmgValue } from "#utils/common"; /** * Wrapper class for the {@linkcode Move} class for Pokemon to interact with. @@ -45,16 +47,18 @@ export class PokemonMove { * @returns Whether this {@linkcode PokemonMove} can be selected by this Pokemon. */ isUsable(pokemon: Pokemon, ignorePp = false, ignoreRestrictionTags = false): boolean { + const move = this.getMove(); // TODO: Add Sky Drop's 1 turn stall - if (this.moveId && !ignoreRestrictionTags && pokemon.isMoveRestricted(this.moveId, pokemon)) { - return false; + const usability = new BooleanHolder( + !move.name.endsWith(" (N)") && + (ignorePp || this.ppUsed < this.getMovePp() || move.pp === -1) && + // TODO: Review if the `MoveId.NONE` check is even necessary anymore + !(this.moveId !== MoveId.NONE && !ignoreRestrictionTags && pokemon.isMoveRestricted(this.moveId, pokemon)), + ); + if (pokemon.isPlayer()) { + applyChallenges(ChallengeType.POKEMON_MOVE, move.id, usability); } - - if (this.getMove().name.endsWith(" (N)")) { - return false; - } - - return ignorePp || this.ppUsed < this.getMovePp() || this.getMove().pp === -1; + return usability.value; } getMove(): Move { diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 19f06707257..7617fb5a89e 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -13,6 +13,7 @@ import { CustomPokemonData } from "#data/pokemon-data"; import type { PokemonSpecies } from "#data/pokemon-species"; import { getStatusEffectCatchRateMultiplier } from "#data/status-effect"; import type { AbilityId } from "#enums/ability-id"; +import { ChallengeType } from "#enums/challenge-type"; import { PlayerGender } from "#enums/player-gender"; import type { PokeballType } from "#enums/pokeball"; import type { PokemonType } from "#enums/pokemon-type"; @@ -33,7 +34,8 @@ import { achvs } from "#system/achv"; import type { PartyOption } from "#ui/party-ui-handler"; import { PartyUiMode } from "#ui/party-ui-handler"; import { SummaryUiMode } from "#ui/summary-ui-handler"; -import { isNullOrUndefined, randSeedInt } from "#utils/common"; +import { applyChallenges } from "#utils/challenge-utils"; +import { BooleanHolder, isNullOrUndefined, randSeedInt } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import i18next from "i18next"; @@ -706,6 +708,13 @@ export async function catchPokemon( }); }; Promise.all([pokemon.hideInfo(), globalScene.gameData.setPokemonCaught(pokemon)]).then(() => { + const addStatus = new BooleanHolder(true); + applyChallenges(ChallengeType.POKEMON_ADD_TO_PARTY, pokemon, addStatus); + if (!addStatus.value) { + removePokemon(); + end(); + return; + } if (globalScene.getPlayerParty().length === 6) { const promptRelease = () => { globalScene.ui.showText( diff --git a/src/enums/challenge-type.ts b/src/enums/challenge-type.ts index d9b1fce3e6e..053bcf92011 100644 --- a/src/enums/challenge-type.ts +++ b/src/enums/challenge-type.ts @@ -65,5 +65,45 @@ export enum ChallengeType { /** * Modifies what the pokemon stats for Flip Stat Mode. */ - FLIP_STAT + FLIP_STAT, + /** + * Challenges which conditionally enable or disable automatic party healing during biome transitions + * @see {@linkcode Challenge.applyPartyHealAvailability} + */ + PARTY_HEAL, + /** + * Challenges which conditionally enable or disable the shop + * @see {@linkcode Challenge.applyShopAvailability} + */ + SHOP, + /** + * Challenges which validate whether a pokemon can be added to the player's party or not + * @see {@linkcode Challenge.applyCatchAvailability} + */ + POKEMON_ADD_TO_PARTY, + /** + * Challenges which validate whether a pokemon is allowed to fuse or not + * @see {@linkcode Challenge.applyFusionAvailability} + */ + POKEMON_FUSION, + /** + * Challenges which validate whether particular moves can or cannot be used + * @see {@linkcode Challenge.applyMoveAvailability} + */ + POKEMON_MOVE, + /** + * Challenges which validate whether particular items are or are not sold in the shop + * @see {@linkcode Challenge.applyShopItems} + */ + SHOP_ITEM, + /** + * Challenges which validate whether particular items will be given as a reward after a wave + * @see {@linkcode Challenge.applyWaveRewards} + */ + WAVE_REWARD, + /** + * Challenges which prevent recovery from fainting + * @see {@linkcode Challenge.applyPermanentFaint} + */ + PREVENT_REVIVE, } diff --git a/src/enums/challenges.ts b/src/enums/challenges.ts index 7b506a61a2f..8d4f4c7a22a 100644 --- a/src/enums/challenges.ts +++ b/src/enums/challenges.ts @@ -6,4 +6,7 @@ export enum Challenges { FRESH_START, INVERSE_BATTLE, FLIP_STAT, + LIMITED_CATCH, + LIMITED_SUPPORT, + HARDCORE, } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index d4f332d887c..bc069aa1fc2 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -39,7 +39,6 @@ import { TrappedTag, TypeImmuneTag, } from "#data/battler-tags"; -import { applyChallenges } from "#data/challenge"; import { allAbilities, allMoves } from "#data/data-lists"; import { getLevelTotalExp } from "#data/exp"; import { @@ -148,6 +147,7 @@ import { EnemyBattleInfo } from "#ui/enemy-battle-info"; import type { PartyOption } from "#ui/party-ui-handler"; import { PartyUiHandler, PartyUiMode } from "#ui/party-ui-handler"; import { PlayerBattleInfo } from "#ui/player-battle-info"; +import { applyChallenges } from "#utils/challenge-utils"; import { BooleanHolder, type Constructor, @@ -4558,8 +4558,17 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } const key = this.species.getCryKey(this.formIndex); - let rate = 0.85; - const cry = globalScene.playSound(key, { rate: rate }) as AnySound; + const crySoundConfig = { rate: 0.85, detune: 0 }; + if (this.isPlayer()) { + // If fainting is permanent, emphasize impact + const preventRevive = new BooleanHolder(false); + applyChallenges(ChallengeType.PREVENT_REVIVE, preventRevive); + if (preventRevive.value) { + crySoundConfig.detune = -100; + crySoundConfig.rate = 0.7; + } + } + const cry = globalScene.playSound(key, crySoundConfig) as AnySound; if (!cry || globalScene.fieldVolume === 0) { callback(); return; @@ -4578,7 +4587,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { delay: fixedInt(delay), repeat: -1, callback: () => { - frameThreshold = sprite.anims.msPerFrame / rate; + frameThreshold = sprite.anims.msPerFrame / crySoundConfig.rate; frameProgress += delay; while (frameProgress > frameThreshold) { if (sprite.anims.duration) { @@ -4588,8 +4597,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { frameProgress -= frameThreshold; } if (cry && !cry.pendingRemove) { - rate *= 0.99; - cry.setRate(rate); + cry.setRate(crySoundConfig.rate * 0.99); } else { faintCryTimer?.destroy(); faintCryTimer = null; diff --git a/src/game-mode.ts b/src/game-mode.ts index c5ab120e218..82f7b4fa77f 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -2,8 +2,7 @@ import { FixedBattleConfig } from "#app/battle"; import { CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES, CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/constants"; import { globalScene } from "#app/global-scene"; import Overrides from "#app/overrides"; -import type { Challenge } from "#data/challenge"; -import { allChallenges, applyChallenges, copyChallenge } from "#data/challenge"; +import { allChallenges, type Challenge, copyChallenge } from "#data/challenge"; import { getDailyStartingBiome } from "#data/daily-run"; import { allSpecies } from "#data/data-lists"; import type { PokemonSpecies } from "#data/pokemon-species"; @@ -14,7 +13,8 @@ import { GameModes } from "#enums/game-modes"; import { SpeciesId } from "#enums/species-id"; import type { Arena } from "#field/arena"; import { classicFixedBattles, type FixedBattleConfigs } from "#trainers/fixed-battle-configs"; -import { isNullOrUndefined, randSeedInt, randSeedItem } from "#utils/common"; +import { applyChallenges } from "#utils/challenge-utils"; +import { BooleanHolder, isNullOrUndefined, randSeedInt, randSeedItem } from "#utils/common"; import i18next from "i18next"; interface GameModeConfig { @@ -311,6 +311,16 @@ export class GameMode implements GameModeConfig { return this.battleConfig[waveIndex]; } + /** + * Check if the current game mode has the shop enabled or not + * @returns Whether the shop is available in the current mode + */ + public getShopStatus(): boolean { + const status = new BooleanHolder(!this.hasNoShop); + applyChallenges(ChallengeType.SHOP, status); + return status.value; + } + getClearScoreBonus(): number { switch (this.modeId) { case GameModes.CLASSIC: diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index b359ec756e6..9ec9ee0ad48 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -14,6 +14,7 @@ import { pokemonFormChanges, SpeciesFormChangeCondition } from "#data/pokemon-fo import { getStatusEffectDescriptor } from "#data/status-effect"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; +import { ChallengeType } from "#enums/challenge-type"; import { FormChangeItem } from "#enums/form-change-item"; import { ModifierPoolType } from "#enums/modifier-pool-type"; import { ModifierTier } from "#enums/modifier-tier"; @@ -116,7 +117,16 @@ import type { ModifierTypeFunc, WeightedModifierTypeWeightFunc } from "#types/mo import type { PokemonMoveSelectFilter, PokemonSelectFilter } from "#ui/party-ui-handler"; import { PartyUiHandler } from "#ui/party-ui-handler"; import { getModifierTierTextTint } from "#ui/text"; -import { formatMoney, isNullOrUndefined, NumberHolder, padInt, randSeedInt, randSeedItem } from "#utils/common"; +import { applyChallenges } from "#utils/challenge-utils"; +import { + BooleanHolder, + formatMoney, + isNullOrUndefined, + NumberHolder, + padInt, + randSeedInt, + randSeedItem, +} from "#utils/common"; import { getEnumKeys, getEnumValues } from "#utils/enums"; import { getModifierPoolForType, getModifierType } from "#utils/modifier-utils"; import i18next from "i18next"; @@ -533,7 +543,9 @@ export class PokemonReviveModifierType extends PokemonHpRestoreModifierType { ); this.selectFilter = (pokemon: PlayerPokemon) => { - if (pokemon.hp) { + const selectStatus = new BooleanHolder(pokemon.hp !== 0); + applyChallenges(ChallengeType.PREVENT_REVIVE, selectStatus); + if (selectStatus.value) { return PartyUiHandler.NoEffectMessage; } return null; @@ -1011,6 +1023,7 @@ class AllPokemonFullReviveModifierType extends AllPokemonFullHpRestoreModifierTy "modifierType:ModifierType.AllPokemonFullReviveModifierType", (_type, _args) => new PokemonHpRestoreModifier(this, -1, 0, 100, false, true), ); + this.group = "revive"; } } @@ -1262,7 +1275,9 @@ export class FusePokemonModifierType extends PokemonModifierType { iconImage, (_type, args) => new FusePokemonModifier(this, (args[0] as PlayerPokemon).id, (args[1] as PlayerPokemon).id), (pokemon: PlayerPokemon) => { - if (pokemon.isFusion()) { + const selectStatus = new BooleanHolder(pokemon.isFusion()); + applyChallenges(ChallengeType.POKEMON_FUSION, pokemon, selectStatus); + if (selectStatus.value) { return PartyUiHandler.NoEffectMessage; } return null; @@ -2574,11 +2589,15 @@ function getModifierTypeOptionWithRetry( ): ModifierTypeOption { allowLuckUpgrades = allowLuckUpgrades ?? true; let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, tier, undefined, 0, allowLuckUpgrades); + const candidateValidity = new BooleanHolder(true); + applyChallenges(ChallengeType.WAVE_REWARD, candidate, candidateValidity); let r = 0; while ( - existingOptions.length && - ++r < retryCount && - existingOptions.filter(o => o.type.name === candidate?.type.name || o.type.group === candidate?.type.group).length + (existingOptions.length && + ++r < retryCount && + existingOptions.filter(o => o.type.name === candidate?.type.name || o.type.group === candidate?.type.group) + .length) || + !candidateValidity.value ) { candidate = getNewModifierTypeOption( party, @@ -2588,6 +2607,7 @@ function getModifierTypeOptionWithRetry( 0, allowLuckUpgrades, ); + applyChallenges(ChallengeType.WAVE_REWARD, candidate, candidateValidity); } return candidate!; } @@ -2648,7 +2668,15 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: number, baseC [new ModifierTypeOption(modifierTypeInitObj.FULL_RESTORE(), 0, baseCost * 2.25)], [new ModifierTypeOption(modifierTypeInitObj.SACRED_ASH(), 0, baseCost * 10)], ]; - return options.slice(0, Math.ceil(Math.max(waveIndex + 10, 0) / 30)).flat(); + + return options + .slice(0, Math.ceil(Math.max(waveIndex + 10, 0) / 30)) + .flat() + .filter(shopItem => { + const status = new BooleanHolder(true); + applyChallenges(ChallengeType.SHOP_ITEM, shopItem, status); + return status.value; + }); } export function getEnemyBuffModifierForWave( diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index fcddd23dd20..aea39cff294 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -12,6 +12,7 @@ import { } from "#data/pokeball"; import { getStatusEffectCatchRateMultiplier } from "#data/status-effect"; import { BattlerIndex } from "#enums/battler-index"; +import { ChallengeType } from "#enums/challenge-type"; import type { PokeballType } from "#enums/pokeball"; import { StatusEffect } from "#enums/status-effect"; import { UiMode } from "#enums/ui-mode"; @@ -23,6 +24,8 @@ import { achvs } from "#system/achv"; import type { PartyOption } from "#ui/party-ui-handler"; import { PartyUiMode } from "#ui/party-ui-handler"; import { SummaryUiMode } from "#ui/summary-ui-handler"; +import { applyChallenges } from "#utils/challenge-utils"; +import { BooleanHolder } from "#utils/common"; import i18next from "i18next"; // TODO: Refactor and split up to allow for overriding capture chance @@ -287,6 +290,13 @@ export class AttemptCapturePhase extends PokemonPhase { }); }; Promise.all([pokemon.hideInfo(), globalScene.gameData.setPokemonCaught(pokemon)]).then(() => { + const addStatus = new BooleanHolder(true); + applyChallenges(ChallengeType.POKEMON_ADD_TO_PARTY, pokemon, addStatus); + if (!addStatus.value) { + removePokemon(); + end(); + return; + } if (globalScene.getPlayerParty().length === PLAYER_PARTY_MAX_SIZE) { const promptRelease = () => { globalScene.ui.showText( diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index 016d4ff5d3b..c7eb466157d 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -9,6 +9,7 @@ import { ArenaTagType } from "#enums/arena-tag-type"; import { BattleType } from "#enums/battle-type"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BiomeId } from "#enums/biome-id"; +import { ChallengeType } from "#enums/challenge-type"; import { Command } from "#enums/command"; import { FieldPosition } from "#enums/field-position"; import { MoveId } from "#enums/move-id"; @@ -21,6 +22,8 @@ import type { MoveTargetSet } from "#moves/move"; import { getMoveTargets } from "#moves/move-utils"; import { FieldPhase } from "#phases/field-phase"; import type { TurnMove } from "#types/turn-move"; +import { applyChallenges } from "#utils/challenge-utils"; +import { BooleanHolder } from "#utils/common"; import i18next from "i18next"; export class CommandPhase extends FieldPhase { @@ -210,16 +213,27 @@ export class CommandPhase extends FieldPhase { const move = user.getMoveset()[cursor]; globalScene.ui.setMode(UiMode.MESSAGE); - // Decides between a Disabled, Not Implemented, or No PP translation message - const errorMessage = user.isMoveRestricted(move.moveId, user) - ? user.getRestrictingTag(move.moveId, user)!.selectionDeniedText(user, move.moveId) - : move.getName().endsWith(" (N)") - ? "battle:moveNotImplemented" - : "battle:moveNoPP"; + // Set the translation key for why the move cannot be selected + let cannotSelectKey: string; + const moveStatus = new BooleanHolder(true); + applyChallenges(ChallengeType.POKEMON_MOVE, move.moveId, moveStatus); + if (!moveStatus.value) { + cannotSelectKey = "battle:moveCannotUseChallenge"; + } else if (move.getPpRatio() === 0) { + cannotSelectKey = "battle:moveNoPP"; + } else if (move.getName().endsWith(" (N)")) { + cannotSelectKey = "battle:moveNotImplemented"; + } else if (user.isMoveRestricted(move.moveId, user)) { + cannotSelectKey = user.getRestrictingTag(move.moveId, user)!.selectionDeniedText(user, move.moveId); + } else { + // TODO: Consider a message that signals a being unusable for an unknown reason + cannotSelectKey = ""; + } + const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator globalScene.ui.showText( - i18next.t(errorMessage, { moveName: moveName }), + i18next.t(cannotSelectKey, { moveName: moveName }), null, () => { globalScene.ui.clearText(); diff --git a/src/phases/party-heal-phase.ts b/src/phases/party-heal-phase.ts index 80d8b315102..1030d5eb9d9 100644 --- a/src/phases/party-heal-phase.ts +++ b/src/phases/party-heal-phase.ts @@ -1,6 +1,8 @@ import { globalScene } from "#app/global-scene"; +import { ChallengeType } from "#enums/challenge-type"; import { BattlePhase } from "#phases/battle-phase"; -import { fixedInt } from "#utils/common"; +import { applyChallenges } from "#utils/challenge-utils"; +import { BooleanHolder, fixedInt } from "#utils/common"; export class PartyHealPhase extends BattlePhase { public readonly phaseName = "PartyHealPhase"; @@ -20,7 +22,14 @@ export class PartyHealPhase extends BattlePhase { globalScene.fadeOutBgm(1000, false); } globalScene.ui.fadeOut(1000).then(() => { + const preventRevive = new BooleanHolder(false); + applyChallenges(ChallengeType.PREVENT_REVIVE, preventRevive); for (const pokemon of globalScene.getPlayerParty()) { + // Prevent reviving fainted pokemon during certain challenges + if (pokemon.isFainted() && preventRevive.value) { + continue; + } + pokemon.hp = pokemon.getMaxHp(); pokemon.resetStatus(true, false, false, true); for (const move of pokemon.moveset) { diff --git a/src/phases/select-biome-phase.ts b/src/phases/select-biome-phase.ts index ab96bf5c45e..f4fd11636fc 100644 --- a/src/phases/select-biome-phase.ts +++ b/src/phases/select-biome-phase.ts @@ -1,11 +1,13 @@ import { globalScene } from "#app/global-scene"; import { biomeLinks, getBiomeName } from "#balance/biomes"; import { BiomeId } from "#enums/biome-id"; +import { ChallengeType } from "#enums/challenge-type"; import { UiMode } from "#enums/ui-mode"; import { MapModifier, MoneyInterestModifier } from "#modifiers/modifier"; import { BattlePhase } from "#phases/battle-phase"; import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; -import { randSeedInt } from "#utils/common"; +import { applyChallenges } from "#utils/challenge-utils"; +import { BooleanHolder, randSeedInt } from "#utils/common"; export class SelectBiomePhase extends BattlePhase { public readonly phaseName = "SelectBiomePhase"; @@ -20,7 +22,11 @@ export class SelectBiomePhase extends BattlePhase { const setNextBiome = (nextBiome: BiomeId) => { if (nextWaveIndex % 10 === 1) { globalScene.applyModifiers(MoneyInterestModifier, true); - globalScene.phaseManager.unshiftNew("PartyHealPhase", false); + const healStatus = new BooleanHolder(true); + applyChallenges(ChallengeType.PARTY_HEAL, healStatus); + if (healStatus.value) { + globalScene.phaseManager.unshiftNew("PartyHealPhase", false); + } } globalScene.phaseManager.unshiftNew("SwitchBiomePhase", nextBiome); this.end(); diff --git a/src/phases/select-starter-phase.ts b/src/phases/select-starter-phase.ts index d6bd252c77d..ef3fa74bd44 100644 --- a/src/phases/select-starter-phase.ts +++ b/src/phases/select-starter-phase.ts @@ -1,7 +1,6 @@ import { globalScene } from "#app/global-scene"; import Overrides from "#app/overrides"; import { Phase } from "#app/phase"; -import { applyChallenges } from "#data/challenge"; import { SpeciesFormChangeMoveLearnedTrigger } from "#data/form-change-triggers"; import { Gender } from "#data/gender"; import { ChallengeType } from "#enums/challenge-type"; @@ -10,6 +9,7 @@ import { UiMode } from "#enums/ui-mode"; import { overrideHeldItems, overrideModifiers } from "#modifiers/modifier"; import { SaveSlotUiMode } from "#ui/save-slot-select-ui-handler"; import type { Starter } from "#ui/starter-select-ui-handler"; +import { applyChallenges } from "#utils/challenge-utils"; import { isNullOrUndefined } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; diff --git a/src/phases/victory-phase.ts b/src/phases/victory-phase.ts index 4b1a79d7443..c0f4a32d7e1 100644 --- a/src/phases/victory-phase.ts +++ b/src/phases/victory-phase.ts @@ -3,10 +3,13 @@ import { globalScene } from "#app/global-scene"; import { modifierTypes } from "#data/data-lists"; import { BattleType } from "#enums/battle-type"; import type { BattlerIndex } from "#enums/battler-index"; +import { ChallengeType } from "#enums/challenge-type"; import { ClassicFixedBossWaves } from "#enums/fixed-boss-waves"; import type { CustomModifierSettings } from "#modifiers/modifier-type"; import { handleMysteryEncounterVictory } from "#mystery-encounters/encounter-phase-utils"; import { PokemonPhase } from "#phases/pokemon-phase"; +import { applyChallenges } from "#utils/challenge-utils"; +import { BooleanHolder } from "#utils/common"; export class VictoryPhase extends PokemonPhase { public readonly phaseName = "VictoryPhase"; @@ -63,7 +66,9 @@ export class VictoryPhase extends PokemonPhase { break; } } - if (globalScene.currentBattle.waveIndex % 10) { + const healStatus = new BooleanHolder(globalScene.currentBattle.waveIndex % 10 === 0); + applyChallenges(ChallengeType.PARTY_HEAL, healStatus); + if (!healStatus.value) { globalScene.phaseManager.pushNew( "SelectModifierPhase", undefined, diff --git a/src/system/achv.ts b/src/system/achv.ts index 69eade02e35..383d07252e6 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -5,6 +5,7 @@ import { FlipStatChallenge, FreshStartChallenge, InverseBattleChallenge, + LimitedCatchChallenge, SingleGenerationChallenge, SingleTypeChallenge, } from "#data/challenge"; @@ -922,6 +923,19 @@ export const achvs = { c.value > 0 && globalScene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0), ).setSecret(), + // TODO: Decide on icon + NUZLOCKE: new ChallengeAchv( + "NUZLOCKE", + "", + "NUZLOCKE.description", + "leaf_stone", + 100, + c => + c instanceof LimitedCatchChallenge && + c.value > 0 && + globalScene.gameMode.challenges.some(c => c.id === Challenges.HARDCORE && c.value > 0) && + globalScene.gameMode.challenges.some(c => c.id === Challenges.FRESH_START && c.value > 0), + ), BREEDERS_IN_SPACE: new Achv("BREEDERS_IN_SPACE", "", "BREEDERS_IN_SPACE.description", "moon_stone", 50).setSecret(), }; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index d899afa19ef..ae559072e35 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -11,7 +11,6 @@ import { speciesEggMoves } from "#balance/egg-moves"; import { pokemonPrevolutions } from "#balance/pokemon-evolutions"; import { speciesStarterCosts } from "#balance/starters"; import { ArenaTrapTag } from "#data/arena-tag"; -import { applyChallenges } from "#data/challenge"; import { allMoves, allSpecies } from "#data/data-lists"; import type { Egg } from "#data/egg"; import { pokemonFormChanges } from "#data/pokemon-forms"; @@ -63,6 +62,7 @@ import { VoucherType, vouchers } from "#system/voucher"; import { trainerConfigs } from "#trainers/trainer-config"; import type { DexData, DexEntry } from "#types/dex-data"; import { RUN_HISTORY_LIMIT } from "#ui/run-history-ui-handler"; +import { applyChallenges } from "#utils/challenge-utils"; import { executeIf, fixedInt, isLocal, NumberHolder, randInt, randSeedItem } from "#utils/common"; import { decrypt, encrypt } from "#utils/data"; import { getEnumKeys } from "#utils/enums"; diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 16eecf6993d..d90b3310fb0 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -209,10 +209,10 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { this.updateRerollCostText(); const typeOptions = args[1] as ModifierTypeOption[]; - const removeHealShop = globalScene.gameMode.hasNoShop; + const hasShop = globalScene.gameMode.getShopStatus(); const baseShopCost = new NumberHolder(globalScene.getWaveMoneyAmount(1)); globalScene.applyModifier(HealShopCostModifier, true, baseShopCost); - const shopTypeOptions = !removeHealShop + const shopTypeOptions = hasShop ? getPlayerShopModifierTypeOptionsForWave(globalScene.currentBattle.waveIndex, baseShopCost.value) : []; const optionsYOffset = @@ -370,7 +370,7 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { if (globalScene.shopCursorTarget === ShopCursorTarget.CHECK_TEAM) { this.setRowCursor(0); this.setCursor(2); - } else if (globalScene.shopCursorTarget === ShopCursorTarget.SHOP && globalScene.gameMode.hasNoShop) { + } else if (globalScene.shopCursorTarget === ShopCursorTarget.SHOP && !hasShop) { this.setRowCursor(ShopCursorTarget.REWARDS); this.setCursor(0); } else { diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 0337e487200..c50065e5812 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1,7 +1,6 @@ import { globalScene } from "#app/global-scene"; import { getPokemonNameWithAffix } from "#app/messages"; import { pokemonEvolutions } from "#balance/pokemon-evolutions"; -import { applyChallenges } from "#data/challenge"; import { allMoves } from "#data/data-lists"; import { SpeciesFormChangeItemTrigger } from "#data/form-change-triggers"; import { Gender, getGenderColor, getGenderSymbol } from "#data/gender"; @@ -26,6 +25,7 @@ import { MoveInfoOverlay } from "#ui/move-info-overlay"; import { PokemonIconAnimHandler, PokemonIconAnimMode } from "#ui/pokemon-icon-anim-handler"; import { addBBCodeTextObject, addTextObject, getTextColor } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; +import { applyChallenges } from "#utils/challenge-utils"; import { BooleanHolder, getLocalizedSpriteKey, randInt } from "#utils/common"; import { toTitleCase } from "#utils/strings"; import i18next from "i18next"; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 5a8e6b803a8..0827d5dd697 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -16,7 +16,6 @@ import { POKERUS_STARTER_COUNT, speciesStarterCosts, } from "#balance/starters"; -import { applyChallenges, checkStarterValidForChallenge } from "#data/challenge"; import { allAbilities, allMoves, allSpecies } from "#data/data-lists"; import { Egg, getEggTierForSpecies } from "#data/egg"; import { GrowthRate, getGrowthRateColor } from "#data/exp"; @@ -59,6 +58,7 @@ import { StarterContainer } from "#ui/starter-container"; import { StatsContainer } from "#ui/stats-container"; import { addBBCodeTextObject, addTextObject } from "#ui/text"; import { addWindow } from "#ui/ui-theme"; +import { applyChallenges, checkStarterValidForChallenge } from "#utils/challenge-utils"; import { BooleanHolder, fixedInt, diff --git a/src/utils/challenge-utils.ts b/src/utils/challenge-utils.ts new file mode 100644 index 00000000000..43297027e04 --- /dev/null +++ b/src/utils/challenge-utils.ts @@ -0,0 +1,409 @@ +import type { FixedBattleConfig } from "#app/battle"; +import { globalScene } from "#app/global-scene"; +import { pokemonEvolutions } from "#balance/pokemon-evolutions"; +import { pokemonFormChanges } from "#data/pokemon-forms"; +import type { PokemonSpecies } from "#data/pokemon-species"; +import { ChallengeType } from "#enums/challenge-type"; +import type { MoveId } from "#enums/move-id"; +import type { MoveSourceType } from "#enums/move-source-type"; +import type { SpeciesId } from "#enums/species-id"; +import type { EnemyPokemon, PlayerPokemon, Pokemon } from "#field/pokemon"; +import type { ModifierTypeOption } from "#modifiers/modifier-type"; +import type { DexAttrProps } from "#system/game-data"; +import { BooleanHolder, type NumberHolder } from "./common"; +import { getPokemonSpecies } from "./pokemon-utils"; + +/** + * @param challengeType - {@linkcode ChallengeType.STARTER_CHOICE} + * @param pokemon - The {@linkcode PokemonSpecies} to check the validity of + * @param valid - A {@linkcode BooleanHolder} holding the checked species' validity; + * will be set to `false` if the species is disallowed + * @param dexAttr - The {@linkcode DexAttrProps | Dex attributes} of the species + * @returns `true` if any challenge was successfully applied + */ +export function applyChallenges( + challengeType: ChallengeType.STARTER_CHOICE, + pokemon: PokemonSpecies, + valid: BooleanHolder, + dexAttr: DexAttrProps, +): boolean; +/** + * Apply all challenges that modify available total starter points. + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_POINTS + * @param points {@link NumberHolder} The amount of points you have available. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(challengeType: ChallengeType.STARTER_POINTS, points: NumberHolder): boolean; +/** + * Apply all challenges that modify the cost of a starter. + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_COST + * @param species {@link SpeciesId} The pokemon to change the cost of. + * @param points {@link NumberHolder} The cost of the pokemon. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges( + challengeType: ChallengeType.STARTER_COST, + species: SpeciesId, + cost: NumberHolder, +): boolean; +/** + * Apply all challenges that modify a starter after selection. + * @param challengeType {@link ChallengeType} ChallengeType.STARTER_MODIFY + * @param pokemon {@link Pokemon} The starter pokemon to modify. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(challengeType: ChallengeType.STARTER_MODIFY, pokemon: Pokemon): boolean; +/** + * Apply all challenges that what pokemon you can have in battle. + * @param challengeType {@link ChallengeType} ChallengeType.POKEMON_IN_BATTLE + * @param pokemon {@link Pokemon} The pokemon to check the validity of. + * @param valid {@link BooleanHolder} A BooleanHolder, the value gets set to false if the pokemon isn't allowed. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges( + challengeType: ChallengeType.POKEMON_IN_BATTLE, + pokemon: Pokemon, + valid: BooleanHolder, +): boolean; +/** + * Apply all challenges that modify what fixed battles there are. + * @param challengeType {@link ChallengeType} ChallengeType.FIXED_BATTLES + * @param waveIndex {@link Number} The current wave index. + * @param battleConfig {@link FixedBattleConfig} The battle config to modify. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges( + challengeType: ChallengeType.FIXED_BATTLES, + waveIndex: number, + battleConfig: FixedBattleConfig, +): boolean; +/** + * Apply all challenges that modify type effectiveness. + * @param challengeType {@linkcode ChallengeType} ChallengeType.TYPE_EFFECTIVENESS + * @param effectiveness {@linkcode NumberHolder} The current effectiveness of the move. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(challengeType: ChallengeType.TYPE_EFFECTIVENESS, effectiveness: NumberHolder): boolean; +/** + * Apply all challenges that modify what level AI are. + * @param challengeType {@link ChallengeType} ChallengeType.AI_LEVEL + * @param level {@link NumberHolder} The generated level of the pokemon. + * @param levelCap {@link Number} The maximum level cap for the current wave. + * @param isTrainer {@link Boolean} Whether this is a trainer pokemon. + * @param isBoss {@link Boolean} Whether this is a non-trainer boss pokemon. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges( + challengeType: ChallengeType.AI_LEVEL, + level: NumberHolder, + levelCap: number, + isTrainer: boolean, + isBoss: boolean, +): boolean; +/** + * Apply all challenges that modify how many move slots the AI has. + * @param challengeType {@link ChallengeType} ChallengeType.AI_MOVE_SLOTS + * @param pokemon {@link Pokemon} The pokemon being considered. + * @param moveSlots {@link NumberHolder} The amount of move slots. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges( + challengeType: ChallengeType.AI_MOVE_SLOTS, + pokemon: Pokemon, + moveSlots: NumberHolder, +): boolean; +/** + * Apply all challenges that modify whether a pokemon has its passive. + * @param challengeType {@link ChallengeType} ChallengeType.PASSIVE_ACCESS + * @param pokemon {@link Pokemon} The pokemon to modify. + * @param hasPassive {@link BooleanHolder} Whether it has its passive. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges( + challengeType: ChallengeType.PASSIVE_ACCESS, + pokemon: Pokemon, + hasPassive: BooleanHolder, +): boolean; +/** + * Apply all challenges that modify the game modes settings. + * @param challengeType {@link ChallengeType} ChallengeType.GAME_MODE_MODIFY + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges(challengeType: ChallengeType.GAME_MODE_MODIFY): boolean; +/** + * Apply all challenges that modify what level a pokemon can access a move. + * @param challengeType {@link ChallengeType} ChallengeType.MOVE_ACCESS + * @param pokemon {@link Pokemon} What pokemon would learn the move. + * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. + * @param move {@link MoveId} The move in question. + * @param level {@link NumberHolder} The level threshold for access. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges( + challengeType: ChallengeType.MOVE_ACCESS, + pokemon: Pokemon, + moveSource: MoveSourceType, + move: MoveId, + level: NumberHolder, +): boolean; +/** + * Apply all challenges that modify what weight a pokemon gives to move generation + * @param challengeType {@link ChallengeType} ChallengeType.MOVE_WEIGHT + * @param pokemon {@link Pokemon} What pokemon would learn the move. + * @param moveSource {@link MoveSourceType} What source the pokemon would get the move from. + * @param move {@link MoveId} The move in question. + * @param weight {@link NumberHolder} The weight of the move. + * @returns True if any challenge was successfully applied. + */ +export function applyChallenges( + challengeType: ChallengeType.MOVE_WEIGHT, + pokemon: Pokemon, + moveSource: MoveSourceType, + move: MoveId, + weight: NumberHolder, +): boolean; + +export function applyChallenges(challengeType: ChallengeType.FLIP_STAT, pokemon: Pokemon, baseStats: number[]): boolean; + +/** + * Apply all challenges that conditionally enable or disable automatic party healing during biome transitions + * @param challengeType - {@linkcode ChallengeType.PARTY_HEAL} + * @param status - Whether party healing is enabled or not + * @returns `true` if any challenge was successfully applied, `false` otherwise + */ +export function applyChallenges(challengeType: ChallengeType.PARTY_HEAL, status: BooleanHolder): boolean; + +/** + * Apply all challenges that conditionally enable or disable the shop + * @param challengeType - {@linkcode ChallengeType.SHOP} + * @param status - Whether party healing is enabled or not + * @returns `true` if any challenge was successfully applied, `false` otherwise + */ +export function applyChallenges(challengeType: ChallengeType.SHOP, status: BooleanHolder): boolean; + +/** + * Apply all challenges that validate whether a pokemon can be added to the player's party or not + * @param challengeType - {@linkcode ChallengeType.POKEMON_ADD_TO_PARTY} + * @param pokemon - The pokemon being caught + * @param status - Whether the pokemon can be added to the party or not + * @return `true` if any challenge was sucessfully applied, `false` otherwise + */ +export function applyChallenges( + challengeType: ChallengeType.POKEMON_ADD_TO_PARTY, + pokemon: EnemyPokemon, + status: BooleanHolder, +): boolean; + +/** + * Apply all challenges that validate whether a pokemon is allowed to fuse or not + * @param challengeType - {@linkcode ChallengeType.POKEMON_FUSION} + * @param pokemon - The pokemon being checked + * @param status - Whether the selected pokemon is allowed to fuse or not + * @return `true` if any challenge was sucessfully applied, `false` otherwise + */ +export function applyChallenges( + challengeType: ChallengeType.POKEMON_FUSION, + pokemon: PlayerPokemon, + status: BooleanHolder, +): boolean; + +/** + * Apply all challenges that validate whether particular moves can or cannot be used + * @param challengeType - {@linkcode ChallengeType.POKEMON_MOVE} + * @param moveId - The move being checked + * @param status - Whether the move can be used or not + * @return `true` if any challenge was sucessfully applied, `false` otherwise + */ +export function applyChallenges( + challengeType: ChallengeType.POKEMON_MOVE, + moveId: MoveId, + status: BooleanHolder, +): boolean; + +/** + * Apply all challenges that validate whether particular items are or are not sold in the shop + * @param challengeType - {@linkcode ChallengeType.SHOP_ITEM} + * @param shopItem - The item being checked + * @param status - Whether the item should be added to the shop or not + * @return `true` if any challenge was sucessfully applied, `false` otherwise + */ +export function applyChallenges( + challengeType: ChallengeType.SHOP_ITEM, + shopItem: ModifierTypeOption | null, + status: BooleanHolder, +): boolean; + +/** + * Apply all challenges that validate whether particular items will be given as a reward after a wave + * @param challengeType - {@linkcode ChallengeType.WAVE_REWARD} + * @param reward - The reward being checked + * @param status - Whether the reward should be added to the reward options or not + * @return `true` if any challenge was sucessfully applied, `false` otherwise + */ +export function applyChallenges( + challengeType: ChallengeType.WAVE_REWARD, + reward: ModifierTypeOption | null, + status: BooleanHolder, +): boolean; + +/** + * Apply all challenges that prevent recovery from fainting + * @param challengeType - {@linkcode ChallengeType.PREVENT_REVIVE} + * @param status - Whether fainting is a permanent status or not + * @return `true` if any challenge was sucessfully applied, `false` otherwise + */ +export function applyChallenges(challengeType: ChallengeType.PREVENT_REVIVE, status: BooleanHolder): boolean; + +export function applyChallenges(challengeType: ChallengeType, ...args: any[]): boolean { + let ret = false; + globalScene.gameMode.challenges.forEach(c => { + if (c.value !== 0) { + switch (challengeType) { + case ChallengeType.STARTER_CHOICE: + ret ||= c.applyStarterChoice(args[0], args[1], args[2]); + break; + case ChallengeType.STARTER_POINTS: + ret ||= c.applyStarterPoints(args[0]); + break; + case ChallengeType.STARTER_COST: + ret ||= c.applyStarterCost(args[0], args[1]); + break; + case ChallengeType.STARTER_MODIFY: + ret ||= c.applyStarterModify(args[0]); + break; + case ChallengeType.POKEMON_IN_BATTLE: + ret ||= c.applyPokemonInBattle(args[0], args[1]); + break; + case ChallengeType.FIXED_BATTLES: + ret ||= c.applyFixedBattle(args[0], args[1]); + break; + case ChallengeType.TYPE_EFFECTIVENESS: + ret ||= c.applyTypeEffectiveness(args[0]); + break; + case ChallengeType.AI_LEVEL: + ret ||= c.applyLevelChange(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.AI_MOVE_SLOTS: + ret ||= c.applyMoveSlot(args[0], args[1]); + break; + case ChallengeType.PASSIVE_ACCESS: + ret ||= c.applyPassiveAccess(args[0], args[1]); + break; + case ChallengeType.GAME_MODE_MODIFY: + ret ||= c.applyGameModeModify(); + break; + case ChallengeType.MOVE_ACCESS: + ret ||= c.applyMoveAccessLevel(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.MOVE_WEIGHT: + ret ||= c.applyMoveWeight(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.FLIP_STAT: + ret ||= c.applyFlipStat(args[0], args[1]); + break; + case ChallengeType.PARTY_HEAL: + ret ||= c.applyPartyHeal(args[0]); + break; + case ChallengeType.SHOP: + ret ||= c.applyShop(args[0]); + break; + case ChallengeType.POKEMON_ADD_TO_PARTY: + ret ||= c.applyPokemonAddToParty(args[0], args[1]); + break; + case ChallengeType.POKEMON_FUSION: + ret ||= c.applyPokemonFusion(args[0], args[1]); + break; + case ChallengeType.POKEMON_MOVE: + ret ||= c.applyPokemonMove(args[0], args[1]); + break; + case ChallengeType.SHOP_ITEM: + ret ||= c.applyShopItem(args[0], args[1]); + break; + case ChallengeType.WAVE_REWARD: + ret ||= c.applyWaveReward(args[0], args[1]); + break; + case ChallengeType.PREVENT_REVIVE: + ret ||= c.applyPreventRevive(args[0]); + break; + } + } + }); + return ret; +} + +/** + * Apply all challenges to the given starter (and form) to check its validity. + * Differs from {@linkcode checkSpeciesValidForChallenge} which only checks form changes. + * @param species - The {@linkcode PokemonSpecies} to check the validity of. + * @param dexAttr - The {@linkcode DexAttrProps | dex attributes} of the species, including its form index. + * @param soft - If `true`, allow it if it could become valid through evolution or form change. + * @returns `true` if the species is considered valid. + */ +export function checkStarterValidForChallenge(species: PokemonSpecies, props: DexAttrProps, soft: boolean) { + if (!soft) { + const isValidForChallenge = new BooleanHolder(true); + applyChallenges(ChallengeType.STARTER_CHOICE, species, isValidForChallenge, props); + return isValidForChallenge.value; + } + // We check the validity of every evolution and form change, and require that at least one is valid + const speciesToCheck = [species.speciesId]; + while (speciesToCheck.length) { + const checking = speciesToCheck.pop(); + // Linter complains if we don't handle this + if (!checking) { + return false; + } + const checkingSpecies = getPokemonSpecies(checking); + if (checkSpeciesValidForChallenge(checkingSpecies, props, true)) { + return true; + } + if (checking && pokemonEvolutions.hasOwnProperty(checking)) { + pokemonEvolutions[checking].forEach(e => { + // Form check to deal with cases such as Basculin -> Basculegion + // TODO: does this miss anything if checking forms of a stage 2 Pokémon? + if (!e?.preFormKey || e.preFormKey === species.forms[props.formIndex].formKey) { + speciesToCheck.push(e.speciesId); + } + }); + } + } + return false; +} + +/** + * Apply all challenges to the given species (and form) to check its validity. + * Differs from {@linkcode checkStarterValidForChallenge} which also checks evolutions. + * @param species - The {@linkcode PokemonSpecies} to check the validity of. + * @param dexAttr - The {@linkcode DexAttrProps | dex attributes} of the species, including its form index. + * @param soft - If `true`, allow it if it could become valid through a form change. + * @returns `true` if the species is considered valid. + */ +function checkSpeciesValidForChallenge(species: PokemonSpecies, props: DexAttrProps, soft: boolean) { + const isValidForChallenge = new BooleanHolder(true); + applyChallenges(ChallengeType.STARTER_CHOICE, species, isValidForChallenge, props); + if (!soft || !pokemonFormChanges.hasOwnProperty(species.speciesId)) { + return isValidForChallenge.value; + } + // If the form in props is valid, return true before checking other form changes + if (soft && isValidForChallenge.value) { + return true; + } + + const result = pokemonFormChanges[species.speciesId].some(f1 => { + // Exclude form changes that require the mon to be on the field to begin with + if (!("item" in f1.trigger)) { + return false; + } + + return species.forms.some((f2, formIndex) => { + if (f1.formKey === f2.formKey) { + const formProps = { ...props, formIndex }; + const isFormValidForChallenge = new BooleanHolder(true); + applyChallenges(ChallengeType.STARTER_CHOICE, species, isFormValidForChallenge, formProps); + return isFormValidForChallenge.value; + } + return false; + }); + }); + return result; +} diff --git a/test/challenges/hardcore.test.ts b/test/challenges/hardcore.test.ts new file mode 100644 index 00000000000..0f4ab1b9f02 --- /dev/null +++ b/test/challenges/hardcore.test.ts @@ -0,0 +1,169 @@ +import { Status } from "#data/status-effect"; +import { AbilityId } from "#enums/ability-id"; +import { Button } from "#enums/buttons"; +import { Challenges } from "#enums/challenges"; +import { MoveId } from "#enums/move-id"; +import { ShopCursorTarget } from "#enums/shop-cursor-target"; +import { SpeciesId } from "#enums/species-id"; +import { StatusEffect } from "#enums/status-effect"; +import { UiMode } from "#enums/ui-mode"; +import { GameManager } from "#test/test-utils/game-manager"; +import { ModifierSelectUiHandler } from "#ui/modifier-select-ui-handler"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Challenges - Hardcore", () => { + 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.challengeMode.addChallenge(Challenges.HARDCORE, 1, 1); + game.override + .battleStyle("single") + .enemySpecies(SpeciesId.VOLTORB) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH) + .moveset(MoveId.SPLASH); + }); + + it("should render Revival Blessing unusable by players only", async () => { + game.override.enemyMoveset(MoveId.REVIVAL_BLESSING).moveset(MoveId.REVIVAL_BLESSING); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF]); + + const player = game.field.getPlayerPokemon(); + const revBlessing = player.getMoveset()[0]; + expect(revBlessing.isUsable(player)).toBe(false); + + game.move.select(MoveId.REVIVAL_BLESSING); + await game.toEndOfTurn(); + + // Player struggled due to only move being the unusable Revival Blessing + expect(player).toHaveUsedMove(MoveId.STRUGGLE); + expect(game.field.getEnemyPokemon()).toHaveUsedMove(MoveId.REVIVAL_BLESSING); + }); + + it("prevents REVIVE items in shop and in wave rewards", async () => { + game.override.startingWave(181).startingLevel(200); + await game.challengeMode.startBattle(); + + game.move.select(MoveId.SPLASH); + await game.doKillOpponents(); + + await game.phaseInterceptor.to("SelectModifierPhase"); + expect(game.scene.ui.getMode()).to.equal(UiMode.MODIFIER_SELECT); + const modifierSelectHandler = game.scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect( + modifierSelectHandler.options.find(reward => reward.modifierTypeOption.type.group === "revive"), + ).toBeUndefined(); + expect( + modifierSelectHandler.shopOptionsRows.find(row => + row.find(item => item.modifierTypeOption.type.group === "revive"), + ), + ).toBeUndefined(); + }); + + it("prevents the automatic party heal from reviving fainted Pokémon", async () => { + game.override.startingWave(10).startingLevel(200); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF, SpeciesId.WHISMUR]); + + const faintedPokemon = game.scene.getPlayerParty()[1]; + faintedPokemon.hp = 0; + faintedPokemon.status = new Status(StatusEffect.FAINT); + expect(faintedPokemon.isFainted()).toBe(true); + + game.move.select(MoveId.SPLASH); + await game.doKillOpponents(); + + await game.toNextWave(); + + expect(faintedPokemon.isFainted()).toBe(true); + }); + + // TODO: Couldn't figure out how to select party Pokémon + it.skip("prevents fusion with a fainted Pokémon", async () => { + game.override.itemRewards([{ name: "DNA_SPLICERS" }]); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF, SpeciesId.WHISMUR]); + + const faintedPokemon = game.scene.getPlayerParty()[1]; + faintedPokemon.hp = 0; + faintedPokemon.status = new Status(StatusEffect.FAINT); + expect(faintedPokemon.isFainted()).toBe(true); + + game.move.select(MoveId.RAZOR_LEAF); + await game.doKillOpponents(); + + await game.phaseInterceptor.to("SelectModifierPhase"); + game.onNextPrompt( + "SelectModifierPhase", + UiMode.MODIFIER_SELECT, + () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to and select first modifier + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + + // Go to fainted Pokémon and try to select it + handler.processInput(Button.RIGHT); + handler.processInput(Button.ACTION); + handler.processInput(Button.ACTION); + handler.processInput(Button.ACTION); + + expect(game.scene.getPlayerParty().length).toBe(2); + }, + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), + true, + ); + }); + + // TODO: Couldn't figure out how to select party Pokémon + it.skip("prevents fainted Pokémon from being revived", async () => { + game.override.itemRewards([{ name: "MAX_REVIVE" }]); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF, SpeciesId.WHISMUR]); + + const faintedPokemon = game.scene.getPlayerParty()[1]; + faintedPokemon.hp = 0; + faintedPokemon.status = new Status(StatusEffect.FAINT); + expect(faintedPokemon.isFainted()).toBe(true); + + game.move.select(MoveId.RAZOR_LEAF); + await game.doKillOpponents(); + + await game.phaseInterceptor.to("SelectModifierPhase"); + game.onNextPrompt( + "SelectModifierPhase", + UiMode.MODIFIER_SELECT, + () => { + const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler; + // Traverse to and select first modifier + handler.setCursor(0); + handler.setRowCursor(ShopCursorTarget.REWARDS); + handler.processInput(Button.ACTION); + + // Go to fainted Pokémon and try to select it + handler.processInput(Button.RIGHT); + handler.processInput(Button.ACTION); + handler.processInput(Button.ACTION); + handler.processInput(Button.ACTION); + + expect(faintedPokemon.isFainted()).toBe(true); + }, + () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("NewBattlePhase"), + true, + ); + }); +}); diff --git a/test/challenges/limited-catch.test.ts b/test/challenges/limited-catch.test.ts new file mode 100644 index 00000000000..80be52df2fb --- /dev/null +++ b/test/challenges/limited-catch.test.ts @@ -0,0 +1,55 @@ +import { AbilityId } from "#enums/ability-id"; +import { Challenges } from "#enums/challenges"; +import { MoveId } from "#enums/move-id"; +import { PokeballType } from "#enums/pokeball"; +import { SpeciesId } from "#enums/species-id"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Challenges - Limited Catch", () => { + 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.challengeMode.addChallenge(Challenges.LIMITED_CATCH, 1, 1); + game.override + .battleStyle("single") + .enemySpecies(SpeciesId.VOLTORB) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH) + .startingModifier([{ name: "MASTER_BALL", count: 1 }]); + }); + + it("should allow wild Pokémon to be caught on X1 waves", async () => { + game.override.startingWave(31); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF]); + + game.doThrowPokeball(PokeballType.MASTER_BALL); + await game.toEndOfTurn(); + + expect(game.scene.getPlayerParty()).toHaveLength(2); + }); + + it("should prevent Pokémon from being caught on non-X1 waves", async () => { + game.override.startingWave(53); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF]); + + game.doThrowPokeball(PokeballType.MASTER_BALL); + await game.toEndOfTurn(); + + expect(game.scene.getPlayerParty()).toHaveLength(1); + }); +}); diff --git a/test/challenges/limited-support.test.ts b/test/challenges/limited-support.test.ts new file mode 100644 index 00000000000..5c0eb2bd420 --- /dev/null +++ b/test/challenges/limited-support.test.ts @@ -0,0 +1,90 @@ +import { AbilityId } from "#enums/ability-id"; +import { Challenges } from "#enums/challenges"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { UiMode } from "#enums/ui-mode"; +import { GameManager } from "#test/test-utils/game-manager"; +import { ModifierSelectUiHandler } from "#ui/modifier-select-ui-handler"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Challenges - Limited Support", () => { + 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 + .battleStyle("single") + .enemySpecies(SpeciesId.VOLTORB) + .enemyAbility(AbilityId.BALL_FETCH) + .enemyMoveset(MoveId.SPLASH); + }); + + it('should disable the shop in "No Shop"', async () => { + game.override.startingWave(181); + game.challengeMode.addChallenge(Challenges.LIMITED_SUPPORT, 2, 1); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF]); + + game.move.use(MoveId.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to("SelectModifierPhase"); + + expect(game.scene.ui.getMode()).toBe(UiMode.MODIFIER_SELECT); + const modifierSelectHandler = game.scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.shopOptionsRows).toHaveLength(0); + }); + + it('should disable the automatic party heal in "No Heal"', async () => { + game.override.startingWave(10); + game.challengeMode.addChallenge(Challenges.LIMITED_SUPPORT, 1, 1); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF]); + + const playerPokemon = game.field.getPlayerPokemon(); + playerPokemon.hp /= 2; + + game.move.use(MoveId.SPLASH); + await game.doKillOpponents(); + await game.toNextWave(); + + expect(playerPokemon).not.toHaveFullHp(); + }); + + it('should disable both automatic party healing and shop in "Both"', async () => { + game.override.startingWave(10); + game.challengeMode.addChallenge(Challenges.LIMITED_SUPPORT, 3, 1); + await game.challengeMode.startBattle([SpeciesId.NUZLEAF]); + + const playerPokemon = game.field.getPlayerPokemon(); + playerPokemon.hp /= 2; + + game.move.use(MoveId.SPLASH); + await game.doKillOpponents(); + await game.toNextWave(); + + expect(playerPokemon).not.toHaveFullHp(); + + game.move.use(MoveId.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to("SelectModifierPhase"); + + expect(game.scene.ui.getMode()).toBe(UiMode.MODIFIER_SELECT); + const modifierSelectHandler = game.scene.ui.handlers.find( + h => h instanceof ModifierSelectUiHandler, + ) as ModifierSelectUiHandler; + expect(modifierSelectHandler.shopOptionsRows).toHaveLength(0); + }); +}); From ac8ef62290c032804247915da16ddbc8ac3e619e Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Fri, 8 Aug 2025 02:49:32 +0200 Subject: [PATCH 085/106] [UI/UX] Clean up some magic numbers (#6165) * Removed unused scale parameter from InfoOverlay s * Using `globalScene.scaledCanvas.width` * Using `scaledCanvas` everywhere * Replaced some sneaky instances of `scaledCanvas / 2` * Convert comments to TSDocs * Fix typo * Caught a few more instances of `width / 6` etc * Fixed unused scale parameter --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> --- src/battle-scene.ts | 30 +++++------- .../encounters/bug-type-superfan-encounter.ts | 6 +-- .../global-trade-system-encounter.ts | 6 +-- .../encounters/weird-dream-encounter.ts | 6 +-- src/field/damage-number-handler.ts | 2 +- src/phases/egg-hatch-phase.ts | 6 +-- src/phases/end-card-phase.ts | 4 +- src/phases/evolution-phase.ts | 8 ++-- src/timed-event-manager.ts | 2 +- src/ui/abstact-option-select-ui-handler.ts | 4 +- src/ui/achv-bar.ts | 6 +-- src/ui/achvs-ui-handler.ts | 4 +- src/ui/ball-ui-handler.ts | 2 +- src/ui/base-stats-overlay.ts | 3 +- src/ui/battle-info/player-battle-info.ts | 2 +- src/ui/battle-message-ui-handler.ts | 8 ++-- src/ui/candy-bar.ts | 6 +-- src/ui/challenges-select-ui-handler.ts | 6 +-- src/ui/char-sprite.ts | 6 +-- src/ui/confirm-ui-handler.ts | 4 +- src/ui/egg-gacha-ui-handler.ts | 6 +-- src/ui/egg-hatch-scene-handler.ts | 2 +- src/ui/egg-list-ui-handler.ts | 8 ++-- src/ui/egg-summary-ui-handler.ts | 6 +-- src/ui/evolution-scene-handler.ts | 2 +- src/ui/fight-ui-handler.ts | 6 +-- src/ui/filter-text.ts | 2 +- src/ui/login-form-ui-handler.ts | 2 +- src/ui/menu-ui-handler.ts | 10 ++-- src/ui/modal-ui-handler.ts | 10 ++-- src/ui/modifier-select-ui-handler.ts | 33 ++++++------- src/ui/move-info-overlay.ts | 48 +++++++++++-------- src/ui/mystery-encounter-ui-handler.ts | 2 +- src/ui/party-exp-bar.ts | 6 +-- src/ui/party-ui-handler.ts | 10 ++-- src/ui/pokeball-tray.ts | 8 ++-- src/ui/pokedex-info-overlay.ts | 35 +++++++------- src/ui/pokedex-page-ui-handler.ts | 23 ++++----- src/ui/pokedex-ui-handler.ts | 10 ++-- src/ui/run-history-ui-handler.ts | 6 +-- src/ui/run-info-ui-handler.ts | 14 +++--- src/ui/save-slot-select-ui-handler.ts | 6 +-- src/ui/saving-icon-handler.ts | 2 +- .../settings/abstract-binding-ui-handler.ts | 12 ++--- .../abstract-control-settings-ui-handler.ts | 14 +++--- .../settings/abstract-settings-ui-handler.ts | 14 +++--- src/ui/settings/navigation-menu.ts | 2 +- src/ui/starter-select-ui-handler.ts | 6 +-- src/ui/title-ui-handler.ts | 8 ++-- src/ui/ui.ts | 16 ++----- 50 files changed, 210 insertions(+), 240 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 8c8906be2b0..ea15969ce61 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -478,8 +478,8 @@ export class BattleScene extends SceneBase { this.uiContainer = uiContainer; - const overlayWidth = this.game.canvas.width / 6; - const overlayHeight = this.game.canvas.height / 6 - 48; + const overlayWidth = this.scaledCanvas.width; + const overlayHeight = this.scaledCanvas.height - 48; this.fieldOverlay = this.add.rectangle(0, overlayHeight * -1 - 48, overlayWidth, overlayHeight, 0x424242); this.fieldOverlay.setName("rect-field-overlay"); this.fieldOverlay.setOrigin(0, 0); @@ -537,34 +537,29 @@ export class BattleScene extends SceneBase { this.candyBar.setup(); this.fieldUI.add(this.candyBar); - this.biomeWaveText = addTextObject( - this.game.canvas.width / 6 - 2, - 0, - startingWave.toString(), - TextStyle.BATTLE_INFO, - ); + this.biomeWaveText = addTextObject(this.scaledCanvas.width - 2, 0, startingWave.toString(), TextStyle.BATTLE_INFO); this.biomeWaveText.setName("text-biome-wave"); this.biomeWaveText.setOrigin(1, 0.5); this.fieldUI.add(this.biomeWaveText); - this.moneyText = addTextObject(this.game.canvas.width / 6 - 2, 0, "", TextStyle.MONEY); + this.moneyText = addTextObject(this.scaledCanvas.width - 2, 0, "", TextStyle.MONEY); this.moneyText.setName("text-money"); this.moneyText.setOrigin(1, 0.5); this.fieldUI.add(this.moneyText); - this.scoreText = addTextObject(this.game.canvas.width / 6 - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); + this.scoreText = addTextObject(this.scaledCanvas.width - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); this.scoreText.setName("text-score"); this.scoreText.setOrigin(1, 0.5); this.fieldUI.add(this.scoreText); - this.luckText = addTextObject(this.game.canvas.width / 6 - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); + this.luckText = addTextObject(this.scaledCanvas.width - 2, 0, "", TextStyle.PARTY, { fontSize: "54px" }); this.luckText.setName("text-luck"); this.luckText.setOrigin(1, 0.5); this.luckText.setVisible(false); this.fieldUI.add(this.luckText); this.luckLabelText = addTextObject( - this.game.canvas.width / 6 - 2, + this.scaledCanvas.width - 2, 0, i18next.t("common:luckIndicator"), TextStyle.PARTY, @@ -586,10 +581,7 @@ export class BattleScene extends SceneBase { this.spriteSparkleHandler = new PokemonSpriteSparkleHandler(); this.spriteSparkleHandler.setup(); - this.pokemonInfoContainer = new PokemonInfoContainer( - this.game.canvas.width / 6 + 52, - -(this.game.canvas.height / 6) + 66, - ); + this.pokemonInfoContainer = new PokemonInfoContainer(this.scaledCanvas.width + 52, -this.scaledCanvas.height + 66); this.pokemonInfoContainer.setup(); this.fieldUI.add(this.pokemonInfoContainer); @@ -2054,7 +2046,7 @@ export class BattleScene extends SceneBase { } else { this.luckText.setTint(0xffef5c, 0x47ff69, 0x6b6bff, 0xff6969); } - this.luckLabelText.setX(this.game.canvas.width / 6 - 2 - (this.luckText.displayWidth + 2)); + this.luckLabelText.setX(this.scaledCanvas.width - 2 - (this.luckText.displayWidth + 2)); this.tweens.add({ targets: labels, duration: duration, @@ -2088,7 +2080,7 @@ export class BattleScene extends SceneBase { const enemyModifierCount = this.enemyModifiers.filter(m => m.isIconVisible()).length; const biomeWaveTextHeight = this.biomeWaveText.getBottomLeft().y - this.biomeWaveText.getTopLeft().y; this.biomeWaveText.setY( - -(this.game.canvas.height / 6) + + -this.scaledCanvas.height + (enemyModifierCount ? (enemyModifierCount <= 12 ? 15 : 24) : 0) + biomeWaveTextHeight / 2, ); @@ -2100,7 +2092,7 @@ export class BattleScene extends SceneBase { const offsetY = (this.scoreText.visible ? this.scoreText : this.moneyText).y + 15; this.partyExpBar.setY(offsetY); this.candyBar.setY(offsetY + 15); - this.ui?.achvBar.setY(this.game.canvas.height / 6 + offsetY); + this.ui?.achvBar.setY(this.scaledCanvas.height + offsetY); } /** diff --git a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts index d60ebe690ac..d86f1511207 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -715,15 +715,13 @@ function doBugTypeMoveTutor(): Promise { const moveOptions = globalScene.currentBattle.mysteryEncounter!.misc.moveTutorOptions; await showEncounterDialogue(`${namespace}:battle_won`, `${namespace}:speaker`); - const overlayScale = 1; const moveInfoOverlay = new MoveInfoOverlay({ delayVisibility: false, - scale: overlayScale, onSide: true, right: true, x: 1, - y: -MoveInfoOverlay.getHeight(overlayScale, true) - 1, - width: globalScene.game.canvas.width / 6 - 2, + y: -MoveInfoOverlay.getHeight(true) - 1, + width: globalScene.scaledCanvas.width - 2, }); globalScene.ui.add(moveInfoOverlay); diff --git a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts index 347092fe0b4..083a6d06801 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -564,14 +564,14 @@ function generateTradeOption(alreadyUsedSpecies: PokemonSpecies[], originalBst?: function showTradeBackground() { return new Promise(resolve => { - const tradeContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + const tradeContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); tradeContainer.setName("Trade Background"); const flyByStaticBg = globalScene.add.rectangle( 0, 0, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, 0, ); flyByStaticBg.setName("Black Background"); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index b4a2ba4abd5..57b066e2ba2 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -649,15 +649,15 @@ function getTransformedSpecies( } function doShowDreamBackground() { - const transformationContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + const transformationContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); transformationContainer.name = "Dream Background"; // In case it takes a bit for video to load const transformationStaticBg = globalScene.add.rectangle( 0, 0, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, 0, ); transformationStaticBg.setName("Black Background"); diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index 1bbacc19566..112b08631b0 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -30,7 +30,7 @@ export class DamageNumberHandler { const baseScale = target.getSpriteScale() / 6; const damageNumber = addTextObject( target.x, - -(globalScene.game.canvas.height / 6) + target.y - target.getSprite().height / 2, + -globalScene.scaledCanvas.height + target.y - target.getSprite().height / 2, formatStat(amount, true), TextStyle.SUMMARY, ); diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts index 94923ae8c1f..e9d28e0fe2a 100644 --- a/src/phases/egg-hatch-phase.ts +++ b/src/phases/egg-hatch-phase.ts @@ -148,9 +148,9 @@ export class EggHatchPhase extends Phase { this.eggHatchOverlay = globalScene.add.rectangle( 0, - -globalScene.game.canvas.height / 6, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6, + -globalScene.scaledCanvas.height, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, 0xffffff, ); this.eggHatchOverlay.setOrigin(0, 0); diff --git a/src/phases/end-card-phase.ts b/src/phases/end-card-phase.ts index b9b383db13d..5ce0ca47b99 100644 --- a/src/phases/end-card-phase.ts +++ b/src/phases/end-card-phase.ts @@ -25,8 +25,8 @@ export class EndCardPhase extends Phase { globalScene.field.add(this.endCard); this.text = addTextObject( - globalScene.game.canvas.width / 12, - globalScene.game.canvas.height / 6 - 16, + globalScene.scaledCanvas.width / 2, + globalScene.scaledCanvas.height - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }, diff --git a/src/phases/evolution-phase.ts b/src/phases/evolution-phase.ts index cad79455af3..ad3db97d520 100644 --- a/src/phases/evolution-phase.ts +++ b/src/phases/evolution-phase.ts @@ -90,16 +90,16 @@ export class EvolutionPhase extends Phase { .setVisible(false); this.evolutionBgOverlay = globalScene.add - .rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6, 0x262626) + .rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height, 0x262626) .setOrigin(0) .setAlpha(0); this.evolutionContainer.add([this.evolutionBaseBg, this.evolutionBgOverlay, this.evolutionBg]); this.evolutionOverlay = globalScene.add.rectangle( 0, - -globalScene.game.canvas.height / 6, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6 - 48, + -globalScene.scaledCanvas.height, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height - 48, 0xffffff, ); this.evolutionOverlay.setOrigin(0).setAlpha(0); diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 9877f298404..9e711735e7f 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -653,7 +653,7 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { console.log(this.event.bannerKey); const padding = 5; const showTimer = this.event.eventType !== EventType.NO_TIMER_DISPLAY; - const yPosition = globalScene.game.canvas.height / 6 - padding - (showTimer ? 10 : 0) - (this.event.yOffset ?? 0); + const yPosition = globalScene.scaledCanvas.height - padding - (showTimer ? 10 : 0) - (this.event.yOffset ?? 0); this.banner = new Phaser.GameObjects.Image(globalScene, this.availableWidth / 2, yPosition - padding, key); this.banner.setName("img-event-banner"); this.banner.setOrigin(0.5, 1); diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index 2fb0159b6ef..b7279bc2d30 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -66,7 +66,7 @@ export abstract class AbstractOptionSelectUiHandler extends UiHandler { setup() { const ui = this.getUi(); - this.optionSelectContainer = globalScene.add.container(globalScene.game.canvas.width / 6 - 1, -48); + this.optionSelectContainer = globalScene.add.container(globalScene.scaledCanvas.width - 1, -48); this.optionSelectContainer.setName(`option-select-${this.mode ? UiMode[this.mode] : "UNKNOWN"}`); this.optionSelectContainer.setVisible(false); ui.add(this.optionSelectContainer); @@ -135,7 +135,7 @@ export abstract class AbstractOptionSelectUiHandler extends UiHandler { this.optionSelectText.setName("text-option-select"); this.optionSelectTextContainer.add(this.optionSelectText); this.optionSelectContainer.setPosition( - globalScene.game.canvas.width / 6 - 1 - (this.config?.xOffset || 0), + globalScene.scaledCanvas.width - 1 - (this.config?.xOffset || 0), -48 + (this.config?.yOffset || 0), ); this.optionSelectBg.width = Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()); diff --git a/src/ui/achv-bar.ts b/src/ui/achv-bar.ts index bb1ef95c9de..0f71bcbfde0 100644 --- a/src/ui/achv-bar.ts +++ b/src/ui/achv-bar.ts @@ -21,7 +21,7 @@ export class AchvBar extends Phaser.GameObjects.Container { public shown: boolean; constructor() { - super(globalScene, globalScene.game.canvas.width / 6, 0); + super(globalScene, globalScene.scaledCanvas.width, 0); this.playerGender = globalScene.gameData.gender; } @@ -118,7 +118,7 @@ export class AchvBar extends Phaser.GameObjects.Container { globalScene.tweens.add({ targets: this, - x: globalScene.game.canvas.width / 6 - this.bg.width / 2, + x: globalScene.scaledCanvas.width - this.bg.width / 2, duration: 500, ease: "Sine.easeOut", }); @@ -136,7 +136,7 @@ export class AchvBar extends Phaser.GameObjects.Container { globalScene.tweens.add({ targets: this, - x: globalScene.game.canvas.width / 6, + x: globalScene.scaledCanvas.width, duration: 500, ease: "Sine.easeIn", onComplete: () => { diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index 01fd1d45a61..2c04e24e0f2 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -72,9 +72,9 @@ export class AchvsUiHandler extends MessageUiHandler { const ui = this.getUi(); /** Width of the global canvas / 6 */ - const WIDTH = globalScene.game.canvas.width / 6; + const WIDTH = globalScene.scaledCanvas.width; /** Height of the global canvas / 6 */ - const HEIGHT = globalScene.game.canvas.height / 6; + const HEIGHT = globalScene.scaledCanvas.height; this.mainContainer = globalScene.add.container(1, -HEIGHT + 1); diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index 67beb0eba84..99dabd893df 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -37,7 +37,7 @@ export class BallUiHandler extends UiHandler { const optionsText = addTextObject(0, 0, optionsTextContent, TextStyle.WINDOW, { align: "right", maxLines: 6 }); const optionsTextWidth = optionsText.displayWidth; this.pokeballSelectContainer = globalScene.add.container( - globalScene.game.canvas.width / 6 - 51 - Math.max(64, optionsTextWidth), + globalScene.scaledCanvas.width - 51 - Math.max(64, optionsTextWidth), -49, ); this.pokeballSelectContainer.setVisible(false); diff --git a/src/ui/base-stats-overlay.ts b/src/ui/base-stats-overlay.ts index e3ba472475a..3b432e13096 100644 --- a/src/ui/base-stats-overlay.ts +++ b/src/ui/base-stats-overlay.ts @@ -16,7 +16,6 @@ interface BaseStatsOverlaySettings { const HEIGHT = 120; const BORDER = 8; -const GLOBAL_SCALE = 6; const shortStats = ["HP", "ATK", "DEF", "SPATK", "SPDEF", "SPD"]; export class BaseStatsOverlay extends Phaser.GameObjects.Container implements InfoToggle { @@ -109,7 +108,7 @@ export class BaseStatsOverlay extends Phaser.GameObjects.Container implements In // width of this element static getWidth(_scale: number): number { - return globalScene.game.canvas.width / GLOBAL_SCALE / 2; + return globalScene.scaledCanvas.width / 2; } // height of this element diff --git a/src/ui/battle-info/player-battle-info.ts b/src/ui/battle-info/player-battle-info.ts index 62a2eddecb9..8784495e6d2 100644 --- a/src/ui/battle-info/player-battle-info.ts +++ b/src/ui/battle-info/player-battle-info.ts @@ -39,7 +39,7 @@ export class PlayerBattleInfo extends BattleInfo { statOverflow: 1, }, }; - super(Math.floor(globalScene.game.canvas.width / 6) - 10, -72, true, posParams); + super(Math.floor(globalScene.scaledCanvas.width) - 10, -72, true, posParams); this.hpNumbersContainer = globalScene.add.container(-15, 10).setName("container_hp"); diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index b58897b9022..2ecca06172b 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -94,7 +94,7 @@ export class BattleMessageUiHandler extends MessageUiHandler { this.levelUpStatsContainer = levelUpStatsContainer; - const levelUpStatsLabelsContent = addTextObject(globalScene.game.canvas.width / 6 - 73, -94, "", TextStyle.WINDOW, { + const levelUpStatsLabelsContent = addTextObject(globalScene.scaledCanvas.width - 73, -94, "", TextStyle.WINDOW, { maxLines: 6, }); let levelUpStatsLabelText = ""; @@ -106,7 +106,7 @@ export class BattleMessageUiHandler extends MessageUiHandler { levelUpStatsLabelsContent.x -= levelUpStatsLabelsContent.displayWidth; const levelUpStatsBg = addWindow( - globalScene.game.canvas.width / 6, + globalScene.scaledCanvas.width, -100, 80 + levelUpStatsLabelsContent.displayWidth, 100, @@ -117,7 +117,7 @@ export class BattleMessageUiHandler extends MessageUiHandler { levelUpStatsContainer.add(levelUpStatsLabelsContent); const levelUpStatsIncrContent = addTextObject( - globalScene.game.canvas.width / 6 - 50, + globalScene.scaledCanvas.width - 50, -94, "+\n+\n+\n+\n+\n+", TextStyle.WINDOW, @@ -128,7 +128,7 @@ export class BattleMessageUiHandler extends MessageUiHandler { this.levelUpStatsIncrContent = levelUpStatsIncrContent; const levelUpStatsValuesContent = addBBCodeTextObject( - globalScene.game.canvas.width / 6 - 7, + globalScene.scaledCanvas.width - 7, -94, "", TextStyle.WINDOW, diff --git a/src/ui/candy-bar.ts b/src/ui/candy-bar.ts index 239b963227b..b29ac3ec520 100644 --- a/src/ui/candy-bar.ts +++ b/src/ui/candy-bar.ts @@ -19,7 +19,7 @@ export class CandyBar extends Phaser.GameObjects.Container { public shown: boolean; constructor() { - super(globalScene, globalScene.game.canvas.width / 6, -(globalScene.game.canvas.height / 6) + 15); + super(globalScene, globalScene.scaledCanvas.width, -globalScene.scaledCanvas.height + 15); } setup(): void { @@ -80,7 +80,7 @@ export class CandyBar extends Phaser.GameObjects.Container { this.tween = globalScene.tweens.add({ targets: this, - x: globalScene.game.canvas.width / 6 - (this.bg.width - 5), + x: globalScene.scaledCanvas.width - (this.bg.width - 5), duration: 500, ease: "Sine.easeOut", onComplete: () => { @@ -111,7 +111,7 @@ export class CandyBar extends Phaser.GameObjects.Container { this.tween = globalScene.tweens.add({ targets: this, - x: globalScene.game.canvas.width / 6, + x: globalScene.scaledCanvas.width, duration: 500, ease: "Sine.easeIn", onComplete: () => { diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index 4a7ab7641a3..b37ddcc6a5f 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -58,11 +58,11 @@ export class GameChallengesUiHandler extends UiHandler { this.widestTextBox = 0; - this.challengesContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); + this.challengesContainer = globalScene.add.container(1, -globalScene.scaledCanvas.height + 1); this.challengesContainer.setName("challenges"); this.challengesContainer.setInteractive( - new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + new Phaser.Geom.Rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height), Phaser.Geom.Rectangle.Contains, ); @@ -79,7 +79,7 @@ export class GameChallengesUiHandler extends UiHandler { this.challengesContainer.add(bgOverlay); // TODO: Change this back to /9 when adding in difficulty - const headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6, 24); + const headerBg = addWindow(0, 0, globalScene.scaledCanvas.width, 24); headerBg.setName("window-header-bg"); headerBg.setOrigin(0, 0); diff --git a/src/ui/char-sprite.ts b/src/ui/char-sprite.ts index 381421086ff..1ab00291ff6 100644 --- a/src/ui/char-sprite.ts +++ b/src/ui/char-sprite.ts @@ -10,7 +10,7 @@ export class CharSprite extends Phaser.GameObjects.Container { public shown: boolean; constructor() { - super(globalScene, globalScene.game.canvas.width / 6 + 32, -42); + super(globalScene, globalScene.scaledCanvas.width + 32, -42); } setup(): void { @@ -49,7 +49,7 @@ export class CharSprite extends Phaser.GameObjects.Container { globalScene.tweens.add({ targets: this, - x: globalScene.game.canvas.width / 6 - 102, + x: globalScene.scaledCanvas.width - 102, duration: 750, ease: "Cubic.easeOut", onComplete: () => { @@ -95,7 +95,7 @@ export class CharSprite extends Phaser.GameObjects.Container { globalScene.tweens.add({ targets: this, - x: globalScene.game.canvas.width / 6 + 32, + x: globalScene.scaledCanvas.width + 32, duration: 750, ease: "Cubic.easeIn", onComplete: () => { diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index b2f35931278..aeef7fc1c91 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -69,7 +69,7 @@ export class ConfirmUiHandler extends AbstractOptionSelectUiHandler { const xOffset = args.length >= 7 && args[6] !== null ? (args[6] as number) : 0; const yOffset = args.length >= 8 && args[7] !== null ? (args[7] as number) : 0; - this.optionSelectContainer.setPosition(globalScene.game.canvas.width / 6 - 1 + xOffset, -48 + yOffset); + this.optionSelectContainer.setPosition(globalScene.scaledCanvas.width - 1 + xOffset, -48 + yOffset); this.setCursor(this.switchCheck ? this.switchCheckCursor : 0); return true; @@ -103,7 +103,7 @@ export class ConfirmUiHandler extends AbstractOptionSelectUiHandler { const xOffset = args.length >= 4 && args[3] !== null ? (args[3] as number) : 0; const yOffset = args.length >= 5 && args[4] !== null ? (args[4] as number) : 0; - this.optionSelectContainer.setPosition(globalScene.game.canvas.width / 6 - 1 + xOffset, -48 + yOffset); + this.optionSelectContainer.setPosition(globalScene.scaledCanvas.width - 1 + xOffset, -48 + yOffset); this.setCursor(this.switchCheck ? this.switchCheckCursor : 0); diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 5dcf05e2606..0287e0ee7a5 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -174,7 +174,7 @@ export class EggGachaUiHandler extends MessageUiHandler { const ui = this.getUi(); - this.eggGachaContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6).setVisible(false); + this.eggGachaContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height).setVisible(false); ui.add(this.eggGachaContainer); const bg = globalScene.add.nineslice(0, 0, "default_bg", undefined, 320, 180, 0, 0, 16, 0).setOrigin(0); @@ -212,7 +212,7 @@ export class EggGachaUiHandler extends MessageUiHandler { this.eggGachaOptionSelectBg = addWindow(0, 0, eggGachaOptionSelectWidth, 16 + 576 * this.scale).setOrigin(1); this.eggGachaOptionsContainer = globalScene.add - .container(globalScene.game.canvas.width / 6, 148) + .container(globalScene.scaledCanvas.width, 148) .add(this.eggGachaOptionSelectBg); this.eggGachaContainer.add(this.eggGachaOptionsContainer); @@ -278,7 +278,7 @@ export class EggGachaUiHandler extends MessageUiHandler { this.eggGachaContainer.add(this.eggGachaOptionsContainer); for (const voucher of getEnumValues(VoucherType)) { - const container = globalScene.add.container(globalScene.game.canvas.width / 6 - 56 * voucher, 0); + const container = globalScene.add.container(globalScene.scaledCanvas.width - 56 * voucher, 0); const bg = addWindow(0, 0, 56, 22).setOrigin(1, 0); container.add(bg); diff --git a/src/ui/egg-hatch-scene-handler.ts b/src/ui/egg-hatch-scene-handler.ts index 5b2c9d40cfa..6536ef2af80 100644 --- a/src/ui/egg-hatch-scene-handler.ts +++ b/src/ui/egg-hatch-scene-handler.ts @@ -19,7 +19,7 @@ export class EggHatchSceneHandler extends UiHandler { } setup() { - this.eggHatchContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.eggHatchContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); globalScene.fieldUI.add(this.eggHatchContainer); const eggLightraysAnimFrames = globalScene.anims.generateFrameNames("egg_lightrays", { start: 0, end: 3 }); diff --git a/src/ui/egg-list-ui-handler.ts b/src/ui/egg-list-ui-handler.ts index 42f969b9d38..2516903f631 100644 --- a/src/ui/egg-list-ui-handler.ts +++ b/src/ui/egg-list-ui-handler.ts @@ -36,11 +36,11 @@ export class EggListUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); - this.eggListContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6).setVisible(false); + this.eggListContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height).setVisible(false); ui.add(this.eggListContainer); const bgColor = globalScene.add - .rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6, 0x006860) + .rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height, 0x006860) .setOrigin(0); const eggListBg = globalScene.add.image(0, 0, "egg_list_bg").setOrigin(0); @@ -69,9 +69,7 @@ export class EggListUiHandler extends MessageUiHandler { .withUpdateGridCallBack(() => this.updateEggIcons()) .withUpdateSingleElementCallback((i: number) => this.setEggDetails(i)); - this.eggListMessageBoxContainer = globalScene.add - .container(0, globalScene.game.canvas.height / 6) - .setVisible(false); + this.eggListMessageBoxContainer = globalScene.add.container(0, globalScene.scaledCanvas.height).setVisible(false); const eggListMessageBox = addWindow(1, -1, 318, 28).setOrigin(0, 1); this.eggListMessageBoxContainer.add(eggListMessageBox); diff --git a/src/ui/egg-summary-ui-handler.ts b/src/ui/egg-summary-ui-handler.ts index aa4e8974318..c66075dd910 100644 --- a/src/ui/egg-summary-ui-handler.ts +++ b/src/ui/egg-summary-ui-handler.ts @@ -59,11 +59,11 @@ export class EggSummaryUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); - this.summaryContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.summaryContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); this.summaryContainer.setVisible(false); ui.add(this.summaryContainer); - this.eggHatchContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.eggHatchContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); this.eggHatchContainer.setVisible(false); ui.add(this.eggHatchContainer); @@ -92,7 +92,7 @@ export class EggSummaryUiHandler extends MessageUiHandler { iconContainerX + numCols * iconSize, iconContainerY + 3, 4, - globalScene.game.canvas.height / 6 - 20, + globalScene.scaledCanvas.height - 20, numRows, ); this.summaryContainer.add(scrollBar); diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index c22cf31faaa..0333594dc36 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -22,7 +22,7 @@ export class EvolutionSceneHandler extends MessageUiHandler { const ui = this.getUi(); - this.evolutionContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.evolutionContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); const messageBg = globalScene.add.sprite(0, 0, "bg", globalScene.windowType).setOrigin(0, 1).setVisible(false); diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 42f8cba5df4..1d856079939 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -105,15 +105,13 @@ export class FightUiHandler extends UiHandler implements InfoToggle { ]); // prepare move overlay - const overlayScale = 1; this.moveInfoOverlay = new MoveInfoOverlay({ delayVisibility: true, - scale: overlayScale, onSide: true, right: true, x: 0, - y: -MoveInfoOverlay.getHeight(overlayScale, true), - width: globalScene.game.canvas.width / 6 + 4, + y: -MoveInfoOverlay.getHeight(true), + width: globalScene.scaledCanvas.width + 4, hideEffectBox: true, hideBg: true, }); diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts index ff7119dd778..d5809292c25 100644 --- a/src/ui/filter-text.ts +++ b/src/ui/filter-text.ts @@ -62,7 +62,7 @@ export class FilterText extends Phaser.GameObjects.Container { this.dialogueMessageBox = addWindow( -this.textPadding, 0, - globalScene.game.canvas.width / 6 + this.textPadding * 2, + globalScene.scaledCanvas.width + this.textPadding * 2, 49, false, false, diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 524eaeece86..67b2c81b94c 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -49,7 +49,7 @@ export class LoginFormUiHandler extends FormModalUiHandler { private buildExternalPartyContainer() { this.externalPartyContainer = globalScene.add.container(0, 0); this.externalPartyContainer.setInteractive( - new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 12, globalScene.game.canvas.height / 12), + new Phaser.Geom.Rectangle(0, 0, globalScene.scaledCanvas.width / 2, globalScene.scaledCanvas.height / 2), Phaser.Geom.Rectangle.Contains, ); this.externalPartyTitle = addTextObject(0, 4, "", TextStyle.SETTINGS_LABEL); diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index 30bf9eeff75..e419997456b 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -96,10 +96,10 @@ export class MenuUiHandler extends MessageUiHandler { ui.bgmBar = this.bgmBar; - this.menuContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); + this.menuContainer = globalScene.add.container(1, -globalScene.scaledCanvas.height + 1); this.menuContainer.setName("menu"); this.menuContainer.setInteractive( - new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + new Phaser.Geom.Rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height), Phaser.Geom.Rectangle.Contains, ); @@ -146,10 +146,10 @@ export class MenuUiHandler extends MessageUiHandler { this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; this.menuBg = addWindow( - globalScene.game.canvas.width / 6 - (this.optionSelectText.displayWidth + 25), + globalScene.scaledCanvas.width - (this.optionSelectText.displayWidth + 25), 0, this.optionSelectText.displayWidth + 19 + 24 * this.scale, - globalScene.game.canvas.height / 6 - 2, + globalScene.scaledCanvas.height - 2, ); this.menuBg.setOrigin(0, 0); @@ -174,7 +174,7 @@ export class MenuUiHandler extends MessageUiHandler { this.dialogueMessageBox = addWindow( -this.textPadding, 0, - globalScene.game.canvas.width / 6 + this.textPadding * 2, + globalScene.scaledCanvas.width + this.textPadding * 2, 49, false, false, diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 4d1456eec51..51a6a21a29c 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -46,7 +46,7 @@ export abstract class ModalUiHandler extends UiHandler { this.modalContainer = globalScene.add.container(0, 0); this.modalContainer.setInteractive( - new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + new Phaser.Geom.Rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height), Phaser.Geom.Rectangle.Contains, ); @@ -105,8 +105,8 @@ export abstract class ModalUiHandler extends UiHandler { const overlay = globalScene.add.rectangle( (this.getWidth() + marginLeft + marginRight) / 2, (this.getHeight() + marginTop + marginBottom) / 2, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, 0, ); overlay.setOrigin(0.5, 0.5); @@ -159,8 +159,8 @@ export abstract class ModalUiHandler extends UiHandler { const width = this.getWidth(config); const height = this.getHeight(config); this.modalContainer.setPosition( - (globalScene.game.canvas.width / 6 - (width + (marginRight - marginLeft))) / 2, - (-globalScene.game.canvas.height / 6 - (height + (marginBottom - marginTop))) / 2, + (globalScene.scaledCanvas.width - (width + (marginRight - marginLeft))) / 2, + (-globalScene.scaledCanvas.height - (height + (marginBottom - marginTop))) / 2, ); this.modalBg.setSize(width, height); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index d90b3310fb0..6edd7d5d70d 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -86,10 +86,7 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { transferButtonText.setOrigin(1, 0); this.transferButtonContainer.add(transferButtonText); - this.checkButtonContainer = globalScene.add.container( - globalScene.game.canvas.width / 6 - 1, - OPTION_BUTTON_YPOSITION, - ); + this.checkButtonContainer = globalScene.add.container(globalScene.scaledCanvas.width - 1, OPTION_BUTTON_YPOSITION); this.checkButtonContainer.setName("use-btn"); this.checkButtonContainer.setVisible(false); ui.add(this.checkButtonContainer); @@ -129,8 +126,8 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { this.lockRarityButtonContainer.add(this.lockRarityButtonText); this.continueButtonContainer = globalScene.add.container( - globalScene.game.canvas.width / 12, - -(globalScene.game.canvas.height / 12), + globalScene.scaledCanvas.width / 2, + -(globalScene.scaledCanvas.height / 2), ); this.continueButtonContainer.setVisible(false); ui.add(this.continueButtonContainer); @@ -146,15 +143,13 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { this.continueButtonContainer.add(continueButtonText); // prepare move overlay - const overlayScale = 1; this.moveInfoOverlay = new MoveInfoOverlay({ delayVisibility: true, - scale: overlayScale, onSide: true, right: true, x: 1, - y: -MoveInfoOverlay.getHeight(overlayScale, true) - 1, - width: globalScene.game.canvas.width / 6 - 2, + y: -MoveInfoOverlay.getHeight(true) - 1, + width: globalScene.scaledCanvas.width - 2, }); ui.add(this.moveInfoOverlay); // register the overlay to receive toggle events @@ -219,10 +214,10 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { shopTypeOptions.length > SHOP_OPTIONS_ROW_LIMIT ? -SINGLE_SHOP_ROW_YOFFSET : -DOUBLE_SHOP_ROW_YOFFSET; for (let m = 0; m < typeOptions.length; m++) { - const sliceWidth = globalScene.game.canvas.width / 6 / (typeOptions.length + 2); + const sliceWidth = globalScene.scaledCanvas.width / (typeOptions.length + 2); const option = new ModifierOption( sliceWidth * (m + 1) + sliceWidth * 0.5, - -globalScene.game.canvas.height / 12 + optionsYOffset, + -globalScene.scaledCanvas.height / 2 + optionsYOffset, typeOptions[m], ); option.setScale(0.5); @@ -243,10 +238,10 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { row ? SHOP_OPTIONS_ROW_LIMIT : 0, row ? undefined : SHOP_OPTIONS_ROW_LIMIT, ); - const sliceWidth = globalScene.game.canvas.width / 6 / (rowOptions.length + 2); + const sliceWidth = globalScene.scaledCanvas.width / (rowOptions.length + 2); const option = new ModifierOption( sliceWidth * (col + 1) + sliceWidth * 0.5, - -globalScene.game.canvas.height / 12 - globalScene.game.canvas.height / 32 - (42 - (28 * row - 1)), + -globalScene.scaledCanvas.height / 2 - globalScene.game.canvas.height / 32 - (42 - (28 * row - 1)), shopTypeOptions[m], ); option.setScale(0.375); @@ -558,27 +553,27 @@ export class ModifierSelectUiHandler extends AwaitableUiHandler { // Continue button when no shop items this.cursorObj.setScale(1.25); this.cursorObj.setPosition( - globalScene.game.canvas.width / 18 + 23, - -globalScene.game.canvas.height / 12 - + globalScene.scaledCanvas.width / 3 + 23, + -globalScene.scaledCanvas.height / 2 - (this.shopOptionsRows.length > 1 ? SINGLE_SHOP_ROW_YOFFSET - 2 : DOUBLE_SHOP_ROW_YOFFSET - 2), ); ui.showText(i18next.t("modifierSelectUiHandler:continueNextWaveDescription")); return ret; } - const sliceWidth = globalScene.game.canvas.width / 6 / (options.length + 2); + const sliceWidth = globalScene.scaledCanvas.width / (options.length + 2); if (this.rowCursor < 2) { // Cursor on free items this.cursorObj.setPosition( sliceWidth * (cursor + 1) + sliceWidth * 0.5 - 20, - -globalScene.game.canvas.height / 12 - + -globalScene.scaledCanvas.height / 2 - (this.shopOptionsRows.length > 1 ? SINGLE_SHOP_ROW_YOFFSET - 2 : DOUBLE_SHOP_ROW_YOFFSET - 2), ); } else { // Cursor on paying items this.cursorObj.setPosition( sliceWidth * (cursor + 1) + sliceWidth * 0.5 - 16, - -globalScene.game.canvas.height / 12 - + -globalScene.scaledCanvas.height / 2 - globalScene.game.canvas.height / 32 - (-14 + 28 * (this.rowCursor - (this.shopOptionsRows.length - 1))), ); diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts index f8632eb244e..f98630260db 100644 --- a/src/ui/move-info-overlay.ts +++ b/src/ui/move-info-overlay.ts @@ -10,17 +10,24 @@ import { fixedInt, getLocalizedSpriteKey } from "#utils/common"; import i18next from "i18next"; export interface MoveInfoOverlaySettings { - delayVisibility?: boolean; // if true, showing the overlay will only set it to active and populate the fields and the handler using this field has to manually call setVisible later. - scale?: number; // scale the box? A scale of 0.5 is recommended - top?: boolean; // should the effect box be on top? - right?: boolean; // should the effect box be on the right? - onSide?: boolean; // should the effect be on the side? ignores top argument if true - //location and width of the component; unaffected by scaling + /** + * If true, showing the overlay will only set it to active and populate the fields + * and the handler using this field has to manually call `setVisible` later. + */ + delayVisibility?: boolean; + /** Whether the effect box should be on top */ + top?: boolean; + /** Whether the effect box should be on the right */ + right?: boolean; + /** Whether the effect box should be on the side. Overrides the `top` param if `true`. */ + onSide?: boolean; + /** `x` position of the component, unaffected by scaling */ x?: number; + /** `y` position of the component, unaffected by scaling */ y?: number; - /** Default is always half the screen, regardless of scale */ + /** Width of the component, unaffected by scaling. Defaults to half the screen width. */ width?: number; - /** Determines whether to display the small secondary box */ + /** Whether to display the small secondary box */ hideEffectBox?: boolean; hideBg?: boolean; } @@ -54,12 +61,11 @@ export class MoveInfoOverlay extends Phaser.GameObjects.Container implements Inf options.top = false; } super(globalScene, options?.x, options?.y); - const scale = options?.scale || 1; // set up the scale - this.setScale(scale); + this.setScale(1); this.options = options || {}; // prepare the description box - const width = (options?.width || MoveInfoOverlay.getWidth(scale)) / scale; // divide by scale as we always want this to be half a window wide + const width = options?.width || MoveInfoOverlay.getWidth(); // we always want this to be half a window wide this.descBg = addWindow( options?.onSide && !options?.right ? EFF_WIDTH : 0, options?.top ? EFF_HEIGHT : 0, @@ -88,19 +94,19 @@ export class MoveInfoOverlay extends Phaser.GameObjects.Container implements Inf y: options?.y || 0, }; if (maskPointOrigin.x < 0) { - maskPointOrigin.x += globalScene.game.canvas.width / GLOBAL_SCALE; + maskPointOrigin.x += globalScene.scaledCanvas.width; } if (maskPointOrigin.y < 0) { - maskPointOrigin.y += globalScene.game.canvas.height / GLOBAL_SCALE; + maskPointOrigin.y += globalScene.scaledCanvas.height; } const moveDescriptionTextMaskRect = globalScene.make.graphics(); moveDescriptionTextMaskRect.fillStyle(0xff0000); moveDescriptionTextMaskRect.fillRect( - maskPointOrigin.x + ((options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER) * scale, - maskPointOrigin.y + ((options?.top ? EFF_HEIGHT : 0) + BORDER - 2) * scale, - width - ((options?.onSide ? EFF_WIDTH : 0) - BORDER * 2) * scale, - (DESC_HEIGHT - (BORDER - 2) * 2) * scale, + maskPointOrigin.x + ((options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER), + maskPointOrigin.y + ((options?.top ? EFF_HEIGHT : 0) + BORDER - 2), + width - ((options?.onSide ? EFF_WIDTH : 0) - BORDER * 2), + DESC_HEIGHT - (BORDER - 2) * 2, ); moveDescriptionTextMaskRect.setScale(6); const moveDescriptionTextMask = this.createGeometryMask(moveDescriptionTextMaskRect); @@ -233,12 +239,12 @@ export class MoveInfoOverlay extends Phaser.GameObjects.Container implements Inf } // width of this element - static getWidth(_scale: number): number { - return globalScene.game.canvas.width / GLOBAL_SCALE / 2; + static getWidth(): number { + return globalScene.scaledCanvas.width / 2; } // height of this element - static getHeight(scale: number, onSide?: boolean): number { - return (onSide ? Math.max(EFF_HEIGHT, DESC_HEIGHT) : EFF_HEIGHT + DESC_HEIGHT) * scale; + static getHeight(onSide?: boolean): number { + return onSide ? Math.max(EFF_HEIGHT, DESC_HEIGHT) : EFF_HEIGHT + DESC_HEIGHT; } } diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index b6bc464855c..881c375fa8a 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -471,7 +471,7 @@ export class MysteryEncounterUiHandler extends UiHandler { // View Party Button const viewPartyText = addBBCodeTextObject( - globalScene.game.canvas.width / 6, + globalScene.scaledCanvas.width, -24, getBBCodeFrag(i18next.t("mysteryEncounterMessages:view_party_button"), TextStyle.PARTY), TextStyle.PARTY, diff --git a/src/ui/party-exp-bar.ts b/src/ui/party-exp-bar.ts index 952a1f8227a..c9567ceb042 100644 --- a/src/ui/party-exp-bar.ts +++ b/src/ui/party-exp-bar.ts @@ -14,7 +14,7 @@ export class PartyExpBar extends Phaser.GameObjects.Container { public shown: boolean; constructor() { - super(globalScene, globalScene.game.canvas.width / 6, -(globalScene.game.canvas.height / 6) + 15); + super(globalScene, globalScene.scaledCanvas.width, -globalScene.scaledCanvas.height + 15); } setup(): void { @@ -66,7 +66,7 @@ export class PartyExpBar extends Phaser.GameObjects.Container { this.tween = globalScene.tweens.add({ targets: this, - x: globalScene.game.canvas.width / 6 - (this.bg.width - 5), + x: globalScene.scaledCanvas.width - (this.bg.width - 5), duration: 500 / Math.pow(2, globalScene.expGainsSpeed), ease: "Sine.easeOut", onComplete: () => { @@ -92,7 +92,7 @@ export class PartyExpBar extends Phaser.GameObjects.Container { this.tween = globalScene.tweens.add({ targets: this, - x: globalScene.game.canvas.width / 6, + x: globalScene.scaledCanvas.width, duration: 500, ease: "Sine.easeIn", onComplete: () => { diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index c50065e5812..ff5e7246a6f 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -311,7 +311,7 @@ export class PartyUiHandler extends MessageUiHandler { this.partyCancelButton = partyCancelButton; - this.optionsContainer = globalScene.add.container(globalScene.game.canvas.width / 6 - 1, -1); + this.optionsContainer = globalScene.add.container(globalScene.scaledCanvas.width - 1, -1); partyContainer.add(this.optionsContainer); this.iconAnimHandler = new PokemonIconAnimHandler(); @@ -323,14 +323,12 @@ export class PartyUiHandler extends MessageUiHandler { this.partyDiscardModeButton = partyDiscardModeButton; - // prepare move overlay. in case it appears to be too big, set the overlayScale to .5 - const overlayScale = 1; + // prepare move overlay this.moveInfoOverlay = new MoveInfoOverlay({ - scale: overlayScale, top: true, x: 1, - y: -MoveInfoOverlay.getHeight(overlayScale) - 1, - width: globalScene.game.canvas.width / 12 - 30, + y: -MoveInfoOverlay.getHeight() - 1, + width: globalScene.scaledCanvas.width / 2 - 30, }); ui.add(this.moveInfoOverlay); diff --git a/src/ui/pokeball-tray.ts b/src/ui/pokeball-tray.ts index 9720aa42090..b1522af0e27 100644 --- a/src/ui/pokeball-tray.ts +++ b/src/ui/pokeball-tray.ts @@ -10,7 +10,7 @@ export class PokeballTray extends Phaser.GameObjects.Container { public shown: boolean; constructor(player: boolean) { - super(globalScene, player ? globalScene.game.canvas.width / 6 : 0, player ? -72 : -144); + super(globalScene, player ? globalScene.scaledCanvas.width : 0, player ? -72 : -144); this.player = player; } @@ -36,7 +36,7 @@ export class PokeballTray extends Phaser.GameObjects.Container { .map((_, i) => globalScene.add.sprite( (this.player ? -83 : 76) + - (globalScene.game.canvas.width / 6) * (this.player ? -1 : 1) + + globalScene.scaledCanvas.width * (this.player ? -1 : 1) + 10 * i * (this.player ? 1 : -1), -8, "pb_tray_ball", @@ -67,7 +67,7 @@ export class PokeballTray extends Phaser.GameObjects.Container { this.bg.alpha = 1; this.balls.forEach((ball, b) => { - ball.x += (globalScene.game.canvas.width / 6 + 104) * (this.player ? 1 : -1); + ball.x += (globalScene.scaledCanvas.width + 104) * (this.player ? 1 : -1); let ballFrame = "ball"; if (b >= party.length) { ballFrame = "empty"; @@ -115,7 +115,7 @@ export class PokeballTray extends Phaser.GameObjects.Container { this.balls.forEach((ball, b) => { globalScene.tweens.add({ targets: ball, - x: `${this.player ? "-" : "+"}=${globalScene.game.canvas.width / 6}`, + x: `${this.player ? "-" : "+"}=${globalScene.scaledCanvas.width}`, duration: 250, delay: b * 100, ease: "Sine.easeIn", diff --git a/src/ui/pokedex-info-overlay.ts b/src/ui/pokedex-info-overlay.ts index 0f2f5fa3dde..9c5876318ec 100644 --- a/src/ui/pokedex-info-overlay.ts +++ b/src/ui/pokedex-info-overlay.ts @@ -7,7 +7,6 @@ import { fixedInt } from "#utils/common"; export interface PokedexInfoOverlaySettings { delayVisibility?: boolean; // if true, showing the overlay will only set it to active and populate the fields and the handler using this field has to manually call setVisible later. - scale?: number; // scale the box? A scale of 0.5 is recommended //location and width of the component; unaffected by scaling x?: number; y?: number; @@ -36,17 +35,15 @@ export class PokedexInfoOverlay extends Phaser.GameObjects.Container implements private maskPointOriginX: number; private maskPointOriginY: number; - public scale: number; public width: number; constructor(options?: PokedexInfoOverlaySettings) { super(globalScene, options?.x, options?.y); - this.scale = options?.scale || 1; // set up the scale - this.setScale(this.scale); + this.setScale(1); this.options = options || {}; // prepare the description box - this.width = (options?.width || PokedexInfoOverlay.getWidth(this.scale)) / this.scale; // divide by scale as we always want this to be half a window wide + this.width = options?.width || PokedexInfoOverlay.getWidth(); // we always want this to be half a window wide this.descBg = addWindow(0, 0, this.width, DESC_HEIGHT); this.descBg.setOrigin(0, 0); this.add(this.descBg); @@ -61,19 +58,19 @@ export class PokedexInfoOverlay extends Phaser.GameObjects.Container implements this.maskPointOriginY = options?.y || 0; if (this.maskPointOriginX < 0) { - this.maskPointOriginX += globalScene.game.canvas.width / GLOBAL_SCALE; + this.maskPointOriginX += globalScene.scaledCanvas.width; } if (this.maskPointOriginY < 0) { - this.maskPointOriginY += globalScene.game.canvas.height / GLOBAL_SCALE; + this.maskPointOriginY += globalScene.scaledCanvas.height; } this.textMaskRect = globalScene.make.graphics(); this.textMaskRect.fillStyle(0xff0000); this.textMaskRect.fillRect( - this.maskPointOriginX + BORDER * this.scale, - this.maskPointOriginY + (BORDER - 2) * this.scale, - this.width - BORDER * 2 * this.scale, - (DESC_HEIGHT - (BORDER - 2) * 2) * this.scale, + this.maskPointOriginX + BORDER, + this.maskPointOriginY + (BORDER - 2), + this.width - BORDER * 2, + DESC_HEIGHT - (BORDER - 2) * 2, ); this.textMaskRect.setScale(6); const textMask = this.createGeometryMask(this.textMaskRect); @@ -111,10 +108,10 @@ export class PokedexInfoOverlay extends Phaser.GameObjects.Container implements this.textMaskRect.clear(); this.textMaskRect.fillStyle(0xff0000); this.textMaskRect.fillRect( - this.maskPointOriginX + BORDER * this.scale, - this.maskPointOriginY + (BORDER - 2) * this.scale + (48 - newHeight), - this.width - BORDER * 2 * this.scale, - (newHeight - (BORDER - 2) * 2) * this.scale, + this.maskPointOriginX + BORDER, + this.maskPointOriginY + (BORDER - 2) + (48 - newHeight), + this.width - BORDER * 2, + newHeight - (BORDER - 2) * 2, ); const updatedMask = this.createGeometryMask(this.textMaskRect); this.desc.setMask(updatedMask); @@ -167,12 +164,12 @@ export class PokedexInfoOverlay extends Phaser.GameObjects.Container implements } // width of this element - static getWidth(_scale: number): number { - return globalScene.game.canvas.width / GLOBAL_SCALE / 2; + static getWidth(): number { + return globalScene.scaledCanvas.width / 2; } // height of this element - static getHeight(scale: number, _onSide?: boolean): number { - return DESC_HEIGHT * scale; + static getHeight(): number { + return DESC_HEIGHT; } } diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 227b86c4d4d..fbfb6b615a4 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -299,15 +299,15 @@ export class PokedexPageUiHandler extends MessageUiHandler { const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)) ?? "en"; const textSettings = languageSettings[langSettingKey]; - this.starterSelectContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.starterSelectContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); this.starterSelectContainer.setVisible(false); ui.add(this.starterSelectContainer); const bgColor = globalScene.add.rectangle( 0, 0, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, 0x006860, ); bgColor.setOrigin(0, 0); @@ -602,7 +602,7 @@ export class PokedexPageUiHandler extends MessageUiHandler { this.filterInstructionsContainer.setVisible(true); this.starterSelectContainer.add(this.filterInstructionsContainer); - this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.scaledCanvas.height); this.starterSelectMessageBoxContainer.setVisible(false); this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); @@ -629,7 +629,7 @@ export class PokedexPageUiHandler extends MessageUiHandler { this.menuContainer = globalScene.add.container(-130, 0); this.menuContainer.setName("menu"); this.menuContainer.setInteractive( - new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + new Phaser.Geom.Rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height), Phaser.Geom.Rectangle.Contains, ); @@ -659,10 +659,10 @@ export class PokedexPageUiHandler extends MessageUiHandler { this.scale = getTextStyleOptions(TextStyle.WINDOW, globalScene.uiTheme).scale; this.menuBg = addWindow( - globalScene.game.canvas.width / 6 - 83, + globalScene.scaledCanvas.width - 83, 0, this.optionSelectText.displayWidth + 19 + 24 * this.scale, - globalScene.game.canvas.height / 6 - 2, + globalScene.scaledCanvas.height - 2, ); this.menuBg.setOrigin(0, 0); @@ -682,19 +682,16 @@ export class PokedexPageUiHandler extends MessageUiHandler { this.menuContainer.bringToTop(this.baseStatsOverlay); // add the info overlay last to be the top most ui element and prevent the IVs from overlaying this - const overlayScale = 1; this.moveInfoOverlay = new MoveInfoOverlay({ - scale: overlayScale, top: true, x: 1, - y: globalScene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, + y: globalScene.scaledCanvas.height - MoveInfoOverlay.getHeight() - 29, }); this.starterSelectContainer.add(this.moveInfoOverlay); this.infoOverlay = new PokedexInfoOverlay({ - scale: overlayScale, x: 1, - y: globalScene.game.canvas.height / 6 - PokedexInfoOverlay.getHeight(overlayScale) - 29, + y: globalScene.scaledCanvas.height - PokedexInfoOverlay.getHeight() - 29, }); this.starterSelectContainer.add(this.infoOverlay); @@ -1103,7 +1100,7 @@ export class PokedexPageUiHandler extends MessageUiHandler { this.starterSelectMessageBoxContainer.setY(0); this.message.setY(4); } else { - this.starterSelectMessageBoxContainer.setY(globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer.setY(globalScene.scaledCanvas.height); this.starterSelectMessageBox.setOrigin(0, 1); this.message.setY(singleLine ? -22 : -37); } diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index cd1dc312f4d..75a3e5162e3 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -245,15 +245,15 @@ export class PokedexUiHandler extends MessageUiHandler { const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage.includes(lang)) ?? "en"; const textSettings = languageSettings[langSettingKey]; - this.starterSelectContainer = globalScene.add.container(0, -globalScene.game.canvas.height / 6); + this.starterSelectContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); this.starterSelectContainer.setVisible(false); ui.add(this.starterSelectContainer); const bgColor = globalScene.add.rectangle( 0, 0, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6, + globalScene.scaledCanvas.width, + globalScene.scaledCanvas.height, 0x006860, ); bgColor.setOrigin(0, 0); @@ -544,7 +544,7 @@ export class PokedexUiHandler extends MessageUiHandler { this.type2Icon.setOrigin(0, 0); this.starterSelectContainer.add(this.type2Icon); - this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer = globalScene.add.container(0, globalScene.scaledCanvas.height); this.starterSelectMessageBoxContainer.setVisible(false); this.starterSelectContainer.add(this.starterSelectMessageBoxContainer); @@ -784,7 +784,7 @@ export class PokedexUiHandler extends MessageUiHandler { this.starterSelectMessageBoxContainer.setY(0); this.message.setY(4); } else { - this.starterSelectMessageBoxContainer.setY(globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer.setY(globalScene.scaledCanvas.height); this.starterSelectMessageBox.setOrigin(0, 1); this.message.setY(singleLine ? -22 : -37); } diff --git a/src/ui/run-history-ui-handler.ts b/src/ui/run-history-ui-handler.ts index 00aa47ae65d..457c48654a3 100644 --- a/src/ui/run-history-ui-handler.ts +++ b/src/ui/run-history-ui-handler.ts @@ -54,14 +54,14 @@ export class RunHistoryUiHandler extends MessageUiHandler { const loadSessionBg = globalScene.add.rectangle( 0, 0, - globalScene.game.canvas.width / 6, - -globalScene.game.canvas.height / 6, + globalScene.scaledCanvas.width, + -globalScene.scaledCanvas.height, 0x006860, ); loadSessionBg.setOrigin(0, 0); this.runSelectContainer.add(loadSessionBg); - this.runContainerInitialY = -globalScene.game.canvas.height / 6 + 8; + this.runContainerInitialY = -globalScene.scaledCanvas.height + 8; this.runsContainer = globalScene.add.container(8, this.runContainerInitialY); this.runSelectContainer.add(this.runsContainer); diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 465e48a45ad..667a22a001a 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -74,7 +74,7 @@ export class RunInfoUiHandler extends UiHandler { } override async setup() { - this.runContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); + this.runContainer = globalScene.add.container(1, -globalScene.scaledCanvas.height + 1); // The import of the modifiersModule is loaded here to sidestep async/await issues. this.modifiersModule = Modifier; this.runContainer.setVisible(false); @@ -120,7 +120,7 @@ export class RunInfoUiHandler extends UiHandler { // Creates Header and adds to this.runContainer this.addHeader(); - this.statsBgWidth = (globalScene.game.canvas.width / 6 - 2) / 3; + this.statsBgWidth = (globalScene.scaledCanvas.width - 2) / 3; // Creates Run Result Container this.runResultContainer = globalScene.add.container(0, 24); @@ -147,7 +147,7 @@ export class RunInfoUiHandler extends UiHandler { this.showParty(true); this.runContainer.setInteractive( - new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + new Phaser.Geom.Rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height), Phaser.Geom.Rectangle.Contains, ); this.getUi().bringToTop(this.runContainer); @@ -174,7 +174,7 @@ export class RunInfoUiHandler extends UiHandler { * It does not check if the run has any PokemonHeldItemModifiers though. */ private addHeader() { - const headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6 - 2, 24); + const headerBg = addWindow(0, 0, globalScene.scaledCanvas.width - 2, 24); headerBg.setOrigin(0, 0); this.runContainer.add(headerBg); if (this.runInfo.modifiers.length !== 0) { @@ -723,7 +723,7 @@ export class RunInfoUiHandler extends UiHandler { private parsePartyInfo(): void { const party = this.runInfo.party; const currentLanguage = i18next.resolvedLanguage ?? "en"; - const windowHeight = (globalScene.game.canvas.height / 6 - 23) / 6; + const windowHeight = (globalScene.scaledCanvas.height - 23) / 6; party.forEach((p: PokemonData, i: number) => { const pokemonInfoWindow = new RoundRectangle(globalScene, 0, 14, this.statsBgWidth * 2 + 10, windowHeight - 2, 3); @@ -971,8 +971,8 @@ export class RunInfoUiHandler extends UiHandler { endCard.setOrigin(0); endCard.setScale(0.5); const text = addTextObject( - globalScene.game.canvas.width / 12, - globalScene.game.canvas.height / 6 - 16, + globalScene.scaledCanvas.width / 2, + globalScene.scaledCanvas.height - 16, i18next.t("battle:congratulations"), TextStyle.SUMMARY, { fontSize: "128px" }, diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 9da34e672f1..5b1566b4913 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -54,14 +54,14 @@ export class SaveSlotSelectUiHandler extends MessageUiHandler { const loadSessionBg = globalScene.add.rectangle( 0, 0, - globalScene.game.canvas.width / 6, - -globalScene.game.canvas.height / 6, + globalScene.scaledCanvas.width, + -globalScene.scaledCanvas.height, 0x006860, ); loadSessionBg.setOrigin(0, 0); this.saveSlotSelectContainer.add(loadSessionBg); - this.sessionSlotsContainerInitialY = -globalScene.game.canvas.height / 6 + 8; + this.sessionSlotsContainerInitialY = -globalScene.scaledCanvas.height + 8; this.sessionSlotsContainer = globalScene.add.container(8, this.sessionSlotsContainerInitialY); this.saveSlotSelectContainer.add(this.sessionSlotsContainer); diff --git a/src/ui/saving-icon-handler.ts b/src/ui/saving-icon-handler.ts index 6923017218f..00c8b8b526c 100644 --- a/src/ui/saving-icon-handler.ts +++ b/src/ui/saving-icon-handler.ts @@ -8,7 +8,7 @@ export class SavingIconHandler extends Phaser.GameObjects.Container { private shown: boolean; constructor() { - super(globalScene, globalScene.game.canvas.width / 6 - 4, globalScene.game.canvas.height / 6 - 4); + super(globalScene, globalScene.scaledCanvas.width - 4, globalScene.scaledCanvas.height - 4); } setup(): void { diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index eb68456a69d..b2bda2455bb 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -73,8 +73,8 @@ export abstract class AbstractBindingUiHandler extends UiHandler { // Setup backgrounds and text objects for UI. this.titleBg = addWindow( - globalScene.game.canvas.width / 6 - this.getWindowWidth(), - -(globalScene.game.canvas.height / 6) + 28 + 21, + globalScene.scaledCanvas.width - this.getWindowWidth(), + -globalScene.scaledCanvas.height + 28 + 21, this.getWindowWidth(), 24, ); @@ -82,8 +82,8 @@ export abstract class AbstractBindingUiHandler extends UiHandler { this.optionSelectContainer.add(this.titleBg); this.actionBg = addWindow( - globalScene.game.canvas.width / 6 - this.getWindowWidth(), - -(globalScene.game.canvas.height / 6) + this.getWindowHeight() + 28 + 21 + 21, + globalScene.scaledCanvas.width - this.getWindowWidth(), + -globalScene.scaledCanvas.height + this.getWindowHeight() + 28 + 21 + 21, this.getWindowWidth(), 24, ); @@ -102,8 +102,8 @@ export abstract class AbstractBindingUiHandler extends UiHandler { this.optionSelectContainer.add(this.timerText); this.optionSelectBg = addWindow( - globalScene.game.canvas.width / 6 - this.getWindowWidth(), - -(globalScene.game.canvas.height / 6) + this.getWindowHeight() + 28, + globalScene.scaledCanvas.width - this.getWindowWidth(), + -globalScene.scaledCanvas.height + this.getWindowHeight() + 28, this.getWindowWidth(), this.getWindowHeight(), ); diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index ee9e990ee2a..b40676fc97c 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -96,11 +96,11 @@ export abstract class AbstractControlSettingsUiHandler extends UiHandler { const ui = this.getUi(); this.navigationIcons = {}; - this.settingsContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); + this.settingsContainer = globalScene.add.container(1, -globalScene.scaledCanvas.height + 1); this.settingsContainer.setName(`settings-${this.titleSelected}`); this.settingsContainer.setInteractive( - new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6), + new Phaser.Geom.Rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height), Phaser.Geom.Rectangle.Contains, ); @@ -109,15 +109,15 @@ export abstract class AbstractControlSettingsUiHandler extends UiHandler { this.optionsBg = addWindow( 0, this.navigationContainer.height, - globalScene.game.canvas.width / 6 - 2, - globalScene.game.canvas.height / 6 - 16 - this.navigationContainer.height - 2, + globalScene.scaledCanvas.width - 2, + globalScene.scaledCanvas.height - 16 - this.navigationContainer.height - 2, ); this.optionsBg.setOrigin(0, 0); this.actionsBg = addWindow( 0, - globalScene.game.canvas.height / 6 - this.navigationContainer.height, - globalScene.game.canvas.width / 6 - 2, + globalScene.scaledCanvas.height - this.navigationContainer.height, + globalScene.scaledCanvas.width - 2, 22, ); this.actionsBg.setOrigin(0, 0); @@ -597,7 +597,7 @@ export abstract class AbstractControlSettingsUiHandler extends UiHandler { // Check if the cursor object exists, if not, create it. if (!this.cursorObj) { - const cursorWidth = globalScene.game.canvas.width / 6 - (this.scrollBar.visible ? 16 : 10); + const cursorWidth = globalScene.scaledCanvas.width - (this.scrollBar.visible ? 16 : 10); this.cursorObj = globalScene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); // Set the origin to the top-left corner. this.optionsContainer.add(this.cursorObj); // Add the cursor to the options container. diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 81d733220fc..91d5aec984a 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -56,10 +56,10 @@ export class AbstractSettingsUiHandler extends MessageUiHandler { setup() { const ui = this.getUi(); - this.settingsContainer = globalScene.add.container(1, -(globalScene.game.canvas.height / 6) + 1); + this.settingsContainer = globalScene.add.container(1, -globalScene.scaledCanvas.height + 1); this.settingsContainer.setName(`settings-${this.title}`); this.settingsContainer.setInteractive( - new Phaser.Geom.Rectangle(0, 0, globalScene.game.canvas.width / 6, globalScene.game.canvas.height / 6 - 20), + new Phaser.Geom.Rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height - 20), Phaser.Geom.Rectangle.Contains, ); @@ -70,16 +70,16 @@ export class AbstractSettingsUiHandler extends MessageUiHandler { this.optionsBg = addWindow( 0, this.navigationContainer.height, - globalScene.game.canvas.width / 6 - 2, - globalScene.game.canvas.height / 6 - 16 - this.navigationContainer.height - 2, + globalScene.scaledCanvas.width - 2, + globalScene.scaledCanvas.height - 16 - this.navigationContainer.height - 2, ); this.optionsBg.setName("window-options-bg"); this.optionsBg.setOrigin(0, 0); const actionsBg = addWindow( 0, - globalScene.game.canvas.height / 6 - this.navigationContainer.height, - globalScene.game.canvas.width / 6 - 2, + globalScene.scaledCanvas.height - this.navigationContainer.height, + globalScene.scaledCanvas.width - 2, 22, ); actionsBg.setOrigin(0, 0); @@ -375,7 +375,7 @@ export class AbstractSettingsUiHandler extends MessageUiHandler { const ret = super.setCursor(cursor); if (!this.cursorObj) { - const cursorWidth = globalScene.game.canvas.width / 6 - (this.scrollBar.visible ? 16 : 10); + const cursorWidth = globalScene.scaledCanvas.width - (this.scrollBar.visible ? 16 : 10); this.cursorObj = globalScene.add.nineslice(0, 0, "summary_moves_cursor", undefined, cursorWidth, 16, 1, 1, 1, 1); this.cursorObj.setOrigin(0, 0); this.optionsContainer.add(this.cursorObj); diff --git a/src/ui/settings/navigation-menu.ts b/src/ui/settings/navigation-menu.ts index 2f3aa50f7f3..b889ce57b61 100644 --- a/src/ui/settings/navigation-menu.ts +++ b/src/ui/settings/navigation-menu.ts @@ -124,7 +124,7 @@ export class NavigationMenu extends Phaser.GameObjects.Container { */ setup() { const navigationManager = NavigationManager.getInstance(); - const headerBg = addWindow(0, 0, globalScene.game.canvas.width / 6 - 2, 24); + const headerBg = addWindow(0, 0, globalScene.scaledCanvas.width - 2, 24); headerBg.setOrigin(0, 0); this.add(headerBg); this.width = headerBg.width; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 0827d5dd697..d4690005c5b 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1050,12 +1050,10 @@ export class StarterSelectUiHandler extends MessageUiHandler { globalScene.add.existing(this.statsContainer); // add the info overlay last to be the top most ui element and prevent the IVs from overlaying this - const overlayScale = 1; this.moveInfoOverlay = new MoveInfoOverlay({ - scale: overlayScale, top: true, x: 1, - y: globalScene.game.canvas.height / 6 - MoveInfoOverlay.getHeight(overlayScale) - 29, + y: globalScene.scaledCanvas.height / 6 - MoveInfoOverlay.getHeight() - 29, }); this.starterSelectContainer.add([ @@ -1311,7 +1309,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.starterSelectMessageBoxContainer.setY(0); this.message.setY(4); } else { - this.starterSelectMessageBoxContainer.setY(globalScene.game.canvas.height / 6); + this.starterSelectMessageBoxContainer.setY(globalScene.scaledCanvas.height); this.starterSelectMessageBox.setOrigin(0, 1); this.message.setY(singleLine ? -22 : -37); } diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index 66cb69f6a26..ab7a4d020fa 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -36,12 +36,12 @@ export class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); - this.titleContainer = globalScene.add.container(0, -(globalScene.game.canvas.height / 6)); + this.titleContainer = globalScene.add.container(0, -globalScene.scaledCanvas.height); this.titleContainer.setName("title"); this.titleContainer.setAlpha(0); ui.add(this.titleContainer); - const logo = globalScene.add.image(globalScene.game.canvas.width / 6 / 2, 8, "logo"); + const logo = globalScene.add.image(globalScene.scaledCanvas.width / 2, 8, "logo"); logo.setOrigin(0.5, 0); this.titleContainer.add(logo); @@ -53,7 +53,7 @@ export class TitleUiHandler extends OptionSelectUiHandler { this.playerCountLabel = addTextObject( // Actual y position will be determined after the title menu has been populated with options - globalScene.game.canvas.width / 6 - 2, + globalScene.scaledCanvas.width - 2, 0, `? ${i18next.t("menu:playersOnline")}`, TextStyle.MESSAGE, @@ -131,7 +131,7 @@ export class TitleUiHandler extends OptionSelectUiHandler { if (ret) { // Moving player count to top of the menu - this.playerCountLabel.setY(globalScene.game.canvas.height / 6 - 13 - this.getWindowHeight()); + this.playerCountLabel.setY(globalScene.scaledCanvas.height - 13 - this.getWindowHeight()); this.splashMessage = randItem(getSplashMessages()); this.splashMessageText.setText( diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 847294dcfc6..d5baea07ed5 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -123,7 +123,7 @@ export class UI extends Phaser.GameObjects.Container { private overlayActive: boolean; constructor() { - super(globalScene, 0, globalScene.game.canvas.height / 6); + super(globalScene, 0, globalScene.scaledCanvas.height); this.mode = UiMode.MESSAGE; this.modeChain = []; @@ -183,13 +183,7 @@ export class UI extends Phaser.GameObjects.Container { for (const handler of this.handlers) { handler.setup(); } - this.overlay = globalScene.add.rectangle( - 0, - 0, - globalScene.game.canvas.width / 6, - globalScene.game.canvas.height / 6, - 0, - ); + this.overlay = globalScene.add.rectangle(0, 0, globalScene.scaledCanvas.width, globalScene.scaledCanvas.height, 0); this.overlay.setName("rect-ui-overlay"); this.overlay.setOrigin(0, 0); globalScene.uiContainer.add(this.overlay); @@ -440,15 +434,15 @@ export class UI extends Phaser.GameObjects.Container { if (isTouch) { // If we are in the top left quadrant on mobile, move the tooltip to the top right corner if (pointerX <= globalScene.game.canvas.width / 2 && pointerY <= globalScene.game.canvas.height / 2) { - x = globalScene.game.canvas.width / 6 - tooltipWidth - padding; + x = globalScene.scaledCanvas.width - tooltipWidth - padding; } } else { // If the tooltip would go offscreen on the right, or is close to it, move to the left of the cursor - if (x + tooltipWidth + padding > globalScene.game.canvas.width / 6) { + if (x + tooltipWidth + padding > globalScene.scaledCanvas.width) { x = Math.max(padding, pointerX / 6 - tooltipWidth - padding); } // If the tooltip would go offscreen at the bottom, or is close to it, move above the cursor - if (y + tooltipHeight + padding > globalScene.game.canvas.height / 6) { + if (y + tooltipHeight + padding > globalScene.scaledCanvas.height) { y = Math.max(padding, pointerY / 6 - tooltipHeight - padding); } } From 6e4dd36d5acb46135a483f53f32d59a956c268cf Mon Sep 17 00:00:00 2001 From: fabske0 <192151969+fabske0@users.noreply.github.com> Date: Fri, 8 Aug 2025 02:56:50 +0200 Subject: [PATCH 086/106] [Docs/Misc/i18n] Fix typos (#6231) * fix comment typos * fix typos in variable/parameter/class names * fix typos in object names * fix typos in `console.log()` and i18n key use * fix typo in filename `abstact-option-select-ui-handler.ts` * fix casing of `@privateremarks` to `@privateRemarks` * fix use of `cancelControllerChoice` --- src/@types/move-types.ts | 2 +- src/battle-scene.ts | 4 +-- src/data/abilities/ability.ts | 12 ++++----- .../encounters/bug-type-superfan-encounter.ts | 2 +- .../encounters/clowning-around-encounter.ts | 2 +- .../encounters/dancing-lessons-encounter.ts | 2 +- .../encounters/delibirdy-encounter.ts | 2 +- .../encounters/field-trip-encounter.ts | 2 +- .../global-trade-system-encounter.ts | 2 +- .../encounters/training-session-encounter.ts | 2 +- .../mystery-encounter-option.ts | 2 +- .../mystery-encounters/mystery-encounter.ts | 6 ++--- .../utils/encounter-dialogue-utils.ts | 2 +- .../utils/encounter-phase-utils.ts | 2 +- src/field/pokemon.ts | 26 +++++++++---------- src/modifier/modifier-type.ts | 4 +-- src/modifier/modifier.ts | 10 +++---- src/phase.ts | 2 +- src/phases/command-phase.ts | 4 +-- src/phases/select-biome-phase.ts | 2 +- src/phases/title-phase.ts | 2 +- src/system/settings/settings-gamepad.ts | 2 +- ...s => abstract-option-select-ui-handler.ts} | 0 src/ui/arena-flyout.ts | 10 +++---- src/ui/autocomplete-ui-handler.ts | 2 +- src/ui/battle-info/player-battle-info.ts | 4 +-- src/ui/command-ui-handler.ts | 2 +- src/ui/confirm-ui-handler.ts | 4 +-- src/ui/login-form-ui-handler.ts | 2 +- src/ui/menu-ui-handler.ts | 2 +- src/ui/modifier-select-ui-handler.ts | 2 +- src/ui/pokedex-page-ui-handler.ts | 2 +- src/ui/pokedex-scan-ui-handler.ts | 2 +- src/ui/pokedex-ui-handler.ts | 2 +- src/ui/run-info-ui-handler.ts | 4 +-- src/ui/save-slot-select-ui-handler.ts | 2 +- .../settings/abstract-binding-ui-handler.ts | 2 +- src/ui/settings/option-select-ui-handler.ts | 2 +- src/ui/starter-select-ui-handler.ts | 4 +-- src/ui/summary-ui-handler.ts | 2 +- src/ui/test-dialogue-ui-handler.ts | 8 +++--- test/ui/starter-select.test.ts | 2 +- 42 files changed, 78 insertions(+), 78 deletions(-) rename src/ui/{abstact-option-select-ui-handler.ts => abstract-option-select-ui-handler.ts} (100%) diff --git a/src/@types/move-types.ts b/src/@types/move-types.ts index 5f8d7e8777e..ff44c665e48 100644 --- a/src/@types/move-types.ts +++ b/src/@types/move-types.ts @@ -16,7 +16,7 @@ export type * from "#moves/move"; * Map of move subclass names to their respective classes. * Does not include the ChargeMove subclasses. For that, use `ChargingMoveClassMap`. * - * @privateremarks + * @privateRemarks * The `never` field (`declare private _: never`) in some classes is necessary * to ensure typescript does not improperly narrow a failed `is` guard to `never`. * diff --git a/src/battle-scene.ts b/src/battle-scene.ts index ea15969ce61..271cde1aaa9 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -242,8 +242,8 @@ export class BattleScene extends SceneBase { public battleStyle: BattleStyle = BattleStyle.SWITCH; /** * Defines whether or not to show type effectiveness hints - * - true: No hints - * - false: Show hints for moves + * - true: Show hints for moves + * - false: No hints */ public typeHints = false; diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index 2f57df4a551..336d45fed66 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -1284,7 +1284,7 @@ export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr { /** * Set stat stages when the user gets hit by a critical hit * - * @privateremarks + * @privateRemarks * It is the responsibility of the caller to ensure that this ability attribute is only applied * when the user has been hit by a critical hit; such an event is not checked here. * @@ -2043,7 +2043,7 @@ export class AllyStatMultiplierAbAttr extends AbAttr { /** * @param stat - The stat being modified - * @param multipler - The multiplier to apply to the stat + * @param multiplier - The multiplier to apply to the stat * @param ignorable - Whether the multiplier can be ignored by mold breaker-like moves and abilities */ constructor(stat: BattleStat, multiplier: number, ignorable = true) { @@ -6444,23 +6444,23 @@ export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { public override canApply({ pokemon, source, damage }: PostDamageAbAttrParams): boolean { const moveHistory = pokemon.getMoveHistory(); // Will not activate when the Pokémon's HP is lowered by cutting its own HP - const fordbiddenAttackingMoves = [MoveId.BELLY_DRUM, MoveId.SUBSTITUTE, MoveId.CURSE, MoveId.PAIN_SPLIT]; + const forbiddenAttackingMoves = [MoveId.BELLY_DRUM, MoveId.SUBSTITUTE, MoveId.CURSE, MoveId.PAIN_SPLIT]; if (moveHistory.length > 0) { const lastMoveUsed = moveHistory[moveHistory.length - 1]; - if (fordbiddenAttackingMoves.includes(lastMoveUsed.move)) { + if (forbiddenAttackingMoves.includes(lastMoveUsed.move)) { return false; } } // Dragon Tail and Circle Throw switch out Pokémon before the Ability activates. - const fordbiddenDefendingMoves = [MoveId.DRAGON_TAIL, MoveId.CIRCLE_THROW]; + const forbiddenDefendingMoves = [MoveId.DRAGON_TAIL, MoveId.CIRCLE_THROW]; if (source) { const enemyMoveHistory = source.getMoveHistory(); if (enemyMoveHistory.length > 0) { const enemyLastMoveUsed = enemyMoveHistory[enemyMoveHistory.length - 1]; // Will not activate if the Pokémon's HP falls below half while it is in the air during Sky Drop. if ( - fordbiddenDefendingMoves.includes(enemyLastMoveUsed.move) || + forbiddenDefendingMoves.includes(enemyLastMoveUsed.move) || (enemyLastMoveUsed.move === MoveId.SKY_DROP && enemyLastMoveUsed.result === MoveResult.OTHER) ) { return false; diff --git a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts index d86f1511207..c5553e9bb95 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -46,7 +46,7 @@ import { } from "#mystery-encounters/mystery-encounter-requirements"; import { getRandomPartyMemberFunc, trainerConfigs } from "#trainers/trainer-config"; import { TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#trainers/trainer-party-template"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { MoveInfoOverlay } from "#ui/move-info-overlay"; import { isNullOrUndefined, randSeedInt, randSeedShuffle } from "#utils/common"; import i18next from "i18next"; diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index 1c85cb7595c..092cc4931af 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -45,7 +45,7 @@ import { MysteryEncounterBuilder } from "#mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#mystery-encounters/mystery-encounter-option"; import { trainerConfigs } from "#trainers/trainer-config"; import { TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#trainers/trainer-party-template"; -import type { OptionSelectConfig } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectConfig } from "#ui/abstract-option-select-ui-handler"; import { randSeedInt, randSeedShuffle } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import i18next from "i18next"; diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index 94006a43837..8dae0eaee3a 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -37,7 +37,7 @@ import { MysteryEncounterOptionBuilder } from "#mystery-encounters/mystery-encou import { MoveRequirement } from "#mystery-encounters/mystery-encounter-requirements"; import { DANCING_MOVES } from "#mystery-encounters/requirement-groups"; import { PokemonData } from "#system/pokemon-data"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import i18next from "i18next"; diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index 66f50f134dd..85102a01ce1 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -33,7 +33,7 @@ import { MoneyRequirement, } from "#mystery-encounters/mystery-encounter-requirements"; import i18next from "#plugins/i18n"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { randSeedItem } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 9c655e70b8c..0413c3d0e1d 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -18,7 +18,7 @@ import { import type { MysteryEncounter } from "#mystery-encounters/mystery-encounter"; import { MysteryEncounterBuilder } from "#mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#mystery-encounters/mystery-encounter-option"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import i18next from "i18next"; /** i18n namespace for the encounter */ diff --git a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts index 083a6d06801..ed49fccf190 100644 --- a/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts +++ b/src/data/mystery-encounters/encounters/global-trade-system-encounter.ts @@ -42,7 +42,7 @@ import { MysteryEncounterOptionBuilder } from "#mystery-encounters/mystery-encou import { PartySizeRequirement } from "#mystery-encounters/mystery-encounter-requirements"; import { PokemonData } from "#system/pokemon-data"; import { MusicPreference } from "#system/settings"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { isNullOrUndefined, NumberHolder, randInt, randSeedInt, randSeedItem, randSeedShuffle } from "#utils/common"; import { getPokemonSpecies } from "#utils/pokemon-utils"; import i18next from "i18next"; diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 393f8a24e51..e56c42a3ee5 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -27,7 +27,7 @@ import { MysteryEncounterBuilder } from "#mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#mystery-encounters/mystery-encounter-option"; import { PokemonData } from "#system/pokemon-data"; import type { HeldModifierConfig } from "#types/held-modifier-config"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { isNullOrUndefined, randSeedShuffle } from "#utils/common"; import { getEnumValues } from "#utils/enums"; import i18next from "i18next"; diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 504310eeabd..6ab2f8dae00 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -156,7 +156,7 @@ export class MysteryEncounterOption implements IMysteryEncounterOption { return true; } console.log( - "Mystery Encounter Edge Case: Requirement not met due to primay pokemon overlapping with support pokemon. There's no valid primary pokemon left.", + "Mystery Encounter Edge Case: Requirement not met due to primary pokemon overlapping with support pokemon. There's no valid primary pokemon left.", ); return false; } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 47dfe58cace..580fdc2ca38 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -576,7 +576,7 @@ export class MysteryEncounterBuilder implements Partial { */ /** - * @statif Defines the type of encounter which is used as an identifier, should be tied to a unique MysteryEncounterType + * @static Defines the type of encounter which is used as an identifier, should be tied to a unique MysteryEncounterType * NOTE: if new functions are added to {@linkcode MysteryEncounter} class * @param encounterType * @returns this @@ -605,7 +605,7 @@ export class MysteryEncounterBuilder implements Partial { } /** - * Defines an option + phasefor the encounter. + * Defines an option + phase for the encounter. * Use for easy/streamlined options. * There should be at least 2 options defined and no more than 4. * If complex use {@linkcode MysteryEncounterBuilder.withOption} @@ -627,7 +627,7 @@ export class MysteryEncounterBuilder implements Partial { } /** - * Defines an option + phasefor the encounter. + * Defines an option + phase for the encounter. * Use for easy/streamlined options. * There should be at least 2 options defined and no more than 4. * If complex use {@linkcode MysteryEncounterBuilder.withOption} diff --git a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts index 1ae0659b29e..54179ee2604 100644 --- a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts @@ -6,7 +6,7 @@ import { isNullOrUndefined } from "#utils/common"; import i18next from "i18next"; /** - * Will inject all relevant dialogue tokens that exist in the {@linkcode BattlegScene.currentBattle.mysteryEncounter.dialogueTokens}, into i18n text. + * Will inject all relevant dialogue tokens that exist in the {@linkcode globalScene.currentBattle.mysteryEncounter.dialogueTokens}, into i18n text. * Also adds BBCodeText fragments for colored text, if applicable * @param keyOrString * @param primaryStyle Can define a text style to be applied to the entire string. Must be defined for BBCodeText styles to be applied correctly diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 6b085978b27..b599f923534 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -46,7 +46,7 @@ import type { PokemonData } from "#system/pokemon-data"; import type { TrainerConfig } from "#trainers/trainer-config"; import { trainerConfigs } from "#trainers/trainer-config"; import type { HeldModifierConfig } from "#types/held-modifier-config"; -import type { OptionSelectConfig, OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectConfig, OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import type { PartyOption, PokemonSelectFilter } from "#ui/party-ui-handler"; import { PartyUiMode } from "#ui/party-ui-handler"; import { coerceArray, isNullOrUndefined, randomString, randSeedInt, randSeedItem } from "#utils/common"; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index bc069aa1fc2..fe85e92772c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -4045,7 +4045,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { * @param damage integer * @param ignoreSegments boolean, not currently used * @param preventEndure used to update damage if endure or sturdy - * @param ignoreFaintPhas flag on whether to add FaintPhase if pokemon after applying damage faints + * @param ignoreFaintPhase flag on whether to add FaintPhase if pokemon after applying damage faints * @returns integer representing damage dealt */ damage(damage: number, _ignoreSegments = false, preventEndure = false, ignoreFaintPhase = false): number { @@ -5206,38 +5206,38 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { } } - updateFusionPalette(ignoreOveride?: boolean): void { - if (!this.getFusionSpeciesForm(ignoreOveride)) { + updateFusionPalette(ignoreOverride?: boolean): void { + if (!this.getFusionSpeciesForm(ignoreOverride)) { [this.getSprite(), this.getTintSprite()] .filter(s => !!s) .map(s => { - s.pipelineData[`spriteColors${ignoreOveride && this.summonData.speciesForm ? "Base" : ""}`] = []; - s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData.speciesForm ? "Base" : ""}`] = []; + s.pipelineData[`spriteColors${ignoreOverride && this.summonData.speciesForm ? "Base" : ""}`] = []; + s.pipelineData[`fusionSpriteColors${ignoreOverride && this.summonData.speciesForm ? "Base" : ""}`] = []; }); return; } - const speciesForm = this.getSpeciesForm(ignoreOveride); - const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOveride); + const speciesForm = this.getSpeciesForm(ignoreOverride); + const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOverride); const spriteKey = speciesForm.getSpriteKey( - this.getGender(ignoreOveride) === Gender.FEMALE, + this.getGender(ignoreOverride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant, ); const backSpriteKey = speciesForm - .getSpriteKey(this.getGender(ignoreOveride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant) + .getSpriteKey(this.getGender(ignoreOverride) === Gender.FEMALE, speciesForm.formIndex, this.shiny, this.variant) .replace("pkmn__", "pkmn__back__"); const fusionSpriteKey = fusionSpeciesForm.getSpriteKey( - this.getFusionGender(ignoreOveride) === Gender.FEMALE, + this.getFusionGender(ignoreOverride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant, ); const fusionBackSpriteKey = fusionSpeciesForm .getSpriteKey( - this.getFusionGender(ignoreOveride) === Gender.FEMALE, + this.getFusionGender(ignoreOverride) === Gender.FEMALE, fusionSpeciesForm.formIndex, this.fusionShiny, this.fusionVariant, @@ -5522,8 +5522,8 @@ export abstract class Pokemon extends Phaser.GameObjects.Container { [this.getSprite(), this.getTintSprite()] .filter(s => !!s) .map(s => { - s.pipelineData[`spriteColors${ignoreOveride && this.summonData.speciesForm ? "Base" : ""}`] = spriteColors; - s.pipelineData[`fusionSpriteColors${ignoreOveride && this.summonData.speciesForm ? "Base" : ""}`] = + s.pipelineData[`spriteColors${ignoreOverride && this.summonData.speciesForm ? "Base" : ""}`] = spriteColors; + s.pipelineData[`fusionSpriteColors${ignoreOverride && this.summonData.speciesForm ? "Base" : ""}`] = fusionSpriteColors; }); diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 9ec9ee0ad48..46ed7e1e4b5 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -105,7 +105,7 @@ import { TempExtraModifierModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, - TerrastalizeModifier, + TerastallizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, @@ -431,7 +431,7 @@ export class TerastallizeModifierType extends PokemonModifierType { super( "", `${PokemonType[teraType].toLowerCase()}_tera_shard`, - (type, args) => new TerrastalizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), + (type, args) => new TerastallizeModifier(type as TerastallizeModifierType, (args[0] as Pokemon).id, teraType), (pokemon: PlayerPokemon) => { if ( [pokemon.species.speciesId, pokemon.fusionSpecies?.speciesId].filter( diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index b31bee7fc69..6907b6907ca 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2073,7 +2073,7 @@ export abstract class ConsumablePokemonModifier extends ConsumableModifier { } } -export class TerrastalizeModifier extends ConsumablePokemonModifier { +export class TerastallizeModifier extends ConsumablePokemonModifier { public declare type: TerastallizeModifierType; public teraType: PokemonType; @@ -2084,9 +2084,9 @@ export class TerrastalizeModifier extends ConsumablePokemonModifier { } /** - * Checks if {@linkcode TerrastalizeModifier} should be applied + * Checks if {@linkcode TerastallizeModifier} should be applied * @param playerPokemon The {@linkcode PlayerPokemon} that consumes the item - * @returns `true` if the {@linkcode TerrastalizeModifier} should be applied + * @returns `true` if the {@linkcode TerastallizeModifier} should be applied */ override shouldApply(playerPokemon?: PlayerPokemon): boolean { return ( @@ -2098,7 +2098,7 @@ export class TerrastalizeModifier extends ConsumablePokemonModifier { } /** - * Applies {@linkcode TerrastalizeModifier} + * Applies {@linkcode TerastallizeModifier} * @param pokemon The {@linkcode PlayerPokemon} that consumes the item * @returns `true` if hp was restored */ @@ -3875,7 +3875,7 @@ const ModifierClassMap = Object.freeze({ ResetNegativeStatStageModifier, FieldEffectModifier, ConsumablePokemonModifier, - TerrastalizeModifier, + TerastallizeModifier, PokemonHpRestoreModifier, PokemonStatusHealModifier, ConsumablePokemonMoveModifier, diff --git a/src/phase.ts b/src/phase.ts index 46a81dddb6f..eccbf3127e6 100644 --- a/src/phase.ts +++ b/src/phase.ts @@ -11,7 +11,7 @@ export abstract class Phase { /** * The string name of the phase, used to identify the phase type for {@linkcode is} * - * @privateremarks + * @privateRemarks * * When implementing a phase, you must set the `phaseName` property to the name of the phase. */ diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index c7eb466157d..ff9ee7cc197 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -112,7 +112,7 @@ export class CommandPhase extends FieldPhase { * Clear out all unusable moves in front of the currently acting pokemon's move queue. */ // TODO: Refactor move queue handling to ensure that this method is not necessary. - private clearUnusuableMoves(): void { + private clearUnusableMoves(): void { const playerPokemon = this.getPokemon(); const moveQueue = playerPokemon.getMoveQueue(); if (moveQueue.length === 0) { @@ -143,7 +143,7 @@ export class CommandPhase extends FieldPhase { * @returns Whether a queued move was successfully set to be executed. */ private tryExecuteQueuedMove(): boolean { - this.clearUnusuableMoves(); + this.clearUnusableMoves(); const playerPokemon = globalScene.getPlayerField()[this.fieldIndex]; const moveQueue = playerPokemon.getMoveQueue(); diff --git a/src/phases/select-biome-phase.ts b/src/phases/select-biome-phase.ts index f4fd11636fc..4089f0c2852 100644 --- a/src/phases/select-biome-phase.ts +++ b/src/phases/select-biome-phase.ts @@ -5,7 +5,7 @@ import { ChallengeType } from "#enums/challenge-type"; import { UiMode } from "#enums/ui-mode"; import { MapModifier, MoneyInterestModifier } from "#modifiers/modifier"; import { BattlePhase } from "#phases/battle-phase"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { applyChallenges } from "#utils/challenge-utils"; import { BooleanHolder, randSeedInt } from "#utils/common"; diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts index 6f0493f707d..15d92ba2812 100644 --- a/src/phases/title-phase.ts +++ b/src/phases/title-phase.ts @@ -16,7 +16,7 @@ import type { Modifier } from "#modifiers/modifier"; import { getDailyRunStarterModifiers, regenerateModifierPoolThresholds } from "#modifiers/modifier-type"; import type { SessionSaveData } from "#system/game-data"; import { vouchers } from "#system/voucher"; -import type { OptionSelectConfig, OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectConfig, OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { SaveSlotUiMode } from "#ui/save-slot-select-ui-handler"; import { isLocal, isLocalServerConnected, isNullOrUndefined } from "#utils/common"; import i18next from "i18next"; diff --git a/src/system/settings/settings-gamepad.ts b/src/system/settings/settings-gamepad.ts index 2e25eda7300..c334159cc3c 100644 --- a/src/system/settings/settings-gamepad.ts +++ b/src/system/settings/settings-gamepad.ts @@ -144,7 +144,7 @@ export function setSettingGamepad(setting: SettingGamepad, value: number): boole handler: () => changeGamepadHandler(g), })), { - label: i18next.t("settings:cancelContollerChoice"), + label: i18next.t("settings:cancelControllerChoice"), handler: cancelHandler, }, ], diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstract-option-select-ui-handler.ts similarity index 100% rename from src/ui/abstact-option-select-ui-handler.ts rename to src/ui/abstract-option-select-ui-handler.ts diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index d2a45646690..e243bef342e 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -36,7 +36,7 @@ interface ArenaEffectInfo { /** The enum string representation of the effect */ name: string; /** {@linkcode ArenaEffectType} type of effect */ - effecType: ArenaEffectType; + effectType: ArenaEffectType; /** The maximum duration set by the effect */ maxDuration: number; @@ -246,7 +246,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { // Creates a proxy object to decide which text object needs to be updated let textObject: Phaser.GameObjects.Text; - switch (fieldEffectInfo.effecType) { + switch (fieldEffectInfo.effectType) { case ArenaEffectType.PLAYER: textObject = this.flyoutTextPlayer; break; @@ -300,7 +300,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex( - e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType, + e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effectType, ) : -1; let name: string = getFieldEffectText(ArenaTagType[tagAddedEvent.arenaTagType]); @@ -318,7 +318,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { this.fieldEffectInfo.push({ name, - effecType: arenaEffectType, + effectType: arenaEffectType, maxDuration: tagAddedEvent.duration, duration: tagAddedEvent.duration, tagType: tagAddedEvent.arenaTagType, @@ -353,7 +353,7 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { ? WeatherType[fieldEffectChangedEvent.newWeatherType] : TerrainType[fieldEffectChangedEvent.newTerrainType], ), - effecType: + effectType: fieldEffectChangedEvent instanceof WeatherChangedEvent ? ArenaEffectType.WEATHER : ArenaEffectType.TERRAIN, maxDuration: fieldEffectChangedEvent.duration, duration: fieldEffectChangedEvent.duration, diff --git a/src/ui/autocomplete-ui-handler.ts b/src/ui/autocomplete-ui-handler.ts index 6016245c38d..337b17048dc 100644 --- a/src/ui/autocomplete-ui-handler.ts +++ b/src/ui/autocomplete-ui-handler.ts @@ -1,6 +1,6 @@ import { Button } from "#enums/buttons"; import { UiMode } from "#enums/ui-mode"; -import { AbstractOptionSelectUiHandler } from "#ui/abstact-option-select-ui-handler"; +import { AbstractOptionSelectUiHandler } from "#ui/abstract-option-select-ui-handler"; export class AutoCompleteUiHandler extends AbstractOptionSelectUiHandler { modalContainer: Phaser.GameObjects.Container; diff --git a/src/ui/battle-info/player-battle-info.ts b/src/ui/battle-info/player-battle-info.ts index 8784495e6d2..998f7cbb41f 100644 --- a/src/ui/battle-info/player-battle-info.ts +++ b/src/ui/battle-info/player-battle-info.ts @@ -198,11 +198,11 @@ export class PlayerBattleInfo extends BattleInfo { this.lastLevelCapped = isLevelCapped; if (this.lastExp !== pokemon.exp || this.lastLevel !== pokemon.level) { - const durationMultipler = Math.max( + const durationMultiplier = Math.max( Phaser.Tweens.Builders.GetEaseFunction("Cubic.easeIn")(1 - Math.min(pokemon.level - this.lastLevel, 10) / 10), 0.1, ); - await this.updatePokemonExp(pokemon, false, durationMultipler); + await this.updatePokemonExp(pokemon, false, durationMultiplier); } else if (isLevelCapped !== oldLevelCapped) { this.setLevel(pokemon.level); } diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 41ff559062a..b702bcd0803 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -42,7 +42,7 @@ export class CommandUiHandler extends UiHandler { ui.add(this.commandsContainer); this.teraButton = globalScene.add.sprite(-32, 15, "button_tera"); - this.teraButton.setName("terrastallize-button"); + this.teraButton.setName("terastallize-button"); this.teraButton.setScale(1.3); this.teraButton.setFrame("fire"); this.teraButton.setPipeline(globalScene.spritePipeline, { diff --git a/src/ui/confirm-ui-handler.ts b/src/ui/confirm-ui-handler.ts index aeef7fc1c91..49e88556f1b 100644 --- a/src/ui/confirm-ui-handler.ts +++ b/src/ui/confirm-ui-handler.ts @@ -1,8 +1,8 @@ import { globalScene } from "#app/global-scene"; import { Button } from "#enums/buttons"; import { UiMode } from "#enums/ui-mode"; -import type { OptionSelectConfig } from "#ui/abstact-option-select-ui-handler"; -import { AbstractOptionSelectUiHandler } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectConfig } from "#ui/abstract-option-select-ui-handler"; +import { AbstractOptionSelectUiHandler } from "#ui/abstract-option-select-ui-handler"; import i18next from "i18next"; export class ConfirmUiHandler extends AbstractOptionSelectUiHandler { diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 67b2c81b94c..0f55faba5c4 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -2,7 +2,7 @@ import { pokerogueApi } from "#api/pokerogue-api"; import { globalScene } from "#app/global-scene"; import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; import type { ModalConfig } from "#ui/modal-ui-handler"; diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index e419997456b..da6bc9ced78 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -7,7 +7,7 @@ import { Button } from "#enums/buttons"; import { GameDataType } from "#enums/game-data-type"; import { TextStyle } from "#enums/text-style"; import { UiMode } from "#enums/ui-mode"; -import type { OptionSelectConfig, OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectConfig, OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { AdminMode, getAdminModeName } from "#ui/admin-ui-handler"; import type { AwaitableUiHandler } from "#ui/awaitable-ui-handler"; import { BgmBar } from "#ui/bgm-bar"; diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 6edd7d5d70d..a070b522050 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -843,7 +843,7 @@ class ModifierOption extends Phaser.GameObjects.Container { /** * Start the tweens responsible for animating the option's appearance * - * @privateremarks + * @privateRemarks * This method is unusual. It "returns" (one via the actual return, one by via appending to the `promiseHolder` * parameter) two promises. The promise returned by the method resolves once the option's appearance animations have * completed, and is meant to allow callers to synchronize with the completion of the option's appearance animations. diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index fbfb6b615a4..49658d9cfc9 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -46,7 +46,7 @@ import { getVariantIcon, getVariantTint } from "#sprites/variant"; import type { StarterAttributes } from "#system/game-data"; import { SettingKeyboard } from "#system/settings-keyboard"; import type { DexEntry } from "#types/dex-data"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { BaseStatsOverlay } from "#ui/base-stats-overlay"; import { MessageUiHandler } from "#ui/message-ui-handler"; import { MoveInfoOverlay } from "#ui/move-info-overlay"; diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts index ab3258a03de..4f606cbcbb0 100644 --- a/src/ui/pokedex-scan-ui-handler.ts +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -1,7 +1,7 @@ import { allAbilities, allMoves, allSpecies } from "#data/data-lists"; import { UiMode } from "#enums/ui-mode"; import type { PlayerPokemon } from "#field/pokemon"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { FilterTextRow } from "#ui/filter-text"; import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index 75a3e5162e3..aa2a5cda459 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -33,7 +33,7 @@ import { getVariantIcon, getVariantTint } from "#sprites/variant"; import type { DexAttrProps, StarterAttributes } from "#system/game-data"; import { SettingKeyboard } from "#system/settings-keyboard"; import type { DexEntry } from "#types/dex-data"; -import type { OptionSelectConfig } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectConfig } from "#ui/abstract-option-select-ui-handler"; import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "#ui/dropdown"; import { FilterBar } from "#ui/filter-bar"; import { FilterText, FilterTextRow } from "#ui/filter-text"; diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 667a22a001a..2def302c1d5 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -702,11 +702,11 @@ export class RunInfoUiHandler extends UiHandler { rules.push(i18next.t("challenges:inverseBattle.shortName")); break; default: { - const localisationKey = Challenges[this.runInfo.challenges[i].id] + const localizationKey = Challenges[this.runInfo.challenges[i].id] .split("_") .map((f, i) => (i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase())) .join(""); - rules.push(i18next.t(`challenges:${localisationKey}.name`)); + rules.push(i18next.t(`challenges:${localizationKey}.name`)); break; } } diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 5b1566b4913..9c2f8488b22 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -401,7 +401,7 @@ class SessionSlot extends Phaser.GameObjects.Container { const gameModeLabel = addTextObject( 8, 5, - `${GameMode.getModeName(data.gameMode) || i18next.t("gameMode:unkown")} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}`, + `${GameMode.getModeName(data.gameMode) || i18next.t("gameMode:unknown")} - ${i18next.t("saveSlotSelectUiHandler:wave")} ${data.waveIndex}`, TextStyle.WINDOW, ); this.add(gameModeLabel); diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index b2bda2455bb..2c8d0eb63ba 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -8,7 +8,7 @@ import { UiHandler } from "#ui/ui-handler"; import { addWindow } from "#ui/ui-theme"; import i18next from "i18next"; -type CancelFn = (succes?: boolean) => boolean; +type CancelFn = (success?: boolean) => boolean; /** * Abstract class for handling UI elements related to button bindings. diff --git a/src/ui/settings/option-select-ui-handler.ts b/src/ui/settings/option-select-ui-handler.ts index d7b699e6e50..c989c768244 100644 --- a/src/ui/settings/option-select-ui-handler.ts +++ b/src/ui/settings/option-select-ui-handler.ts @@ -1,5 +1,5 @@ import { UiMode } from "#enums/ui-mode"; -import { AbstractOptionSelectUiHandler } from "#ui/abstact-option-select-ui-handler"; +import { AbstractOptionSelectUiHandler } from "#ui/abstract-option-select-ui-handler"; export class OptionSelectUiHandler extends AbstractOptionSelectUiHandler { constructor(mode: UiMode = UiMode.OPTION_SELECT) { diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index d4690005c5b..15a08e9d0f4 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -47,7 +47,7 @@ import { achvs } from "#system/achv"; import type { DexAttrProps, StarterAttributes, StarterMoveset } from "#system/game-data"; import { SettingKeyboard } from "#system/settings-keyboard"; import type { DexEntry } from "#types/dex-data"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "#ui/dropdown"; import { FilterBar } from "#ui/filter-bar"; import { MessageUiHandler } from "#ui/message-ui-handler"; @@ -901,7 +901,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.pokemonEggMovesContainer.add(eggMoveContainer); } - this.teraIcon = globalScene.add.sprite(85, 63, "button_tera").setName("terrastallize-icon").setFrame("fire"); + this.teraIcon = globalScene.add.sprite(85, 63, "button_tera").setName("terastallize-icon").setFrame("fire"); // The font size should be set per language const instructionTextSize = textSettings.instructionTextSize; diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index b51bdfdb157..b6ce0a706f8 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -879,7 +879,7 @@ export class SummaryUiHandler extends UiHandler { !isNullOrUndefined(this.pokemon) ) { const teraIcon = globalScene.add.sprite(123, 26, "button_tera"); - teraIcon.setName("terrastallize-icon"); + teraIcon.setName("terastallize-icon"); teraIcon.setFrame(PokemonType[this.pokemon.getTeraType()].toLowerCase()); profileContainer.add(teraIcon); } diff --git a/src/ui/test-dialogue-ui-handler.ts b/src/ui/test-dialogue-ui-handler.ts index c57c73ca777..4f825ed95ea 100644 --- a/src/ui/test-dialogue-ui-handler.ts +++ b/src/ui/test-dialogue-ui-handler.ts @@ -1,6 +1,6 @@ import { UiMode } from "#enums/ui-mode"; import type { PlayerPokemon } from "#field/pokemon"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import type { InputFieldConfig } from "#ui/form-modal-ui-handler"; import { FormModalUiHandler } from "#ui/form-modal-ui-handler"; import type { ModalConfig } from "#ui/modal-ui-handler"; @@ -13,7 +13,7 @@ export class TestDialogueUiHandler extends FormModalUiHandler { setup() { super.setup(); - const flattenKeys = (object?: any, topKey?: string, midleKey?: string[]): Array => { + const flattenKeys = (object?: any, topKey?: string, middleKey?: string[]): Array => { return Object.keys(object ?? {}) .map((t, i) => { const value = Object.values(object)[i]; @@ -23,7 +23,7 @@ export class TestDialogueUiHandler extends FormModalUiHandler { // If the value is an object, execute the same process // si el valor es un objeto ejecuta el mismo proceso - return flattenKeys(value, topKey ?? t, topKey ? (midleKey ? [...midleKey, t] : [t]) : undefined).filter( + return flattenKeys(value, topKey ?? t, topKey ? (middleKey ? [...middleKey, t] : [t]) : undefined).filter( t => t.length > 0, ); } @@ -31,7 +31,7 @@ export class TestDialogueUiHandler extends FormModalUiHandler { // we check for null or undefined here as per above - the typeof is still an object but the value is null so we need to exit out of this and pass the null key // Return in the format expected by i18next - return midleKey ? `${topKey}:${midleKey.map(m => m).join(".")}.${t}` : `${topKey}:${t}`; + return middleKey ? `${topKey}:${middleKey.map(m => m).join(".")}.${t}` : `${topKey}:${t}`; } }) .filter(t => t); diff --git a/test/ui/starter-select.test.ts b/test/ui/starter-select.test.ts index a8c6284cf3f..6dc9603c8b3 100644 --- a/test/ui/starter-select.test.ts +++ b/test/ui/starter-select.test.ts @@ -10,7 +10,7 @@ import { EncounterPhase } from "#phases/encounter-phase"; import { SelectStarterPhase } from "#phases/select-starter-phase"; import type { TitlePhase } from "#phases/title-phase"; import { GameManager } from "#test/test-utils/game-manager"; -import type { OptionSelectItem } from "#ui/abstact-option-select-ui-handler"; +import type { OptionSelectItem } from "#ui/abstract-option-select-ui-handler"; import type { OptionSelectUiHandler } from "#ui/option-select-ui-handler"; import type { SaveSlotSelectUiHandler } from "#ui/save-slot-select-ui-handler"; import type { StarterSelectUiHandler } from "#ui/starter-select-ui-handler"; From 8e261512fc6f62c24f0e399129e2eb985191075c Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Thu, 7 Aug 2025 21:00:34 -0400 Subject: [PATCH 087/106] [Test] Improved tests for arena trap (#6209) * Added arena trap tests and such * hopefullt fixed tests * Marked test as todo since me smol brain --------- Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> --- test/abilities/arena-trap.test.ts | 85 ++++++++++++++++--------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/test/abilities/arena-trap.test.ts b/test/abilities/arena-trap.test.ts index f85fae5b259..0090487f49c 100644 --- a/test/abilities/arena-trap.test.ts +++ b/test/abilities/arena-trap.test.ts @@ -1,10 +1,15 @@ +import { getPokemonNameWithAffix } from "#app/messages"; import { allAbilities } from "#data/data-lists"; import { AbilityId } from "#enums/ability-id"; +import { Button } from "#enums/buttons"; import { MoveId } from "#enums/move-id"; import { SpeciesId } from "#enums/species-id"; +import { UiMode } from "#enums/ui-mode"; import { GameManager } from "#test/test-utils/game-manager"; +import type { PartyUiHandler } from "#ui/party-ui-handler"; +import i18next from "i18next"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Abilities - Arena Trap", () => { let phaserGame: Phaser.Game; @@ -23,68 +28,64 @@ describe("Abilities - Arena Trap", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset(MoveId.SPLASH) .ability(AbilityId.ARENA_TRAP) + .enemyAbility(AbilityId.ARENA_TRAP) .enemySpecies(SpeciesId.RALTS) - .enemyAbility(AbilityId.BALL_FETCH) - .enemyMoveset(MoveId.TELEPORT); + .enemyMoveset(MoveId.SPLASH); }); - // TODO: Enable test when Issue #935 is addressed - it.todo("should not allow grounded Pokémon to flee", async () => { + // NB: Since switching moves bypass trapping, the only way fleeing can occur in PKR is from the player + // TODO: Implement once forced flee helper exists + it.todo("should interrupt player flee attempt and display message, unless user has Run Away"); + + // TODO: Figure out how to wrangle the UI into not timing out + it.todo("should interrupt player switch attempt and display message", async () => { game.override.battleStyle("single"); + await game.classicMode.startBattle([SpeciesId.DUGTRIO, SpeciesId.GOTHITELLE]); - await game.classicMode.startBattle(); + const enemy = game.field.getEnemyPokemon(); - const enemy = game.scene.getEnemyPokemon(); + game.doSwitchPokemon(1); + game.onNextPrompt("CommandPhase", UiMode.PARTY, () => { + // no switch out command should be queued due to arena trap + expect(game.scene.currentBattle.turnCommands[0]).toBeNull(); - game.move.select(MoveId.SPLASH); + // back out and end the phase to avoid timeout + console.log(game.scene.ui.getHandler().constructor.name); + (game.scene.ui.getHandler() as PartyUiHandler).processInput(Button.CANCEL); + }); - await game.toNextTurn(); + await game.phaseInterceptor.to("CommandPhase"); - expect(enemy).toBe(game.scene.getEnemyPokemon()); + expect(game.textInterceptor.logs).toContain( + i18next.t("abilityTriggers:arenaTrap", { + pokemonNameWithAffix: getPokemonNameWithAffix(enemy), + abilityName: allAbilities[AbilityId.ARENA_TRAP].name, + }), + ); }); it("should guarantee double battle with any one LURE", async () => { game.override.startingModifier([{ name: "LURE" }]).startingWave(2); + await game.classicMode.startBattle([SpeciesId.DUGTRIO]); - await game.classicMode.startBattle(); - - expect(game.scene.getEnemyField().length).toBe(2); + expect(game.scene.getEnemyField()).toHaveLength(2); }); - /** - * This checks if the Player Pokemon is able to switch out/run away after the Enemy Pokemon with {@linkcode AbilityId.ARENA_TRAP} - * is forcefully moved out of the field from moves such as Roar {@linkcode MoveId.ROAR} - * - * Note: It should be able to switch out/run away - */ it("should lift if pokemon with this ability leaves the field", async () => { - game.override - .battleStyle("double") - .enemyMoveset(MoveId.SPLASH) - .moveset([MoveId.ROAR, MoveId.SPLASH]) - .ability(AbilityId.BALL_FETCH); - await game.classicMode.startBattle([SpeciesId.MAGIKARP, SpeciesId.SUDOWOODO, SpeciesId.LUNATONE]); + game.override.battleStyle("single"); + await game.classicMode.startBattle([SpeciesId.MAGIKARP]); - const [enemy1, enemy2] = game.scene.getEnemyField(); - const [player1, player2] = game.scene.getPlayerField(); + const player = game.field.getPlayerPokemon(); + const enemy = game.field.getEnemyPokemon(); - vi.spyOn(enemy1, "getAbility").mockReturnValue(allAbilities[AbilityId.ARENA_TRAP]); + expect(player.isTrapped()).toBe(true); + expect(enemy.isOnField()).toBe(true); - game.move.select(MoveId.ROAR); - game.move.select(MoveId.SPLASH, 1); + game.move.use(MoveId.ROAR); + await game.toEndOfTurn(); - // This runs the fist command phase where the moves are selected - await game.toNextTurn(); - // During the next command phase the player pokemons should not be trapped anymore - game.move.select(MoveId.SPLASH); - game.move.select(MoveId.SPLASH, 1); - await game.toNextTurn(); - - expect(player1.isTrapped()).toBe(false); - expect(player2.isTrapped()).toBe(false); - expect(enemy1.isOnField()).toBe(false); - expect(enemy2.isOnField()).toBe(true); + expect(player.isTrapped()).toBe(false); + expect(enemy.isOnField()).toBe(false); }); }); From 89871b10c6c04b724066cda05f64a501ebd098f4 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Thu, 7 Aug 2025 18:11:47 -0700 Subject: [PATCH 088/106] [i18n] Update locales submodule --- public/locales | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales b/public/locales index fa35780fed7..ab2716d5440 160000 --- a/public/locales +++ b/public/locales @@ -1 +1 @@ -Subproject commit fa35780fed762017c89d1e9ece8a2779dff56c4d +Subproject commit ab2716d5440c25f73986664aa3f3131821c3c392 From 4bb3e11c746e8e969f8d1605795b62d193189a59 Mon Sep 17 00:00:00 2001 From: Bertie690 <136088738+Bertie690@users.noreply.github.com> Date: Thu, 7 Aug 2025 21:24:33 -0400 Subject: [PATCH 089/106] [Misc] Added chance for alt title logo (#6182) * [Misc] Added 0.1% chance for fake login screen * Actually added logo file * Update title-ui-handler.ts Co-authored-by: damocleas Co-authored-by: Wlowscha <54003515+Wlowscha@users.noreply.github.com> --- public/images/logo_fake.png | Bin 0 -> 1628 bytes src/constants.ts | 7 +++++++ src/loading-scene.ts | 1 + src/timed-event-manager.ts | 10 ++++++++++ src/ui/title-ui-handler.ts | 13 ++++++++++++- src/utils/common.ts | 12 ++++++++---- 6 files changed, 38 insertions(+), 5 deletions(-) create mode 100755 public/images/logo_fake.png diff --git a/public/images/logo_fake.png b/public/images/logo_fake.png new file mode 100755 index 0000000000000000000000000000000000000000..9fdb87240252709715af48d90f62b7a313d6dde3 GIT binary patch literal 1628 zcmV-i2BZ0jP)Px){7FPXRCr$Pn>%h5K@dgljF5yCARz)0GB!a*#0FRZ>tF$FfQXDukdY7|1Q{6# zAtC{_MOjzHz4httv7aqo@~k&A-Ss*3>7Mra+27CSCr^Ic-!tD2-oHPec@Ce6WLO>l z6!crQ&&=~o?^Rn?RdbSGoX|`SACVqcnOxlHNIB?n}J{euHaq)%L3=R^~)Tw>v{x~pX112xhP*~ z{2dPHf{QT}H$bVt7+?^;9Ra2cO0SlQ}H8QrAL_EI`vp)px` ziyCsjypFaw(Bf67R`-t3aoFpy-?QzRN=8<2d9Y^mS_UhEDg$yjZ#dhGknLkdPz^^^ z`VE^Cvs)ym(r?K8`unF#`*r7LSNM2u2sN7`P8C}Wi142R<9+nR-rQE8e9=r z*m$Z;RRP(r45K#=yP-mTeMUmr5iAB!#a=4oRm*TEP?=uSV6mnzDt$^JbhKKv3`4SJ z6ZfM!P?;>_`N~QOWoKogGPjN4w_;dEz^pW$W2@3gc9!u}KgIkKja~8MfN}~f+w;Il zD&@?B=QEFTvUiFt3_5eFl+Wfw{boxATjH~2eFvvIC{>8)x)o8LJ|@FG=iGT?H=X2MiXQOUc#BSlK2c zbFzoZ1Y#=^rBJjFm7U69eUdM2S()vCwL{-sU=2NI;EDnqZKrHIo-c!?oNFtOX#dFX z8(9>ydaYg$`Fkt9C@&WjtH8X7j5I?-u|lXS9cfHc|c5_&u_1 z8LX_&i1wj;BZ>F=aebs@!rO~vX50!?X2kK$WWgS;T8dWmRi!N2Z(=>7Io^6D4=K}E zWpM^qX4@+P3nS1{b7Ux0mOAB#EiP2_8JxSon$_3Khy6^nL(ag8R_wcbES0fKrLdZ@ zEN!!LX3?Xf1y>@7cSwrxecWt1@nu5iHZPRdMCnsKj9wpVh0pDqI1p zs;Ge#Wu`1^Rp&CpM)1snRh2>Yh~4K+m#lBfVDhEVXTpwLC9qWUh#Q4$<)L2OG6m7d zQD#vqNmb4wVC>TB0#?d8XgPWwi7P$hI# zue20;SkSNxtOza!18%Oe>qq>CM@b^M#x=FkiRH3#?#bq1b9at_E7`ktXLj|zUDYei zSSn%_SXCvnvqGr6Djn#sii0|i@%OUK&B~<;hR)nk5N5&FwZl<*wZOu99Dx<3`fk)_ zSxo`p!OR@u10ovNqPx;(MnF|cTIYF{fvXvFr(PwnSk|h5RdMF2-D43P1%PtEsp(Rc z$7ih_zHNhLSqpoRsscCtKHucu78@L)R~f9VRNQoEs`8@~X3JD{uB*Inw_g9jYI<+C z1DewxcKdFTF0000 this.isActive(te)); } + /** + * Check whether the current event is active and for April Fools. + * @returns Whether the April Fools event is currently active. + */ + isAprilFoolsActive(): boolean { + return timedEvents.some( + te => this.isActive(te) && te.hasOwnProperty("bannerKey") && te.bannerKey!.startsWith("aprf"), + ); + } + activeEventHasBanner(): boolean { const activeEvents = timedEvents.filter(te => this.isActive(te) && te.hasOwnProperty("bannerKey")); return activeEvents.length > 0; diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index ab7a4d020fa..36e37500a64 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -1,4 +1,5 @@ import { pokerogueApi } from "#api/pokerogue-api"; +import { FAKE_TITLE_LOGO_CHANCE } from "#app/constants"; import { timedEventManager } from "#app/global-event-manager"; import { globalScene } from "#app/global-scene"; import { TimedEventDisplay } from "#app/timed-event-manager"; @@ -41,7 +42,7 @@ export class TitleUiHandler extends OptionSelectUiHandler { this.titleContainer.setAlpha(0); ui.add(this.titleContainer); - const logo = globalScene.add.image(globalScene.scaledCanvas.width / 2, 8, "logo"); + const logo = globalScene.add.image(globalScene.scaledCanvas.width / 2, 8, this.getLogo()); logo.setOrigin(0.5, 0); this.titleContainer.add(logo); @@ -186,4 +187,14 @@ export class TitleUiHandler extends OptionSelectUiHandler { ease: "Sine.easeInOut", }); } + + /** + * Get the logo file path to load, with a 0.1% chance to use the fake logo instead. + * @returns The path to the image. + */ + private getLogo(): string { + // Invert spawn chances on april fools + const aprilFools = timedEventManager.isAprilFoolsActive(); + return aprilFools === !!randInt(FAKE_TITLE_LOGO_CHANCE) ? "logo_fake" : "logo"; + } } diff --git a/src/utils/common.ts b/src/utils/common.ts index 1c75dac93b4..aac1ef359e6 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -70,12 +70,16 @@ export function padInt(value: number, length: number, padWith?: string): string } /** - * Returns a random integer between min and min + range - * @param range The amount of possible numbers - * @param min The starting number + * Returns a **completely unseeded** random integer between `min` and `min + range`. + * @param range - The amount of possible numbers to pick + * @param min - The minimum number to pick; default `0` + * @returns A psuedo-random, unseeded integer within the interval [min, min+range]. + * @remarks + * This should not be used for battles or other outwards-facing randomness; + * battles are intended to be seeded and deterministic. */ export function randInt(range: number, min = 0): number { - if (range === 1) { + if (range <= 1) { return min; } return Math.floor(Math.random() * range) + min; From ae9f03e06056a2ada91739f572e6918d0f07483c Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Thu, 7 Aug 2025 21:45:37 -0500 Subject: [PATCH 090/106] [Balance] Evil Leader Adjustments (#6133) * Update trainer-config.ts * Update Starmobiles to use their mainline movesets * Update Starmobile forms and Trainer Config --------- Co-authored-by: damocleas --- src/data/balance/passives.ts | 2 +- src/data/balance/pokemon-species.ts | 10 +- src/data/trainers/trainer-config.ts | 234 ++++++++++++++-------------- 3 files changed, 121 insertions(+), 125 deletions(-) diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index 0a76b3036b9..c0f84d90cf0 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -1044,7 +1044,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.FINIZEN]: { 0: AbilityId.FRIEND_GUARD }, [SpeciesId.PALAFIN]: { 0: AbilityId.EMERGENCY_EXIT, 1: AbilityId.IRON_FIST }, [SpeciesId.VAROOM]: { 0: AbilityId.LEVITATE }, - [SpeciesId.REVAVROOM]: { 0: AbilityId.LEVITATE, 1: AbilityId.DARK_AURA, 2: AbilityId.FLASH_FIRE, 3: AbilityId.MERCILESS, 4: AbilityId.FILTER, 5: AbilityId.SCRAPPY }, + [SpeciesId.REVAVROOM]: { 0: AbilityId.LEVITATE, 1: AbilityId.INTIMIDATE, 2: AbilityId.SPEED_BOOST, 3: AbilityId.TOXIC_DEBRIS, 4: AbilityId.MISTY_SURGE, 5: AbilityId.STAMINA }, [SpeciesId.CYCLIZAR]: { 0: AbilityId.PROTEAN }, [SpeciesId.ORTHWORM]: { 0: AbilityId.REGENERATOR }, [SpeciesId.GLIMMET]: { 0: AbilityId.STURDY }, diff --git a/src/data/balance/pokemon-species.ts b/src/data/balance/pokemon-species.ts index 5e9d352f437..13269308958 100644 --- a/src/data/balance/pokemon-species.ts +++ b/src/data/balance/pokemon-species.ts @@ -1618,11 +1618,11 @@ export function initSpecies() { new PokemonSpecies(SpeciesId.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1, 35, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(SpeciesId.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Normal", "", PokemonType.STEEL, PokemonType.POISON, 1.8, 120, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, false, null, true), - new PokemonForm("Segin Starmobile", "segin-starmobile", PokemonType.STEEL, PokemonType.DARK, 1.8, 240, AbilityId.INTIMIDATE, AbilityId.NONE, AbilityId.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Schedar Starmobile", "schedar-starmobile", PokemonType.STEEL, PokemonType.FIRE, 1.8, 240, AbilityId.SPEED_BOOST, AbilityId.NONE, AbilityId.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Navi Starmobile", "navi-starmobile", PokemonType.STEEL, PokemonType.POISON, 1.8, 240, AbilityId.TOXIC_DEBRIS, AbilityId.NONE, AbilityId.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", PokemonType.STEEL, PokemonType.FAIRY, 1.8, 240, AbilityId.MISTY_SURGE, AbilityId.NONE, AbilityId.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), - new PokemonForm("Caph Starmobile", "caph-starmobile", PokemonType.STEEL, PokemonType.FIGHTING, 1.8, 240, AbilityId.STAMINA, AbilityId.NONE, AbilityId.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true) + new PokemonForm("Segin Starmobile", "segin-starmobile", PokemonType.STEEL, PokemonType.DARK, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Schedar Starmobile", "schedar-starmobile", PokemonType.STEEL, PokemonType.FIRE, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Navi Starmobile", "navi-starmobile", PokemonType.STEEL, PokemonType.POISON, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", PokemonType.STEEL, PokemonType.FAIRY, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true), + new PokemonForm("Caph Starmobile", "caph-starmobile", PokemonType.STEEL, PokemonType.FIGHTING, 1.8, 240, AbilityId.OVERCOAT, AbilityId.NONE, AbilityId.OVERCOAT, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175, false, null, false, true) ), new PokemonSpecies(SpeciesId.CYCLIZAR, 9, false, false, false, "Mount Pokémon", PokemonType.DRAGON, PokemonType.NORMAL, 1.6, 63, AbilityId.SHED_SKIN, AbilityId.NONE, AbilityId.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(SpeciesId.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", PokemonType.STEEL, null, 2.5, 310, AbilityId.EARTH_EATER, AbilityId.NONE, AbilityId.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 5739492f96e..6c643737778 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -2562,7 +2562,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.WICKED_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.PARTING_SHOT), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -2582,7 +2582,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.BLAZING_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.FLAME_CHARGE), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -2602,7 +2602,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.NOXIOUS_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.TOXIC_SPIKES), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -2622,7 +2622,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.MAGICAL_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.MISTY_TERRAIN), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -2642,7 +2642,7 @@ export const trainerConfigs: TrainerConfigs = { p.moveset = [ new PokemonMove(MoveId.COMBAT_TORQUE), new PokemonMove(MoveId.SPIN_OUT), - new PokemonMove(MoveId.SHIFT_GEAR), + new PokemonMove(MoveId.IRON_DEFENSE), new PokemonMove(MoveId.HIGH_HORSEPOWER), ]; }), @@ -4974,21 +4974,21 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.NIDOQUEEN, SpeciesId.NIDOKING])) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.RHYPERIOR], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.abilityIndex = 1; // Solid Rock - }), - ) - .setPartyMemberFunc( - 5, getRandomPartyMemberFunc([SpeciesId.KANGASKHAN], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; // Mega Kangaskhan p.generateName(); }), + ) + .setPartyMemberFunc( + 5, + getRandomPartyMemberFunc([SpeciesId.RHYPERIOR], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 1; // Solid Rock + p.setBoss(true, 2); + }), ), [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t) .setName("Giovanni") @@ -4997,52 +4997,53 @@ export const trainerConfigs: TrainerConfigs = { .setVictoryBgm("victory_team_plasma") .setPartyMemberFunc( 0, - getRandomPartyMemberFunc([SpeciesId.TYRANITAR], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.RHYPERIOR], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Solid Rock p.pokeball = PokeballType.ULTRA_BALL; }), ) .setPartyMemberFunc( 1, - getRandomPartyMemberFunc([SpeciesId.GASTRODON, SpeciesId.SEISMITOAD], TrainerSlot.TRAINER, true, p => { - if (p.species.speciesId === SpeciesId.GASTRODON) { - p.abilityIndex = 0; // Storm Drain - } else if (p.species.speciesId === SpeciesId.SEISMITOAD) { - p.abilityIndex = 2; // Water Absorb - } + getRandomPartyMemberFunc([SpeciesId.NIDOKING, SpeciesId.NIDOQUEEN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Sheer Force }), ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.GARCHOMP, SpeciesId.EXCADRILL], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.HONCHKROW], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - if (p.species.speciesId === SpeciesId.GARCHOMP) { - p.abilityIndex = 2; // Rough Skin - } else if (p.species.speciesId === SpeciesId.EXCADRILL) { - p.abilityIndex = 0; // Sand Rush + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.SUCKER_PUNCH)) { + // Check if Sucker Punch is in the moveset, if not, replace the third move with Sucker Punch. + p.moveset[2] = new PokemonMove(MoveId.SUCKER_PUNCH); } }), ) .setPartyMemberFunc( 3, - getRandomPartyMemberFunc([SpeciesId.RHYPERIOR], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - p.abilityIndex = 1; // Solid Rock - }), - ) - .setPartyMemberFunc( - 4, getRandomPartyMemberFunc([SpeciesId.KANGASKHAN], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; p.formIndex = 1; // Mega Kangaskhan p.generateName(); }), ) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc( + [SpeciesId.ARTICUNO, SpeciesId.ZAPDOS, SpeciesId.MOLTRES], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 2; // Snow Cloak Articuno, Static Zapdos, Flame Body Moltres + p.setBoss(true, 2); + }, + ), + ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.MEWTWO], TrainerSlot.TRAINER, true, p => { @@ -5056,16 +5057,22 @@ export const trainerConfigs: TrainerConfigs = { .initForEvilTeamLeader("Magma Boss", []) .setMixedBattleBgm("battle_aqua_magma_boss") .setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SOLROCK])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.TALONFLAME])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.WEEZING, SpeciesId.GALAR_WEEZING])) .setPartyMemberFunc( - 3, + 0, getRandomPartyMemberFunc([SpeciesId.TORKOAL], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Drought }), ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.SOLROCK])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.WEEZING, SpeciesId.GALAR_WEEZING])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([SpeciesId.SCOVILLAIN], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 0; // Chlorophyll + }), + ) .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.DONPHAN])) .setPartyMemberFunc( 5, @@ -5140,16 +5147,16 @@ export const trainerConfigs: TrainerConfigs = { .initForEvilTeamLeader("Aqua Boss", []) .setMixedBattleBgm("battle_aqua_magma_boss") .setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.LUDICOLO])) .setPartyMemberFunc( - 1, + 0, getRandomPartyMemberFunc([SpeciesId.PELIPPER], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 1; // Drizzle }), ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.WAILORD])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.MUK, SpeciesId.ALOLA_MUK])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.WAILORD])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.LUDICOLO])) .setPartyMemberFunc( 4, getRandomPartyMemberFunc([SpeciesId.QWILFISH], TrainerSlot.TRAINER, true, p => { @@ -5225,7 +5232,7 @@ export const trainerConfigs: TrainerConfigs = { .setMixedBattleBgm("battle_galactic_boss") .setVictoryBgm("victory_team_plasma") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.GYARADOS])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.HONCHKROW, SpeciesId.HISUI_BRAVIARY])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.CROBAT, SpeciesId.HONCHKROW])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.MAGNEZONE])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.UXIE, SpeciesId.MESPRIT, SpeciesId.AZELF])) .setPartyMemberFunc( @@ -5233,8 +5240,6 @@ export const trainerConfigs: TrainerConfigs = { getRandomPartyMemberFunc([SpeciesId.HOUNDOOM], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; - p.formIndex = 1; // Mega Houndoom - p.generateName(); }), ) .setPartyMemberFunc( @@ -5253,7 +5258,7 @@ export const trainerConfigs: TrainerConfigs = { .setVictoryBgm("victory_team_plasma") .setPartyMemberFunc( 0, - getRandomPartyMemberFunc([SpeciesId.CROBAT], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.CROBAT, SpeciesId.HONCHKROW], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); }), @@ -5374,24 +5379,8 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; }), ) - .setPartyMemberFunc( - 3, - getRandomPartyMemberFunc([SpeciesId.DRAGALGE, SpeciesId.CLAWITZER], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === SpeciesId.DRAGALGE) { - p.abilityIndex = 2; // Adaptability - } else if (p.species.speciesId === SpeciesId.CLAWITZER) { - p.abilityIndex = 0; // Mega Launcher - } - }), - ) - .setPartyMemberFunc( - 4, - getRandomPartyMemberFunc([SpeciesId.GALLADE], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.abilityIndex = 1; // Sharpness - }), - ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.MALAMAR])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.AEGISLASH, SpeciesId.HISUI_GOODRA])) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.GYARADOS], TrainerSlot.TRAINER, true, p => { @@ -5416,21 +5405,11 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.MALE; }), ) - .setPartyMemberFunc( - 1, - getRandomPartyMemberFunc([SpeciesId.DRAGALGE, SpeciesId.CLAWITZER], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - if (p.species.speciesId === SpeciesId.DRAGALGE) { - p.abilityIndex = 2; // Adaptability - } else if (p.species.speciesId === SpeciesId.CLAWITZER) { - p.abilityIndex = 0; // Mega Launcher - } - }), - ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MIENSHAO])) .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.AEGISLASH, SpeciesId.HISUI_GOODRA])) .setPartyMemberFunc( 3, - getRandomPartyMemberFunc([SpeciesId.IRON_VALIANT], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.VOLCANION], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ROGUE_BALL; }), @@ -5467,10 +5446,10 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LILLIGANT, SpeciesId.HISUI_LILLIGANT])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.MILOTIC, SpeciesId.PRIMARINA])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LILLIGANT])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.MILOTIC])) .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GALAR_SLOWBRO, SpeciesId.GALAR_SLOWKING])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.BEWEAR])) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.BEWEAR, SpeciesId.LOPUNNY])) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.NIHILEGO], TrainerSlot.TRAINER, true, p => { @@ -5492,7 +5471,7 @@ export const trainerConfigs: TrainerConfigs = { p.gender = Gender.FEMALE; }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MILOTIC, SpeciesId.PRIMARINA])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MILOTIC, SpeciesId.LILLIGANT])) .setPartyMemberFunc( 2, getRandomPartyMemberFunc([SpeciesId.SILVALLY], TrainerSlot.TRAINER, true, p => { @@ -5572,7 +5551,11 @@ export const trainerConfigs: TrainerConfigs = { getRandomPartyMemberFunc([SpeciesId.GOLISOPOD], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); - p.gender = Gender.MALE; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.FIRST_IMPRESSION)) { + // Check if First Impression is in the moveset, if not, replace the third move with First Impression. + p.moveset[2] = new PokemonMove(MoveId.FIRST_IMPRESSION); + p.gender = Gender.MALE; + } }), ), [TrainerType.GUZMA_2]: new TrainerConfig(++t) @@ -5585,8 +5568,12 @@ export const trainerConfigs: TrainerConfigs = { getRandomPartyMemberFunc([SpeciesId.GOLISOPOD], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); - p.abilityIndex = 2; // Anticipation - p.gender = Gender.MALE; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.FIRST_IMPRESSION)) { + // Check if First Impression is in the moveset, if not, replace the third move with First Impression. + p.moveset[2] = new PokemonMove(MoveId.FIRST_IMPRESSION); + p.abilityIndex = 2; // Anticipation + p.gender = Gender.MALE; + } }), ) .setPartyMemberFunc( @@ -5615,7 +5602,7 @@ export const trainerConfigs: TrainerConfigs = { getRandomPartyMemberFunc([SpeciesId.GENESECT], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.pokeball = PokeballType.ROGUE_BALL; p.formIndex = randSeedInt(4, 1); // Shock, Burn, Chill, or Douse Drive if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.TECHNO_BLAST)) { // Check if Techno Blast is in the moveset, if not, replace the third move with Techno Blast. @@ -5697,13 +5684,7 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; }), ) - .setPartyMemberFunc( - 1, - getRandomPartyMemberFunc([SpeciesId.AEGISLASH, SpeciesId.GHOLDENGO], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - }), - ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.CORVIKNIGHT])) .setPartyMemberFunc( 2, getRandomPartyMemberFunc([SpeciesId.DRACOZOLT, SpeciesId.DRACOVISH], TrainerSlot.TRAINER, true, p => { @@ -5721,6 +5702,17 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 4, + getRandomPartyMemberFunc([SpeciesId.COPPERAJAH], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; // G-Max Copperajah + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + p.gender = Gender.FEMALE; + }), + ) + .setPartyMemberFunc( + 5, getRandomPartyMemberFunc( [SpeciesId.GALAR_ARTICUNO, SpeciesId.GALAR_ZAPDOS, SpeciesId.GALAR_MOLTRES], TrainerSlot.TRAINER, @@ -5731,33 +5723,27 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.ULTRA_BALL; }, ), - ) - .setPartyMemberFunc( - 5, - getRandomPartyMemberFunc([SpeciesId.COPPERAJAH], TrainerSlot.TRAINER, true, p => { - p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.formIndex = 1; // G-Max Copperajah - p.generateName(); - p.pokeball = PokeballType.ULTRA_BALL; - p.gender = Gender.FEMALE; - }), ), [TrainerType.PENNY]: new TrainerConfig(++t) .setName("Cassiopeia") .initForEvilTeamLeader("Star Boss", []) .setMixedBattleBgm("battle_star_boss") .setVictoryBgm("victory_team_plasma") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.JOLTEON, SpeciesId.LEAFEON])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.VAPOREON, SpeciesId.UMBREON])) - .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.ESPEON, SpeciesId.GLACEON])) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.FLAREON])) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.ESPEON])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.UMBREON])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.LEAFEON, SpeciesId.GLACEON])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.VAPOREON, SpeciesId.FLAREON, SpeciesId.JOLTEON])) .setPartyMemberFunc( 4, getRandomPartyMemberFunc([SpeciesId.SYLVEON], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); p.abilityIndex = 2; // Pixilate p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.HYPER_VOICE)) { + // Check if Hyper Voice is in the moveset, if not, replace the second move with Hyper Voice. + p.moveset[1] = new PokemonMove(MoveId.HYPER_VOICE); + p.gender = Gender.FEMALE; + } }), ) .setPartyMemberFunc( @@ -5770,7 +5756,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateName(); }), ) - .setInstantTera(4), // Tera Fairy Sylveon + .setInstantTera(3), // Tera Fairy Sylveon [TrainerType.PENNY_2]: new TrainerConfig(++t) .setName("Cassiopeia") .initForEvilTeamLeader("Star Boss", [], true) @@ -5782,7 +5768,11 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); p.abilityIndex = 2; // Pixilate p.generateAndPopulateMoveset(); - p.gender = Gender.FEMALE; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.HYPER_VOICE)) { + // Check if Hyper Voice is in the moveset, if not, replace the second move with Hyper Voice. + p.moveset[1] = new PokemonMove(MoveId.HYPER_VOICE); + p.gender = Gender.FEMALE; + } }), ) .setPartyMemberFunc( @@ -5794,25 +5784,30 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.RAIKOU, SpeciesId.ENTEI, SpeciesId.SUICUNE], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.ESPEON, SpeciesId.UMBREON], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = p.species.speciesId === SpeciesId.UMBREON ? 0 : 2; // Synchronize Umbreon, Magic Bounce Espeon }), ) .setPartyMemberFunc( 3, + getRandomPartyMemberFunc( + [SpeciesId.WALKING_WAKE, SpeciesId.GOUGING_FIRE, SpeciesId.RAGING_BOLT], + TrainerSlot.TRAINER, + true, + p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ROGUE_BALL; + }, + ), + ) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.REVAVROOM], TrainerSlot.TRAINER, true, p => { p.formIndex = randSeedInt(5, 1); // Random Starmobile form p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ROGUE_BALL; - }), - ) - .setPartyMemberFunc( - 4, - getRandomPartyMemberFunc([SpeciesId.ZAMAZENTA], TrainerSlot.TRAINER, true, p => { p.setBoss(true, 2); - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -5826,6 +5821,7 @@ export const trainerConfigs: TrainerConfigs = { }), ) .setInstantTera(0), // Tera Fairy Sylveon + [TrainerType.BUCK]: new TrainerConfig(++t) .setName("Buck") .initForStatTrainer(true) From 98d957de75408c4c8ffbde71be1db6f50f5ee512 Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Thu, 7 Aug 2025 21:58:40 -0500 Subject: [PATCH 091/106] [Balance] Champion Team Adjustments (#6132) * Update Morty * Update trainer-config.ts --------- Co-authored-by: damocleas --- src/data/balance/signature-species.ts | 2 +- src/data/trainers/trainer-config.ts | 396 ++++++++++++++------------ 2 files changed, 219 insertions(+), 179 deletions(-) diff --git a/src/data/balance/signature-species.ts b/src/data/balance/signature-species.ts index fba91f6fe3d..557bcdfed16 100644 --- a/src/data/balance/signature-species.ts +++ b/src/data/balance/signature-species.ts @@ -30,7 +30,7 @@ export const signatureSpecies: SignatureSpecies = new Proxy({ FALKNER: [SpeciesId.PIDGEY, SpeciesId.HOOTHOOT, SpeciesId.NATU, SpeciesId.MURKROW], BUGSY: [SpeciesId.SCYTHER, SpeciesId.SHUCKLE, SpeciesId.YANMA, [SpeciesId.PINSIR, SpeciesId.HERACROSS]], WHITNEY: [SpeciesId.MILTANK, SpeciesId.AIPOM, SpeciesId.IGGLYBUFF, [SpeciesId.GIRAFARIG, SpeciesId.STANTLER]], - MORTY: [SpeciesId.GASTLY, SpeciesId.MISDREAVUS, SpeciesId.DUSKULL, SpeciesId.SABLEYE], + MORTY: [SpeciesId.GASTLY, SpeciesId.MISDREAVUS, SpeciesId.DUSKULL, SpeciesId.HISUI_TYPHLOSION], CHUCK: [SpeciesId.POLIWRATH, SpeciesId.MANKEY, SpeciesId.TYROGUE, SpeciesId.MACHOP], JASMINE: [SpeciesId.STEELIX, SpeciesId.MAGNEMITE, SpeciesId.PINECO, SpeciesId.SKARMORY], PRYCE: [SpeciesId.SWINUB, SpeciesId.SEEL, SpeciesId.SHELLDER, SpeciesId.SNEASEL], diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 6c643737778..7ae157ded96 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -3791,27 +3791,28 @@ export const trainerConfigs: TrainerConfigs = { .setDoubleTrainerType(TrainerType.RED) .setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.ALAKAZAM])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MACHAMP])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.HO_OH], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - }), - ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.ELECTIVIRE])) - .setPartyMemberFunc( - 4, + 1, getRandomPartyMemberFunc( [SpeciesId.ARCANINE, SpeciesId.EXEGGUTOR, SpeciesId.GYARADOS], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); + p.teraType = p.species.type1; }, ), ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.ELECTIVIRE])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.MACHAMP])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([SpeciesId.HO_OH], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + p.abilityIndex = 2; // Regenerator + }), + ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.PIDGEOT], TrainerSlot.TRAINER, true, p => { @@ -3819,9 +3820,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); p.gender = Gender.MALE; + p.setBoss(true, 2); }), ) - .setInstantTera(3), // Tera Ground or Rock Rhyperior / Electric Electivire / Fire Magmortar + .setInstantTera(2), // Tera Fire Arcanine, Tera Grass Exeggutor, Tera Water Gyarados [TrainerType.RED]: new TrainerConfig(++t) .initForChampion(true) .setBattleBgm("battle_johto_champion") @@ -3832,26 +3834,24 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc( 0, getRandomPartyMemberFunc([SpeciesId.PIKACHU], TrainerSlot.TRAINER, true, p => { - p.formIndex = 8; // G-Max Pikachu - p.generateAndPopulateMoveset(); - p.generateName(); + p.formIndex = 1; // Partner Pikachu p.gender = Gender.MALE; + p.generateAndPopulateMoveset(); + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.VOLT_TACKLE)) { + // Check if Volt Tackle is in the moveset, if not, replace the first move with Volt Tackle. + p.moveset[0] = new PokemonMove(MoveId.VOLT_TACKLE); + } }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ESPEON, SpeciesId.UMBREON, SpeciesId.SYLVEON])) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MEGANIUM, SpeciesId.TYPHLOSION, SpeciesId.FERALIGATR])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.ESPEON, SpeciesId.UMBREON, SpeciesId.SYLVEON])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.SNORLAX])) .setPartyMemberFunc( - 2, + 4, getRandomPartyMemberFunc([SpeciesId.LUGIA], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; - }), - ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.MEGANIUM, SpeciesId.TYPHLOSION, SpeciesId.FERALIGATR])) - .setPartyMemberFunc( - 4, - getRandomPartyMemberFunc([SpeciesId.SNORLAX], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); + p.abilityIndex = 2; // Multiscale }), ) .setPartyMemberFunc( @@ -3865,10 +3865,11 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); p.gender = Gender.MALE; + p.setBoss(true, 2); }, ), ) - .setInstantTera(3), // Tera Grass Meganium / Fire Typhlosion / Water Feraligatr + .setInstantTera(0), // Tera Electric Pikachu [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t) .setName("Lance") .initForChampion(true) @@ -3876,37 +3877,38 @@ export const trainerConfigs: TrainerConfigs = { .setMixedBattleBgm("battle_johto_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.GYARADOS, SpeciesId.KINGDRA])) .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.AERODACTYL])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.CHARIZARD])) .setPartyMemberFunc( - 2, + 3, + getRandomPartyMemberFunc( + [SpeciesId.TYRANITAR, SpeciesId.GARCHOMP, SpeciesId.HYDREIGON], + TrainerSlot.TRAINER, + true, + p => { + p.abilityIndex = 2; // Unnerve Tyranitar, Rough Skin Garchomp, Levitate Hydreigon + p.generateAndPopulateMoveset(); + }, + ), + ) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.SALAMENCE], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // Mega Salamence p.generateAndPopulateMoveset(); p.generateName(); }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.CHARIZARD])) - .setPartyMemberFunc( - 4, - getRandomPartyMemberFunc( - [SpeciesId.TYRANITAR, SpeciesId.GARCHOMP, SpeciesId.KOMMO_O], - TrainerSlot.TRAINER, - true, - p => { - p.teraType = PokemonType.DRAGON; - p.generateAndPopulateMoveset(); - p.abilityIndex = p.species.speciesId === SpeciesId.KOMMO_O ? 1 : 2; // Soundproof Kommo-o, Unnerve Tyranitar, Rough Skin Garchomp - }, - ), - ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.DRAGONITE], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); + p.abilityIndex = 2; // Multiscale p.gender = Gender.MALE; p.setBoss(true, 2); + p.teraType = PokemonType.DRAGON; }), ) - .setInstantTera(4), // Tera Dragon Tyranitar / Garchomp / Kommo-o + .setInstantTera(5), // Tera Dragon Dragonite [TrainerType.STEVEN]: new TrainerConfig(++t) .initForChampion(true) .setBattleBgm("battle_hoenn_champion_g5") @@ -3914,16 +3916,22 @@ export const trainerConfigs: TrainerConfigs = { .setHasDouble("steven_wallace_double") .setDoubleTrainerType(TrainerType.WALLACE) .setDoubleTitle("champion_double") - .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SKARMORY])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.CRADILY, SpeciesId.ARMALDO])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.AGGRON], TrainerSlot.TRAINER, true, p => { + 0, + getRandomPartyMemberFunc([SpeciesId.GIGALITH], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 1; // Sand Stream + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.SKARMORY, SpeciesId.CLAYDOL])) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.AGGRON])) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([SpeciesId.GOLURK, SpeciesId.RUNERIGUS], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 0; // Iron Fist Golurk, Wandering Spirit Runerigus p.generateAndPopulateMoveset(); - p.setBoss(true, 2); }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GOLURK, SpeciesId.RUNERIGUS])) .setPartyMemberFunc( 4, getRandomPartyMemberFunc( @@ -3942,6 +3950,7 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 1; // Mega Metagross p.generateAndPopulateMoveset(); p.generateName(); + p.setBoss(true, 2); }), ) .setInstantTera(4), // Tera Rock Regirock / Ice Regice / Steel Registeel @@ -3959,22 +3968,34 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LUDICOLO])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.LATIAS, SpeciesId.LATIOS], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Mega Latios or Mega Latias + 1, + getRandomPartyMemberFunc([SpeciesId.LUDICOLO], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 0; // Swift Swim p.generateAndPopulateMoveset(); - p.generateName(); - p.pokeball = PokeballType.MASTER_BALL; }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.SWAMPERT, SpeciesId.GASTRODON, SpeciesId.SEISMITOAD])) + .setPartyMemberFunc( + 2, + getRandomPartyMemberFunc([SpeciesId.TENTACRUEL, SpeciesId.WALREIN], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = p.species.speciesId === SpeciesId.TENTACRUEL ? 2 : 0; // Rain Dish Tentacruel, Thick Fat Walrein + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc( + 3, + getRandomPartyMemberFunc([SpeciesId.LATIAS, SpeciesId.LATIOS], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.generateName(); + p.pokeball = PokeballType.ULTRA_BALL; + }), + ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.REGIELEKI, SpeciesId.REGIDRAGO], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.SWAMPERT], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; // Mega Swampert p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); }), ) .setPartyMemberFunc( @@ -3985,22 +4006,14 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); }), ) - .setInstantTera(4), // Tera Electric Regieleki / Dragon Regidrago + .setInstantTera(5), // Tera Water Milotic [TrainerType.CYNTHIA]: new TrainerConfig(++t) .initForChampion(false) .setBattleBgm("battle_sinnoh_champion") .setMixedBattleBgm("battle_sinnoh_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.SPIRITOMB])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.LUCARIO])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.GIRATINA], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - }), - ) - .setPartyMemberFunc( - 3, + 1, getRandomPartyMemberFunc( [SpeciesId.MILOTIC, SpeciesId.ROSERADE, SpeciesId.HISUI_ARCANINE], TrainerSlot.TRAINER, @@ -4011,11 +4024,13 @@ export const trainerConfigs: TrainerConfigs = { }, ), ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.TOGEKISS])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.LUCARIO])) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.TOGEKISS], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.GIRATINA], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); + p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -4025,9 +4040,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); p.gender = Gender.FEMALE; + p.setBoss(true, 2); }), ) - .setInstantTera(3), // Tera Water Milotic / Grass Roserade / Fire Hisuian Arcanine + .setInstantTera(1), // Tera Water Milotic / Grass Roserade / Fire Hisuian Arcanine [TrainerType.ALDER]: new TrainerConfig(++t) .initForChampion(true) .setHasDouble("alder_iris_double") @@ -4050,29 +4066,26 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.ZEKROM], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - }), + getRandomPartyMemberFunc([SpeciesId.CHANDELURE, SpeciesId.KROOKODILE, SpeciesId.REUNICLUS, SpeciesId.CONKELDURR]), ) .setPartyMemberFunc( 3, getRandomPartyMemberFunc([SpeciesId.KELDEO], TrainerSlot.TRAINER, true, p => { + p.pokeball = PokeballType.ROGUE_BALL; p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.SECRET_SWORD)) { + // Check if Secret Sword is in the moveset, if not, replace the third move with Secret Sword. + p.moveset[2] = new PokemonMove(MoveId.SECRET_SWORD); + } + p.formIndex = 1; // Resolute Form }), ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc( - [SpeciesId.CHANDELURE, SpeciesId.KROOKODILE, SpeciesId.REUNICLUS, SpeciesId.CONKELDURR], - TrainerSlot.TRAINER, - true, - p => { - p.generateAndPopulateMoveset(); - p.teraType = p.species.speciesId === SpeciesId.KROOKODILE ? PokemonType.DARK : p.species.type1; - }, - ), + getRandomPartyMemberFunc([SpeciesId.ZEKROM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), ) .setPartyMemberFunc( 5, @@ -4080,9 +4093,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); + p.teraType = PokemonType.FIRE; }), ) - .setInstantTera(4), // Tera Ghost Chandelure / Dark Krookodile / Psychic Reuniclus / Fighting Conkeldurr + .setInstantTera(5), // Tera Fire Volcarona [TrainerType.IRIS]: new TrainerConfig(++t) .initForChampion(false) .setBattleBgm("battle_champion_iris") @@ -4091,34 +4105,29 @@ export const trainerConfigs: TrainerConfigs = { .setDoubleTrainerType(TrainerType.ALDER) .setDoubleTitle("champion_double") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.DRUDDIGON])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ARCHEOPS])) .setPartyMemberFunc( - 2, - getRandomPartyMemberFunc([SpeciesId.RESHIRAM], TrainerSlot.TRAINER, true, p => { + 1, + getRandomPartyMemberFunc([SpeciesId.ARCHEOPS], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; // Emergency Exit p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( - 3, - getRandomPartyMemberFunc( - [SpeciesId.SALAMENCE, SpeciesId.HYDREIGON, SpeciesId.ARCHALUDON], - TrainerSlot.TRAINER, - true, - p => { - p.generateAndPopulateMoveset(); - p.teraType = PokemonType.DRAGON; - }, - ), - ) - .setPartyMemberFunc( - 4, + 2, getRandomPartyMemberFunc([SpeciesId.LAPRAS], TrainerSlot.TRAINER, true, p => { p.formIndex = 1; // G-Max Lapras p.generateAndPopulateMoveset(); p.generateName(); }), ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.AGGRON, SpeciesId.HYDREIGON, SpeciesId.ARCHALUDON])) + .setPartyMemberFunc( + 4, + getRandomPartyMemberFunc([SpeciesId.RESHIRAM], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + }), + ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.HAXORUS], TrainerSlot.TRAINER, true, p => { @@ -4128,37 +4137,32 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); }), ) - .setInstantTera(3), // Tera Dragon Salamence / Hydreigon / Archaludon + .setInstantTera(5), // Tera Dragon Haxorus [TrainerType.DIANTHA]: new TrainerConfig(++t) .initForChampion(false) .setMixedBattleBgm("battle_kalos_champion") + .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.HAWLUCHA])) .setPartyMemberFunc( - 0, - getRandomPartyMemberFunc([SpeciesId.HAWLUCHA], TrainerSlot.TRAINER, true, p => { + 1, + getRandomPartyMemberFunc([SpeciesId.TREVENANT, SpeciesId.GOURGEIST], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; // Harvest Trevenant, Insomnia Gourgeist p.generateAndPopulateMoveset(); }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.TREVENANT, SpeciesId.GOURGEIST])) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.XERNEAS], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; - }), - ) - .setPartyMemberFunc( - 3, getRandomPartyMemberFunc([SpeciesId.TYRANTRUM, SpeciesId.AURORUS], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.abilityIndex = 2; // Rock Head Tyrantrum, Snow Warning Aurorus p.teraType = p.species.type2!; }), ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GOODRA])) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.GOODRA], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.XERNEAS], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); + p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -4168,9 +4172,10 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); p.gender = Gender.FEMALE; + p.setBoss(true, 2); }), ) - .setInstantTera(3), // Tera Dragon Tyrantrum / Ice Aurorus + .setInstantTera(2), // Tera Dragon Tyrantrum / Ice Aurorus [TrainerType.KUKUI]: new TrainerConfig(++t) .initForChampion(true) .setMixedBattleBgm("battle_champion_kukui") @@ -4181,7 +4186,13 @@ export const trainerConfigs: TrainerConfigs = { p.formIndex = 2; // Dusk Lycanroc }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.MAGNEZONE, SpeciesId.ALOLA_NINETALES])) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([SpeciesId.MAGNEZONE, SpeciesId.ALOLA_NINETALES], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = p.species.speciesId === SpeciesId.MAGNEZONE ? 1 : 2; // Sturdy Magnezone, Snow Warning Ninetales + }), + ) .setPartyMemberFunc( 2, getRandomPartyMemberFunc( @@ -4191,16 +4202,16 @@ export const trainerConfigs: TrainerConfigs = { p => { p.formIndex = 1; // Therian Formes p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; + p.pokeball = PokeballType.ROGUE_BALL; }, ), ) .setPartyMemberFunc( 3, - getRandomPartyMemberFunc([SpeciesId.TAPU_KOKO, SpeciesId.TAPU_FINI], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.TAPU_LELE, SpeciesId.TAPU_FINI], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); p.pokeball = PokeballType.ULTRA_BALL; + p.abilityIndex = 0; // Psychic / Misty Surge }), ) .setPartyMemberFunc( @@ -4216,6 +4227,7 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.teraType = p.species.type2!; + p.setBoss(true, 2); }), ) .setInstantTera(5), // Tera Dark Incineroar / Fighting Hisuian Decidueye @@ -4223,28 +4235,33 @@ export const trainerConfigs: TrainerConfigs = { .initForChampion(true) .setMixedBattleBgm("battle_alola_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.ALOLA_RAICHU])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.NOIVERN])) + .setPartyMemberFunc( + 1, + getRandomPartyMemberFunc([SpeciesId.NOIVERN], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 1; // Infiltrator + p.generateAndPopulateMoveset(); + }), + ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.SOLGALEO], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.BLACEPHALON, SpeciesId.STAKATAKA], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; + p.pokeball = PokeballType.ROGUE_BALL; }), ) .setPartyMemberFunc( 3, - getRandomPartyMemberFunc([SpeciesId.TAPU_LELE, SpeciesId.TAPU_BULU], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.TAPU_KOKO, SpeciesId.TAPU_BULU], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; - p.teraType = p.species.type1; + p.abilityIndex = 0; // Electric / Grassy Surge }), ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.ZYGARDE], TrainerSlot.TRAINER, true, p => { - p.formIndex = 1; // Zygarde 10% forme, Aura Break + getRandomPartyMemberFunc([SpeciesId.SOLGALEO], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ROGUE_BALL; + p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -4253,34 +4270,35 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.setBoss(true, 2); p.gender = p.species.speciesId === SpeciesId.PRIMARINA ? Gender.FEMALE : Gender.MALE; + p.teraType = p.species.speciesId === SpeciesId.PRIMARINA ? PokemonType.WATER : PokemonType.GHOST; }), ) - .setInstantTera(3), // Tera Psychic Tapu Lele / Grass Tapu Bulu + .setInstantTera(5), // Tera Ghost Decidueye, Water Primarina [TrainerType.LEON]: new TrainerConfig(++t) .initForChampion(true) .setMixedBattleBgm("battle_galar_champion") .setPartyMemberFunc(0, getRandomPartyMemberFunc([SpeciesId.AEGISLASH])) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.RHYPERIOR, SpeciesId.SEISMITOAD, SpeciesId.MR_RIME])) .setPartyMemberFunc( - 2, + 1, + getRandomPartyMemberFunc( + [SpeciesId.RHYPERIOR, SpeciesId.SEISMITOAD, SpeciesId.MR_RIME], + TrainerSlot.TRAINER, + true, + p => { + p.abilityIndex = 1; // Solid Rock Rhyperior, Poison Touch Seismitoad, Screen Cleaner Mr. Rime + p.generateAndPopulateMoveset(); + }, + ), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.DRAGAPULT])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.RILLABOOM, SpeciesId.CINDERACE, SpeciesId.INTELEON])) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.ZACIAN], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.DRAGAPULT])) - .setPartyMemberFunc( - 4, - getRandomPartyMemberFunc( - [SpeciesId.RILLABOOM, SpeciesId.CINDERACE, SpeciesId.INTELEON], - TrainerSlot.TRAINER, - true, - p => { - p.generateAndPopulateMoveset(); - p.setBoss(true, 2); - }, - ), - ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.CHARIZARD], TrainerSlot.TRAINER, true, p => { @@ -4288,22 +4306,23 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.generateName(); p.gender = Gender.MALE; + p.setBoss(true, 2); }), ) - .setInstantTera(3), // Tera Dragapult to Ghost or Dragon + .setInstantTera(3), // Tera Grass Rillaboom, Fire Cinderace, Water Inteleon [TrainerType.MUSTARD]: new TrainerConfig(++t) .initForChampion(true) .setMixedBattleBgm("battle_mustard") .setPartyMemberFunc( 0, - getRandomPartyMemberFunc([SpeciesId.CORVIKNIGHT], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.MIENSHAO], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; }), ) .setPartyMemberFunc( 1, - getRandomPartyMemberFunc([SpeciesId.KOMMO_O], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.CORVIKNIGHT], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.ULTRA_BALL; }), @@ -4312,36 +4331,46 @@ export const trainerConfigs: TrainerConfigs = { 2, getRandomPartyMemberFunc([SpeciesId.GALAR_SLOWBRO, SpeciesId.GALAR_SLOWKING], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); + p.abilityIndex = p.species.speciesId === SpeciesId.GALAR_SLOWBRO ? 0 : 2; // Quick Draw Galar Slowbro, Regenerator Galar Slowking p.pokeball = PokeballType.ULTRA_BALL; - p.teraType = p.species.type1; }), ) .setPartyMemberFunc( 3, - getRandomPartyMemberFunc([SpeciesId.GALAR_DARMANITAN], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); + getRandomPartyMemberFunc([SpeciesId.VENUSAUR, SpeciesId.BLASTOISE], TrainerSlot.TRAINER, true, p => { p.pokeball = PokeballType.ULTRA_BALL; }), ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.BLASTOISE, SpeciesId.VENUSAUR], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.KOMMO_O], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.setBoss(true, 2); p.pokeball = PokeballType.ULTRA_BALL; + p.generateAndPopulateMoveset(); }), ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.URSHIFU], TrainerSlot.TRAINER, true, p => { - p.formIndex = randSeedIntRange(2, 3); // Random G-Max Urshifu - p.generateAndPopulateMoveset(); + p.formIndex = randSeedIntRange(2, 3); // Random G-Max Urshifu form p.generateName(); p.gender = Gender.MALE; p.pokeball = PokeballType.ULTRA_BALL; + p.setBoss(true, 2); + if (p.formIndex === 2) { + p.moveset[0] = new PokemonMove(MoveId.WICKED_BLOW); + p.moveset[1] = new PokemonMove(MoveId.BRICK_BREAK); + p.moveset[2] = new PokemonMove(randSeedItem([MoveId.FIRE_PUNCH, MoveId.THUNDER_PUNCH, MoveId.ICE_PUNCH])); + p.moveset[3] = new PokemonMove(MoveId.FOCUS_ENERGY); + } else if (p.formIndex === 3) { + p.moveset[0] = new PokemonMove(MoveId.SURGING_STRIKES); + p.moveset[1] = new PokemonMove(MoveId.BRICK_BREAK); + p.moveset[2] = new PokemonMove(randSeedItem([MoveId.FIRE_PUNCH, MoveId.THUNDER_PUNCH, MoveId.ICE_PUNCH])); + p.moveset[3] = new PokemonMove(MoveId.FOCUS_ENERGY); + } }), ) - .setInstantTera(2), // Tera Poison Galar-Slowbro / Galar-Slowking + .setInstantTera(4), // Tera Fighting Kommo-o [TrainerType.GEETA]: new TrainerConfig(++t) .initForChampion(false) .setMixedBattleBgm("battle_champion_geeta") @@ -4353,16 +4382,22 @@ export const trainerConfigs: TrainerConfigs = { p.setBoss(true, 2); }), ) - .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.ESPATHRA, SpeciesId.VELUZA])) .setPartyMemberFunc( - 2, + 1, + getRandomPartyMemberFunc([SpeciesId.ESPATHRA], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 0; // Opportunist + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([SpeciesId.BAXCALIBUR])) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.CHESNAUGHT, SpeciesId.DELPHOX, SpeciesId.GRENINJA])) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.MIRAIDON], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.BAXCALIBUR])) - .setPartyMemberFunc(4, getRandomPartyMemberFunc([SpeciesId.CHESNAUGHT, SpeciesId.DELPHOX, SpeciesId.GRENINJA])) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.KINGAMBIT], TrainerSlot.TRAINER, true, p => { @@ -4389,19 +4424,19 @@ export const trainerConfigs: TrainerConfigs = { .setPartyMemberFunc(1, getRandomPartyMemberFunc([SpeciesId.PAWMOT])) .setPartyMemberFunc( 2, + getRandomPartyMemberFunc([SpeciesId.DUDUNSPARCE], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 0; // Serene Grace + p.generateAndPopulateMoveset(); + }), + ) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.ARMAROUGE, SpeciesId.CERULEDGE])) + .setPartyMemberFunc( + 4, getRandomPartyMemberFunc([SpeciesId.KORAIDON], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; }), ) - .setPartyMemberFunc(3, getRandomPartyMemberFunc([SpeciesId.GHOLDENGO])) - .setPartyMemberFunc( - 4, - getRandomPartyMemberFunc([SpeciesId.ARMAROUGE, SpeciesId.CERULEDGE], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); - p.teraType = p.species.type2!; - }), - ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc( @@ -4412,10 +4447,11 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); + p.teraType = p.species.type2!; }, ), ) - .setInstantTera(4), // Tera Psychic Armarouge / Ghost Ceruledge + .setInstantTera(5), // Tera Dark Meowscarada, Ghost Skeledirge, Fighting Quaquaval [TrainerType.KIERAN]: new TrainerConfig(++t) .initForChampion(true) .setMixedBattleBgm("battle_champion_kieran") @@ -4429,9 +4465,9 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 2, - getRandomPartyMemberFunc([SpeciesId.TERAPAGOS], TrainerSlot.TRAINER, true, p => { + getRandomPartyMemberFunc([SpeciesId.DRAGONITE], TrainerSlot.TRAINER, true, p => { + p.abilityIndex = 2; // Multiscale p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( @@ -4443,25 +4479,29 @@ export const trainerConfigs: TrainerConfigs = { ) .setPartyMemberFunc( 4, - getRandomPartyMemberFunc([SpeciesId.OGERPON], TrainerSlot.TRAINER, true, p => { - p.formIndex = randSeedInt(4); // Random Ogerpon Tera Mask + getRandomPartyMemberFunc([SpeciesId.TERAPAGOS], TrainerSlot.TRAINER, true, p => { p.generateAndPopulateMoveset(); - p.pokeball = PokeballType.ULTRA_BALL; - if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.IVY_CUDGEL)) { - // Check if Ivy Cudgel is in the moveset, if not, replace the first move with Ivy Cudgel. - p.moveset[0] = new PokemonMove(MoveId.IVY_CUDGEL); + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.TERA_STARSTORM)) { + // Check if Tera Starstorm is in the moveset, if not, replace the first move with Tera Starstorm. + p.moveset[0] = new PokemonMove(MoveId.TERA_STARSTORM); } + p.pokeball = PokeballType.MASTER_BALL; }), ) .setPartyMemberFunc( 5, getRandomPartyMemberFunc([SpeciesId.HYDRAPPLE], TrainerSlot.TRAINER, true, p => { - p.generateAndPopulateMoveset(); p.gender = Gender.MALE; p.setBoss(true, 2); + p.teraType = PokemonType.FIGHTING; + p.generateAndPopulateMoveset(); + if (!p.moveset.some(move => !isNullOrUndefined(move) && move.moveId === MoveId.TERA_BLAST)) { + // Check if Tera Blast is in the moveset, if not, replace the third move with Tera Blast. + p.moveset[2] = new PokemonMove(MoveId.TERA_BLAST); + } }), ) - .setInstantTera(4), // Tera Ogerpon + .setInstantTera(5), // Tera Fighting Hydrapple [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)) .setName("Finn") From a289206a96aae81ef07c7cea50afb2eafebc03d7 Mon Sep 17 00:00:00 2001 From: damocleas Date: Thu, 7 Aug 2025 23:33:16 -0400 Subject: [PATCH 092/106] [Balance] More Passive/Egg Move/Cost changes for 1.10 (#6234) * Update passives.ts * Update egg-moves.ts * Update starters.ts --- src/data/balance/egg-moves.ts | 10 +++++----- src/data/balance/passives.ts | 20 ++++++++++---------- src/data/balance/starters.ts | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/data/balance/egg-moves.ts b/src/data/balance/egg-moves.ts index 3475fe4fdea..e936afcdc08 100644 --- a/src/data/balance/egg-moves.ts +++ b/src/data/balance/egg-moves.ts @@ -15,7 +15,7 @@ export const speciesEggMoves = { [SpeciesId.SPEAROW]: [ MoveId.FLOATY_FALL, MoveId.EXTREME_SPEED, MoveId.KNOCK_OFF, MoveId.TRIPLE_ARROWS ], [SpeciesId.EKANS]: [ MoveId.NOXIOUS_TORQUE, MoveId.DRAGON_DANCE, MoveId.SLACK_OFF, MoveId.SHED_TAIL ], [SpeciesId.SANDSHREW]: [ MoveId.HIGH_HORSEPOWER, MoveId.DIRE_CLAW, MoveId.SHORE_UP, MoveId.MIGHTY_CLEAVE ], - [SpeciesId.NIDORAN_F]: [ MoveId.CALM_MIND, MoveId.MOONLIGHT, MoveId.MALIGNANT_CHAIN, MoveId.SANDSEAR_STORM ], + [SpeciesId.NIDORAN_F]: [ MoveId.BANEFUL_BUNKER, MoveId.MOONLIGHT, MoveId.BARB_BARRAGE, MoveId.THOUSAND_WAVES ], [SpeciesId.NIDORAN_M]: [ MoveId.DRAGON_DANCE, MoveId.MOUNTAIN_GALE, MoveId.NOXIOUS_TORQUE, MoveId.PRECIPICE_BLADES ], [SpeciesId.VULPIX]: [ MoveId.MOONBLAST, MoveId.INFERNAL_PARADE, MoveId.MORNING_SUN, MoveId.TAIL_GLOW ], [SpeciesId.ZUBAT]: [ MoveId.FLOATY_FALL, MoveId.DIRE_CLAW, MoveId.SWORDS_DANCE, MoveId.COLLISION_COURSE ], @@ -293,7 +293,7 @@ export const speciesEggMoves = { [SpeciesId.ARCHEN]: [ MoveId.ROOST, MoveId.EARTHQUAKE, MoveId.FLOATY_FALL, MoveId.MIGHTY_CLEAVE ], [SpeciesId.TRUBBISH]: [ MoveId.COIL, MoveId.RECOVER, MoveId.DIRE_CLAW, MoveId.GIGATON_HAMMER ], [SpeciesId.ZORUA]: [ MoveId.MALIGNANT_CHAIN, MoveId.MOONBLAST, MoveId.SECRET_SWORD, MoveId.FIERY_WRATH ], - [SpeciesId.MINCCINO]: [ MoveId.ICICLE_SPEAR, MoveId.TIDY_UP, MoveId.KNOCK_OFF, MoveId.POPULATION_BOMB ], + [SpeciesId.MINCCINO]: [ MoveId.ICICLE_SPEAR, MoveId.TIDY_UP, MoveId.LOW_KICK, MoveId.POPULATION_BOMB ], [SpeciesId.GOTHITA]: [ MoveId.RECOVER, MoveId.MOONBLAST, MoveId.AURA_SPHERE, MoveId.LUMINA_CRASH ], [SpeciesId.SOLOSIS]: [ MoveId.MIST_BALL, MoveId.SPEED_SWAP, MoveId.FLAMETHROWER, MoveId.LIGHT_OF_RUIN ], [SpeciesId.DUCKLETT]: [ MoveId.SPLISHY_SPLASH, MoveId.SANDSEAR_STORM, MoveId.WILDBOLT_STORM, MoveId.QUIVER_DANCE ], @@ -310,7 +310,7 @@ export const speciesEggMoves = { [SpeciesId.TYNAMO]: [ MoveId.SCALD, MoveId.STRENGTH_SAP, MoveId.FIRE_LASH, MoveId.AURA_WHEEL ], [SpeciesId.ELGYEM]: [ MoveId.THUNDERCLAP, MoveId.BADDY_BAD, MoveId.AURA_SPHERE, MoveId.PHOTON_GEYSER ], [SpeciesId.LITWICK]: [ MoveId.GIGA_DRAIN, MoveId.EARTH_POWER, MoveId.MOONBLAST, MoveId.TORCH_SONG ], - [SpeciesId.AXEW]: [ MoveId.STONE_AXE, MoveId.DIRE_CLAW, MoveId.BITTER_BLADE, MoveId.GLAIVE_RUSH ], + [SpeciesId.AXEW]: [ MoveId.STONE_AXE, MoveId.DIRE_CLAW, MoveId.RAGING_FURY, MoveId.BITTER_BLADE ], [SpeciesId.CUBCHOO]: [ MoveId.MOUNTAIN_GALE, MoveId.AQUA_STEP, MoveId.ICE_SHARD, MoveId.COLLISION_COURSE ], [SpeciesId.CRYOGONAL]: [ MoveId.FREEZING_GLARE, MoveId.AURORA_VEIL, MoveId.NASTY_PLOT, MoveId.ORIGIN_PULSE ], [SpeciesId.SHELMET]: [ MoveId.POWER_GEM, MoveId.NASTY_PLOT, MoveId.EARTH_POWER, MoveId.STEAM_ERUPTION ], @@ -448,7 +448,7 @@ export const speciesEggMoves = { [SpeciesId.ROOKIDEE]: [ MoveId.ROOST, MoveId.BODY_PRESS, MoveId.KINGS_SHIELD, MoveId.BEHEMOTH_BASH ], [SpeciesId.BLIPBUG]: [ MoveId.HEAL_ORDER, MoveId.LUSTER_PURGE, MoveId.SLEEP_POWDER, MoveId.TAIL_GLOW ], [SpeciesId.NICKIT]: [ MoveId.BADDY_BAD, MoveId.MYSTICAL_FIRE, MoveId.SPARKLY_SWIRL, MoveId.MAKE_IT_RAIN ], - [SpeciesId.GOSSIFLEUR]: [ MoveId.PARTING_SHOT, MoveId.STRENGTH_SAP, MoveId.SAPPY_SEED, MoveId.SEED_FLARE ], + [SpeciesId.GOSSIFLEUR]: [ MoveId.BATON_PASS, MoveId.TAILWIND, MoveId.SAPPY_SEED, MoveId.SPORE ], [SpeciesId.WOOLOO]: [ MoveId.NUZZLE, MoveId.MILK_DRINK, MoveId.BODY_PRESS, MoveId.MULTI_ATTACK ], [SpeciesId.CHEWTLE]: [ MoveId.ICE_FANG, MoveId.PSYCHIC_FANGS, MoveId.SHELL_SMASH, MoveId.MIGHTY_CLEAVE ], [SpeciesId.YAMPER]: [ MoveId.ICE_FANG, MoveId.SWORDS_DANCE, MoveId.THUNDER_FANG, MoveId.BOLT_STRIKE ], @@ -514,7 +514,7 @@ export const speciesEggMoves = { [SpeciesId.TAROUNTULA]: [ MoveId.STONE_AXE, MoveId.LEECH_LIFE, MoveId.FAKE_OUT, MoveId.SPORE ], [SpeciesId.NYMBLE]: [ MoveId.KNOCK_OFF, MoveId.FELL_STINGER, MoveId.ATTACK_ORDER, MoveId.WICKED_BLOW ], [SpeciesId.PAWMI]: [ MoveId.DRAIN_PUNCH, MoveId.METEOR_MASH, MoveId.JET_PUNCH, MoveId.PLASMA_FISTS ], - [SpeciesId.TANDEMAUS]: [ MoveId.BATON_PASS, MoveId.COVET, MoveId.SIZZLY_SLIDE, MoveId.REVIVAL_BLESSING ], + [SpeciesId.TANDEMAUS]: [ MoveId.BATON_PASS, MoveId.FAKE_OUT, MoveId.POWER_UP_PUNCH, MoveId.REVIVAL_BLESSING ], [SpeciesId.FIDOUGH]: [ MoveId.SOFT_BOILED, MoveId.HIGH_HORSEPOWER, MoveId.SIZZLY_SLIDE, MoveId.TIDY_UP ], [SpeciesId.SMOLIV]: [ MoveId.STRENGTH_SAP, MoveId.EARTH_POWER, MoveId.CALM_MIND, MoveId.BOOMBURST ], [SpeciesId.SQUAWKABILLY]: [ MoveId.PARTING_SHOT, MoveId.EARTHQUAKE, MoveId.FLARE_BLITZ, MoveId.EXTREME_SPEED ], diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index c0f84d90cf0..64fa9b87138 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -36,9 +36,9 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.ARBOK]: { 0: AbilityId.REGENERATOR }, [SpeciesId.SANDSHREW]: { 0: AbilityId.TOUGH_CLAWS }, [SpeciesId.SANDSLASH]: { 0: AbilityId.TOUGH_CLAWS }, - [SpeciesId.NIDORAN_F]: { 0: AbilityId.FLARE_BOOST }, - [SpeciesId.NIDORINA]: { 0: AbilityId.FLARE_BOOST }, - [SpeciesId.NIDOQUEEN]: { 0: AbilityId.FLARE_BOOST }, + [SpeciesId.NIDORAN_F]: { 0: AbilityId.TOXIC_DEBRIS }, + [SpeciesId.NIDORINA]: { 0: AbilityId.TOXIC_DEBRIS }, + [SpeciesId.NIDOQUEEN]: { 0: AbilityId.TOXIC_DEBRIS }, [SpeciesId.NIDORAN_M]: { 0: AbilityId.GUTS }, [SpeciesId.NIDORINO]: { 0: AbilityId.GUTS }, [SpeciesId.NIDOKING]: { 0: AbilityId.GUTS }, @@ -220,8 +220,8 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.YANMEGA]: { 0: AbilityId.SHEER_FORCE }, [SpeciesId.WOOPER]: { 0: AbilityId.WATER_VEIL }, [SpeciesId.QUAGSIRE]: { 0: AbilityId.COMATOSE }, - [SpeciesId.MURKROW]: { 0: AbilityId.DARK_AURA }, - [SpeciesId.HONCHKROW]: { 0: AbilityId.DARK_AURA }, + [SpeciesId.MURKROW]: { 0: AbilityId.UNNERVE }, + [SpeciesId.HONCHKROW]: { 0: AbilityId.INTIMIDATE }, [SpeciesId.MISDREAVUS]: { 0: AbilityId.BEADS_OF_RUIN }, [SpeciesId.MISMAGIUS]: { 0: AbilityId.BEADS_OF_RUIN }, [SpeciesId.UNOWN]: { 0: AbilityId.ADAPTABILITY, 1: AbilityId.BEAST_BOOST, 2: AbilityId.CONTRARY, 3: AbilityId.DAZZLING, 4: AbilityId.EMERGENCY_EXIT, 5: AbilityId.FRIEND_GUARD, 6: AbilityId.GOOD_AS_GOLD, 7: AbilityId.HONEY_GATHER, 8: AbilityId.IMPOSTER, 9: AbilityId.JUSTIFIED, 10: AbilityId.KLUTZ, 11: AbilityId.LIBERO, 12: AbilityId.MOODY, 13: AbilityId.NEUTRALIZING_GAS, 14: AbilityId.OPPORTUNIST, 15: AbilityId.PICKUP, 16: AbilityId.QUICK_DRAW, 17: AbilityId.RUN_AWAY, 18: AbilityId.SIMPLE, 19: AbilityId.TRACE, 20: AbilityId.UNNERVE, 21: AbilityId.VICTORY_STAR, 22: AbilityId.WANDERING_SPIRIT, 23: AbilityId.FAIRY_AURA, 24: AbilityId.DARK_AURA, 25: AbilityId.AURA_BREAK, 26: AbilityId.PURE_POWER, 27: AbilityId.UNAWARE }, @@ -391,7 +391,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.BANETTE]: { 0: AbilityId.SHADOW_SHIELD, 1: AbilityId.SHADOW_SHIELD }, [SpeciesId.DUSKULL]: { 0: AbilityId.UNNERVE }, [SpeciesId.DUSCLOPS]: { 0: AbilityId.UNNERVE }, - [SpeciesId.DUSKNOIR]: { 0: AbilityId.UNNERVE }, + [SpeciesId.DUSKNOIR]: { 0: AbilityId.LEVITATE }, [SpeciesId.TROPIUS]: { 0: AbilityId.RIPEN }, [SpeciesId.ABSOL]: { 0: AbilityId.SHARPNESS, 1: AbilityId.SHARPNESS }, [SpeciesId.WYNAUT]: { 0: AbilityId.STURDY }, @@ -640,9 +640,9 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.LITWICK]: { 0: AbilityId.SHADOW_TAG }, [SpeciesId.LAMPENT]: { 0: AbilityId.SHADOW_TAG }, [SpeciesId.CHANDELURE]: { 0: AbilityId.SHADOW_TAG }, - [SpeciesId.AXEW]: { 0: AbilityId.DRAGONS_MAW }, - [SpeciesId.FRAXURE]: { 0: AbilityId.DRAGONS_MAW }, - [SpeciesId.HAXORUS]: { 0: AbilityId.DRAGONS_MAW }, + [SpeciesId.AXEW]: { 0: AbilityId.OWN_TEMPO }, + [SpeciesId.FRAXURE]: { 0: AbilityId.OWN_TEMPO }, + [SpeciesId.HAXORUS]: { 0: AbilityId.OWN_TEMPO }, [SpeciesId.CUBCHOO]: { 0: AbilityId.FUR_COAT }, [SpeciesId.BEARTIC]: { 0: AbilityId.FUR_COAT }, [SpeciesId.CRYOGONAL]: { 0: AbilityId.SNOW_WARNING }, @@ -827,7 +827,7 @@ export const starterPassiveAbilities: StarterPassiveAbilities = { [SpeciesId.TAPU_LELE]: { 0: AbilityId.BERSERK }, [SpeciesId.TAPU_BULU]: { 0: AbilityId.FLOWER_VEIL }, [SpeciesId.TAPU_FINI]: { 0: AbilityId.FAIRY_AURA }, - [SpeciesId.COSMOG]: { 0: AbilityId.PICKUP }, + [SpeciesId.COSMOG]: { 0: AbilityId.POWER_SPOT }, [SpeciesId.COSMOEM]: { 0: AbilityId.POWER_SPOT }, [SpeciesId.SOLGALEO]: { 0: AbilityId.BEAST_BOOST }, [SpeciesId.LUNALA]: { 0: AbilityId.BEAST_BOOST }, diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index 8b91c12ae2d..99d5ad62e47 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -566,7 +566,7 @@ export const speciesStarterCosts = { [SpeciesId.FLITTLE]: 3, [SpeciesId.TINKATINK]: 4, [SpeciesId.WIGLETT]: 2, - [SpeciesId.BOMBIRDIER]: 3, + [SpeciesId.BOMBIRDIER]: 4, [SpeciesId.FINIZEN]: 3, [SpeciesId.VAROOM]: 4, [SpeciesId.CYCLIZAR]: 4, From 7873181726be36cd3993e16712d4a5b2cd3bb124 Mon Sep 17 00:00:00 2001 From: Desroi <96223572+Desroi@users.noreply.github.com> Date: Thu, 7 Aug 2025 22:46:19 -0500 Subject: [PATCH 093/106] [Bug] Fix Recoil & Shell Bell not applying when hitting Substitute https://github.com/pagefaultgames/pokerogue/pull/5712 * Created Double Edge testing for recoil damage on substitutes * Changed the logic for substitute damage * Made testing for the updated substitute logic * Update test formatting * Fixed error in damage logic * Apply Biome * Fix test file * Apply suggestion and update test * Remove obsolete workaround and console logs --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/phases/move-effect-phase.ts | 1 + test/moves/recoil-moves.test.ts | 84 +++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 test/moves/recoil-moves.test.ts diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index c57e0f6cead..767d7a79968 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -829,6 +829,7 @@ export class MoveEffectPhase extends PokemonPhase { const substitute = target.getTag(SubstituteTag); const isBlockedBySubstitute = substitute && this.move.hitsSubstitute(user, target); if (isBlockedBySubstitute) { + user.turnData.totalDamageDealt += Math.min(dmg, substitute.hp); substitute.hp -= dmg; } else if (!target.isPlayer() && dmg >= target.hp) { globalScene.applyModifiers(EnemyEndureChanceModifier, false, target); diff --git a/test/moves/recoil-moves.test.ts b/test/moves/recoil-moves.test.ts new file mode 100644 index 00000000000..6fc69c932ac --- /dev/null +++ b/test/moves/recoil-moves.test.ts @@ -0,0 +1,84 @@ +import { AbilityId } from "#enums/ability-id"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { MoveId } from "#enums/move-id"; +import { SpeciesId } from "#enums/species-id"; +import { GameManager } from "#test/test-utils/game-manager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Recoil Moves", () => { + 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 + .battleStyle("single") + .enemySpecies(SpeciesId.PIDOVE) + .startingLevel(1) + .enemyLevel(100) + .enemyMoveset(MoveId.SUBSTITUTE) + .criticalHits(false) + .ability(AbilityId.NO_GUARD) + .enemyAbility(AbilityId.BALL_FETCH); + }); + + it.each([ + { moveName: "Double Edge", moveId: MoveId.DOUBLE_EDGE }, + { moveName: "Brave Bird", moveId: MoveId.BRAVE_BIRD }, + { moveName: "Flare Blitz", moveId: MoveId.FLARE_BLITZ }, + { moveName: "Head Charge", moveId: MoveId.HEAD_CHARGE }, + { moveName: "Head Smash", moveId: MoveId.HEAD_SMASH }, + { moveName: "Light of Ruin", moveId: MoveId.LIGHT_OF_RUIN }, + { moveName: "Struggle", moveId: MoveId.STRUGGLE }, + { moveName: "Submission", moveId: MoveId.SUBMISSION }, + { moveName: "Take Down", moveId: MoveId.TAKE_DOWN }, + { moveName: "Volt Tackle", moveId: MoveId.VOLT_TACKLE }, + { moveName: "Wave Crash", moveId: MoveId.WAVE_CRASH }, + { moveName: "Wild Charge", moveId: MoveId.WILD_CHARGE }, + { moveName: "Wood Hammer", moveId: MoveId.WOOD_HAMMER }, + ])("$moveName causes recoil damage when hitting a substitute", async ({ moveId }) => { + await game.classicMode.startBattle([SpeciesId.TOGEPI]); + + game.move.use(moveId); + await game.phaseInterceptor.to("MoveEndPhase"); // Pidove substitute + + const pidove = game.field.getEnemyPokemon(); + const subTag = pidove.getTag(BattlerTagType.SUBSTITUTE)!; + expect(subTag).toBeDefined(); + const subInitialHp = subTag.hp; + + await game.phaseInterceptor.to("MoveEndPhase"); // player attack + + expect(subTag.hp).toBeLessThan(subInitialHp); + + const playerPokemon = game.field.getPlayerPokemon(); + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); + }); + + it("causes recoil damage when hitting a substitute in a double battle", async () => { + game.override.battleStyle("double"); + + await game.classicMode.startBattle([SpeciesId.TOGEPI, SpeciesId.TOGEPI]); + + const [playerPokemon1, playerPokemon2] = game.scene.getPlayerField(); + + game.move.use(MoveId.DOUBLE_EDGE, 0); + game.move.use(MoveId.DOUBLE_EDGE, 1); + + await game.toNextTurn(); + + expect(playerPokemon1.hp).toBeLessThan(playerPokemon1.getMaxHp()); + expect(playerPokemon2.hp).toBeLessThan(playerPokemon2.getMaxHp()); + }); +}); From 32f5421b329110244e14c321147f203e5f7edf50 Mon Sep 17 00:00:00 2001 From: Madmadness65 Date: Thu, 7 Aug 2025 23:11:03 -0500 Subject: [PATCH 094/106] [Misc] Replace `Abilities.ABILITY_NAME` with `AbilityId.ABILITY_NAME` in comments This commit mirrors the comment changes made in 375587213e344ab3531391b2c96ceb75bac08e5d. --- src/data/abilities/ability.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/abilities/ability.ts b/src/data/abilities/ability.ts index 336d45fed66..f5fd9b19f72 100644 --- a/src/data/abilities/ability.ts +++ b/src/data/abilities/ability.ts @@ -5491,7 +5491,7 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { * Attribute used for abilities that damage opponents causing the user to faint * equal to the amount of damage the last attack inflicted. * - * Used for {@linkcode Abilities.INNARDS_OUT}. + * Used for {@linkcode AbilityId.INNARDS_OUT | Innards Out}. * @sealed */ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { @@ -7307,7 +7307,7 @@ export function initAbilities() { .attr(HealFromBerryUseAbAttr, 1 / 3), new Ability(AbilityId.PROTEAN, 6) .attr(PokemonTypeChangeAbAttr) - // .condition((p) => !p.summonData.abilitiesApplied.includes(Abilities.PROTEAN)) //Gen 9 Implementation + // .condition((p) => !p.summonData.abilitiesApplied.includes(AbilityId.PROTEAN)) //Gen 9 Implementation // TODO: needs testing on interaction with weather blockage .edgeCase(), new Ability(AbilityId.FUR_COAT, 6) @@ -7566,7 +7566,7 @@ export function initAbilities() { .attr(PostSummonStatStageChangeAbAttr, [ Stat.DEF ], 1, true), new Ability(AbilityId.LIBERO, 8) .attr(PokemonTypeChangeAbAttr) - //.condition((p) => !p.summonData.abilitiesApplied.includes(Abilities.LIBERO)), //Gen 9 Implementation + //.condition((p) => !p.summonData.abilitiesApplied.includes(AbilityId.LIBERO)), //Gen 9 Implementation // TODO: needs testing on interaction with weather blockage .edgeCase(), new Ability(AbilityId.BALL_FETCH, 8) From 2dfe7232aa3e01989421d139c23e8462b80c37e0 Mon Sep 17 00:00:00 2001 From: damocleas Date: Fri, 8 Aug 2025 00:27:59 -0400 Subject: [PATCH 095/106] Add 1/16 chance for Trainers in Laboratory --- src/field/arena.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/field/arena.ts b/src/field/arena.ts index ed2f1df9b12..06ba6fdd334 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -536,6 +536,7 @@ export class Arena { case BiomeId.ABYSS: case BiomeId.SPACE: case BiomeId.TEMPLE: + case BiomeId.LABORATORY: return 16; default: return 0; From 8a66cfe40b51fdca48441b4f003fd9f40c04f017 Mon Sep 17 00:00:00 2001 From: Blitzy <118096277+Blitz425@users.noreply.github.com> Date: Fri, 8 Aug 2025 14:28:33 -0500 Subject: [PATCH 096/106] =?UTF-8?q?[Bug]=20Fix=20Pok=C3=A9=20Fan=20in=20Tr?= =?UTF-8?q?ainer=20Config=20(#6238)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix Poke Fan in Trainer Config --- src/data/trainers/trainer-config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 7ae157ded96..0f047157174 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -1593,9 +1593,9 @@ export const trainerConfigs: TrainerConfigs = { .setSpeciesFilter(s => tmSpecies[MoveId.FLY].indexOf(s.speciesId) > -1), [TrainerType.POKEFAN]: new TrainerConfig(++t) .setMoneyMultiplier(1.4) - .setName("PokéFan") - .setHasGenders("PokéFan Female") - .setHasDouble("PokéFan Family") + .setName("Pokéfan") + .setHasGenders("Pokéfan Female") + .setHasDouble("Pokéfan Family") .setEncounterBgm(TrainerType.POKEFAN) .setPartyTemplates( trainerPartyTemplates.SIX_WEAKER, From 7316628448079c5f8b4c7a1d4f1c808fd0b20bb8 Mon Sep 17 00:00:00 2001 From: Madmadness65 Date: Fri, 8 Aug 2025 20:31:51 -0500 Subject: [PATCH 097/106] [Misc] Fix comment formatting nitpick in ability-id Adds a space between every `/**` and `{@link`. --- src/enums/ability-id.ts | 622 ++++++++++++++++++++-------------------- 1 file changed, 311 insertions(+), 311 deletions(-) diff --git a/src/enums/ability-id.ts b/src/enums/ability-id.ts index c9681fb1109..f054c7b574e 100644 --- a/src/enums/ability-id.ts +++ b/src/enums/ability-id.ts @@ -1,624 +1,624 @@ export enum AbilityId { - /**{@link https://bulbapedia.bulbagarden.net/wiki/None_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/None_(ability) | Source} */ NONE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stench_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stench_(ability) | Source} */ STENCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Drizzle_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Drizzle_(ability) | Source} */ DRIZZLE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Speed_Boost_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Speed_Boost_(ability) | Source} */ SPEED_BOOST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Battle_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Battle_Armor_(ability) | Source} */ BATTLE_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sturdy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sturdy_(ability) | Source} */ STURDY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Damp_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Damp_(ability) | Source} */ DAMP, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Limber_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Limber_(ability) | Source} */ LIMBER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Veil_(ability) | Source} */ SAND_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Static_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Static_(ability) | Source} */ STATIC, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Volt_Absorb_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Volt_Absorb_(ability) | Source} */ VOLT_ABSORB, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Water_Absorb_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Water_Absorb_(ability) | Source} */ WATER_ABSORB, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Oblivious_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Oblivious_(ability) | Source} */ OBLIVIOUS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cloud_Nine_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cloud_Nine_(ability) | Source} */ CLOUD_NINE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Compound_Eyes_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Compound_Eyes_(ability) | Source} */ COMPOUND_EYES, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Insomnia_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Insomnia_(ability) | Source} */ INSOMNIA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Color_Change_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Color_Change_(ability) | Source} */ COLOR_CHANGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Immunity_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Immunity_(ability) | Source} */ IMMUNITY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flash_Fire_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flash_Fire_(ability) | Source} */ FLASH_FIRE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shield_Dust_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shield_Dust_(ability) | Source} */ SHIELD_DUST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Own_Tempo_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Own_Tempo_(ability) | Source} */ OWN_TEMPO, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Suction_Cups_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Suction_Cups_(ability) | Source} */ SUCTION_CUPS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Intimidate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Intimidate_(ability) | Source} */ INTIMIDATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shadow_Tag_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shadow_Tag_(ability) | Source} */ SHADOW_TAG, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rough_Skin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rough_Skin_(ability) | Source} */ ROUGH_SKIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Guard_(ability) | Source} */ WONDER_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Levitate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Levitate_(ability) | Source} */ LEVITATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Effect_Spore_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Effect_Spore_(ability) | Source} */ EFFECT_SPORE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Synchronize_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Synchronize_(ability) | Source} */ SYNCHRONIZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Clear_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Clear_Body_(ability) | Source} */ CLEAR_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Natural_Cure_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Natural_Cure_(ability) | Source} */ NATURAL_CURE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Lightning_Rod_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Lightning_Rod_(ability) | Source} */ LIGHTNING_ROD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Serene_Grace_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Serene_Grace_(ability) | Source} */ SERENE_GRACE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Swift_Swim_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Swift_Swim_(ability) | Source} */ SWIFT_SWIM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Chlorophyll_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Chlorophyll_(ability) | Source} */ CHLOROPHYLL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Illuminate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Illuminate_(ability) | Source} */ ILLUMINATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Trace_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Trace_(ability) | Source} */ TRACE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Huge_Power_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Huge_Power_(ability) | Source} */ HUGE_POWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Poison_Point_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Poison_Point_(ability) | Source} */ POISON_POINT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Inner_Focus_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Inner_Focus_(ability) | Source} */ INNER_FOCUS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magma_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magma_Armor_(ability) | Source} */ MAGMA_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Water_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Water_Veil_(ability) | Source} */ WATER_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magnet_Pull_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magnet_Pull_(ability) | Source} */ MAGNET_PULL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Soundproof_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Soundproof_(ability) | Source} */ SOUNDPROOF, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rain_Dish_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rain_Dish_(ability) | Source} */ RAIN_DISH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Stream_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Stream_(ability) | Source} */ SAND_STREAM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pressure_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pressure_(ability) | Source} */ PRESSURE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Thick_Fat_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Thick_Fat_(ability) | Source} */ THICK_FAT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Early_Bird_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Early_Bird_(ability) | Source} */ EARLY_BIRD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flame_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flame_Body_(ability) | Source} */ FLAME_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Run_Away_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Run_Away_(ability) | Source} */ RUN_AWAY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Keen_Eye_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Keen_Eye_(ability) | Source} */ KEEN_EYE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hyper_Cutter_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hyper_Cutter_(ability) | Source} */ HYPER_CUTTER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pickup_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pickup_(ability) | Source} */ PICKUP, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Truant_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Truant_(ability) | Source} */ TRUANT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hustle_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hustle_(ability) | Source} */ HUSTLE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cute_Charm_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cute_Charm_(ability) | Source} */ CUTE_CHARM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Plus_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Plus_(ability) | Source} */ PLUS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Minus_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Minus_(ability) | Source} */ MINUS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Forecast_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Forecast_(ability) | Source} */ FORECAST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sticky_Hold_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sticky_Hold_(ability) | Source} */ STICKY_HOLD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shed_Skin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shed_Skin_(ability) | Source} */ SHED_SKIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Guts_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Guts_(ability) | Source} */ GUTS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Marvel_Scale_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Marvel_Scale_(ability) | Source} */ MARVEL_SCALE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Liquid_Ooze_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Liquid_Ooze_(ability) | Source} */ LIQUID_OOZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Overgrow_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Overgrow_(ability) | Source} */ OVERGROW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Blaze_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Blaze_(ability) | Source} */ BLAZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Torrent_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Torrent_(ability) | Source} */ TORRENT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Swarm_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Swarm_(ability) | Source} */ SWARM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rock_Head_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rock_Head_(ability) | Source} */ ROCK_HEAD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Drought_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Drought_(ability) | Source} */ DROUGHT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Arena_Trap_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Arena_Trap_(ability) | Source} */ ARENA_TRAP, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Vital_Spirit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Vital_Spirit_(ability) | Source} */ VITAL_SPIRIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/White_Smoke_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/White_Smoke_(ability) | Source} */ WHITE_SMOKE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pure_Power_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pure_Power_(ability) | Source} */ PURE_POWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shell_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shell_Armor_(ability) | Source} */ SHELL_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Air_Lock_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Air_Lock_(ability) | Source} */ AIR_LOCK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tangled_Feet_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tangled_Feet_(ability) | Source} */ TANGLED_FEET, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Motor_Drive_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Motor_Drive_(ability) | Source} */ MOTOR_DRIVE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rivalry_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rivalry_(ability) | Source} */ RIVALRY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Steadfast_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Steadfast_(ability) | Source} */ STEADFAST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Snow_Cloak_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Snow_Cloak_(ability) | Source} */ SNOW_CLOAK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gluttony_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gluttony_(ability) | Source} */ GLUTTONY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Anger_Point_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Anger_Point_(ability) | Source} */ ANGER_POINT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Unburden_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Unburden_(ability) | Source} */ UNBURDEN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Heatproof_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Heatproof_(ability) | Source} */ HEATPROOF, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Simple_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Simple_(ability) | Source} */ SIMPLE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dry_Skin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dry_Skin_(ability) | Source} */ DRY_SKIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Download_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Download_(ability) | Source} */ DOWNLOAD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Iron_Fist_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Iron_Fist_(ability) | Source} */ IRON_FIST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Poison_Heal_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Poison_Heal_(ability) | Source} */ POISON_HEAL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Adaptability_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Adaptability_(ability) | Source} */ ADAPTABILITY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Skill_Link_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Skill_Link_(ability) | Source} */ SKILL_LINK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hydration_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hydration_(ability) | Source} */ HYDRATION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Solar_Power_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Solar_Power_(ability) | Source} */ SOLAR_POWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Quick_Feet_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Feet_(ability) | Source} */ QUICK_FEET, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Normalize_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Normalize_(ability) | Source} */ NORMALIZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sniper_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sniper_(ability) | Source} */ SNIPER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magic_Guard_(ability) | Source} */ MAGIC_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/No_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/No_Guard_(ability) | Source} */ NO_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stall_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stall_(ability) | Source} */ STALL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Technician_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Technician_(ability) | Source} */ TECHNICIAN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Leaf_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Leaf_Guard_(ability) | Source} */ LEAF_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Klutz_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Klutz_(ability) | Source} */ KLUTZ, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mold_Breaker_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mold_Breaker_(ability) | Source} */ MOLD_BREAKER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Super_Luck_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Super_Luck_(ability) | Source} */ SUPER_LUCK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Aftermath_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Aftermath_(ability) | Source} */ AFTERMATH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Anticipation_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Anticipation_(ability) | Source} */ ANTICIPATION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Forewarn_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Forewarn_(ability) | Source} */ FOREWARN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Unaware_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Unaware_(ability) | Source} */ UNAWARE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tinted_Lens_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tinted_Lens_(ability) | Source} */ TINTED_LENS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Filter_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Filter_(ability) | Source} */ FILTER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Slow_Start_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Slow_Start_(ability) | Source} */ SLOW_START, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Scrappy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Scrappy_(ability) | Source} */ SCRAPPY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Storm_Drain_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Storm_Drain_(ability) | Source} */ STORM_DRAIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ice_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ice_Body_(ability) | Source} */ ICE_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Solid_Rock_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Solid_Rock_(ability) | Source} */ SOLID_ROCK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Snow_Warning_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Snow_Warning_(ability) | Source} */ SNOW_WARNING, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Honey_Gather_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Honey_Gather_(ability) | Source} */ HONEY_GATHER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Frisk_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Frisk_(ability) | Source} */ FRISK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Reckless_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Reckless_(ability) | Source} */ RECKLESS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Multitype_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Multitype_(ability) | Source} */ MULTITYPE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flower_Gift_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flower_Gift_(ability) | Source} */ FLOWER_GIFT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Bad_Dreams_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Bad_Dreams_(ability) | Source} */ BAD_DREAMS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pickpocket_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pickpocket_(ability) | Source} */ PICKPOCKET, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sheer_Force_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sheer_Force_(ability) | Source} */ SHEER_FORCE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Contrary_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Contrary_(ability) | Source} */ CONTRARY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Unnerve_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Unnerve_(ability) | Source} */ UNNERVE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Defiant_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Defiant_(ability) | Source} */ DEFIANT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Defeatist_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Defeatist_(ability) | Source} */ DEFEATIST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cursed_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cursed_Body_(ability) | Source} */ CURSED_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Healer_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Healer_(ability) | Source} */ HEALER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Friend_Guard_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Friend_Guard_(ability) | Source} */ FRIEND_GUARD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Weak_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Weak_Armor_(ability) | Source} */ WEAK_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Heavy_Metal_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Heavy_Metal_(ability) | Source} */ HEAVY_METAL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Light_Metal_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Light_Metal_(ability) | Source} */ LIGHT_METAL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Multiscale_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Multiscale_(ability) | Source} */ MULTISCALE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Boost_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Boost_(ability) | Source} */ TOXIC_BOOST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flare_Boost_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flare_Boost_(ability) | Source} */ FLARE_BOOST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Harvest_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Harvest_(ability) | Source} */ HARVEST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Telepathy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Telepathy_(ability) | Source} */ TELEPATHY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Moody_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Moody_(ability) | Source} */ MOODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Overcoat_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Overcoat_(ability) | Source} */ OVERCOAT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Poison_Touch_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Poison_Touch_(ability) | Source} */ POISON_TOUCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Regenerator_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Regenerator_(ability) | Source} */ REGENERATOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Big_Pecks_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Big_Pecks_(ability) | Source} */ BIG_PECKS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Rush_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Rush_(ability) | Source} */ SAND_RUSH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Skin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wonder_Skin_(ability) | Source} */ WONDER_SKIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Analytic_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Analytic_(ability) | Source} */ ANALYTIC, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Illusion_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Illusion_(ability) | Source} */ ILLUSION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Imposter_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Imposter_(ability) | Source} */ IMPOSTER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Infiltrator_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Infiltrator_(ability) | Source} */ INFILTRATOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mummy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mummy_(ability) | Source} */ MUMMY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Moxie_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Moxie_(ability) | Source} */ MOXIE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Justified_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Justified_(ability) | Source} */ JUSTIFIED, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rattled_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rattled_(ability) | Source} */ RATTLED, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magic_Bounce_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magic_Bounce_(ability) | Source} */ MAGIC_BOUNCE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sap_Sipper_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sap_Sipper_(ability) | Source} */ SAP_SIPPER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Prankster_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Prankster_(ability) | Source} */ PRANKSTER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Force_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Force_(ability) | Source} */ SAND_FORCE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Iron_Barbs_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Iron_Barbs_(ability) | Source} */ IRON_BARBS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Zen_Mode_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Zen_Mode_(ability) | Source} */ ZEN_MODE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Victory_Star_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Victory_Star_(ability) | Source} */ VICTORY_STAR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Turboblaze_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Turboblaze_(ability) | Source} */ TURBOBLAZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Teravolt_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Teravolt_(ability) | Source} */ TERAVOLT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Aroma_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Aroma_Veil_(ability) | Source} */ AROMA_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Flower_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Flower_Veil_(ability) | Source} */ FLOWER_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cheek_Pouch_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cheek_Pouch_(ability) | Source} */ CHEEK_POUCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Protean_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Protean_(ability) | Source} */ PROTEAN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Fur_Coat_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Fur_Coat_(ability) | Source} */ FUR_COAT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Magician_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Magician_(ability) | Source} */ MAGICIAN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Bulletproof_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Bulletproof_(ability) | Source} */ BULLETPROOF, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Competitive_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Competitive_(ability) | Source} */ COMPETITIVE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Strong_Jaw_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Strong_Jaw_(ability) | Source} */ STRONG_JAW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Refrigerate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Refrigerate_(ability) | Source} */ REFRIGERATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sweet_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sweet_Veil_(ability) | Source} */ SWEET_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stance_Change_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stance_Change_(ability) | Source} */ STANCE_CHANGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gale_Wings_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gale_Wings_(ability) | Source} */ GALE_WINGS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mega_Launcher_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mega_Launcher_(ability) | Source} */ MEGA_LAUNCHER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Grass_Pelt_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Grass_Pelt_(ability) | Source} */ GRASS_PELT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Symbiosis_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Symbiosis_(ability) | Source} */ SYMBIOSIS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tough_Claws_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tough_Claws_(ability) | Source} */ TOUGH_CLAWS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pixilate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pixilate_(ability) | Source} */ PIXILATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gooey_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gooey_(ability) | Source} */ GOOEY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Aerilate_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Aerilate_(ability) | Source} */ AERILATE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Parental_Bond_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Parental_Bond_(ability) | Source} */ PARENTAL_BOND, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dark_Aura_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dark_Aura_(ability) | Source} */ DARK_AURA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Fairy_Aura_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Fairy_Aura_(ability) | Source} */ FAIRY_AURA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Aura_Break_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Aura_Break_(ability) | Source} */ AURA_BREAK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Primordial_Sea_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Primordial_Sea_(ability) | Source} */ PRIMORDIAL_SEA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Desolate_Land_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Desolate_Land_(ability) | Source} */ DESOLATE_LAND, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Delta_Stream_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Delta_Stream_(ability) | Source} */ DELTA_STREAM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stamina_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stamina_(ability) | Source} */ STAMINA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wimp_Out_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wimp_Out_(ability) | Source} */ WIMP_OUT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Emergency_Exit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Emergency_Exit_(ability) | Source} */ EMERGENCY_EXIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Water_Compaction_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Water_Compaction_(ability) | Source} */ WATER_COMPACTION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Merciless_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Merciless_(ability) | Source} */ MERCILESS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shields_Down_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shields_Down_(ability) | Source} */ SHIELDS_DOWN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stakeout_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stakeout_(ability) | Source} */ STAKEOUT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Water_Bubble_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Water_Bubble_(ability) | Source} */ WATER_BUBBLE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Steelworker_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Steelworker_(ability) | Source} */ STEELWORKER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Berserk_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Berserk_(ability) | Source} */ BERSERK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Slush_Rush_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Slush_Rush_(ability) | Source} */ SLUSH_RUSH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Long_Reach_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Long_Reach_(ability) | Source} */ LONG_REACH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Liquid_Voice_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Liquid_Voice_(ability) | Source} */ LIQUID_VOICE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Triage_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Triage_(ability) | Source} */ TRIAGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Galvanize_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Galvanize_(ability) | Source} */ GALVANIZE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Surge_Surfer_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Surge_Surfer_(ability) | Source} */ SURGE_SURFER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Schooling_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Schooling_(ability) | Source} */ SCHOOLING, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Disguise_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Disguise_(ability) | Source} */ DISGUISE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Battle_Bond_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Battle_Bond_(ability) | Source} */ BATTLE_BOND, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Power_Construct_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Power_Construct_(ability) | Source} */ POWER_CONSTRUCT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Corrosion_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Corrosion_(ability) | Source} */ CORROSION, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Comatose_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Comatose_(ability) | Source} */ COMATOSE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Queenly_Majesty_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Queenly_Majesty_(ability) | Source} */ QUEENLY_MAJESTY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Innards_Out_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Innards_Out_(ability) | Source} */ INNARDS_OUT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dancer_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dancer_(ability) | Source} */ DANCER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Battery_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Battery_(ability) | Source} */ BATTERY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Fluffy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Fluffy_(ability) | Source} */ FLUFFY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dazzling_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dazzling_(ability) | Source} */ DAZZLING, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Soul_Heart_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Soul_Heart_(ability) | Source} */ SOUL_HEART, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tangling_Hair_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tangling_Hair_(ability) | Source} */ TANGLING_HAIR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Receiver_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Receiver_(ability) | Source} */ RECEIVER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Power_Of_Alchemy_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Power_Of_Alchemy_(ability) | Source} */ POWER_OF_ALCHEMY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Beast_Boost_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Beast_Boost_(ability) | Source} */ BEAST_BOOST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rks_System_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rks_System_(ability) | Source} */ RKS_SYSTEM, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Electric_Surge_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Electric_Surge_(ability) | Source} */ ELECTRIC_SURGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Psychic_Surge_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Psychic_Surge_(ability) | Source} */ PSYCHIC_SURGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Misty_Surge_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Misty_Surge_(ability) | Source} */ MISTY_SURGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Grassy_Surge_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Grassy_Surge_(ability) | Source} */ GRASSY_SURGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Full_Metal_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Full_Metal_Body_(ability) | Source} */ FULL_METAL_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Shadow_Shield_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Shadow_Shield_(ability) | Source} */ SHADOW_SHIELD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Prism_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Prism_Armor_(ability) | Source} */ PRISM_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Neuroforce_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Neuroforce_(ability) | Source} */ NEUROFORCE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Intrepid_Sword_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Intrepid_Sword_(ability) | Source} */ INTREPID_SWORD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dauntless_Shield_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dauntless_Shield_(ability) | Source} */ DAUNTLESS_SHIELD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Libero_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Libero_(ability) | Source} */ LIBERO, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ball_Fetch_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ball_Fetch_(ability) | Source} */ BALL_FETCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cotton_Down_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cotton_Down_(ability) | Source} */ COTTON_DOWN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Propeller_Tail_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Propeller_Tail_(ability) | Source} */ PROPELLER_TAIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mirror_Armor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mirror_Armor_(ability) | Source} */ MIRROR_ARMOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gulp_Missile_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gulp_Missile_(ability) | Source} */ GULP_MISSILE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Stalwart_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Stalwart_(ability) | Source} */ STALWART, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Steam_Engine_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Steam_Engine_(ability) | Source} */ STEAM_ENGINE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Punk_Rock_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Punk_Rock_(ability) | Source} */ PUNK_ROCK, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sand_Spit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sand_Spit_(ability) | Source} */ SAND_SPIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ice_Scales_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ice_Scales_(ability) | Source} */ ICE_SCALES, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ripen_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ripen_(ability) | Source} */ RIPEN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Ice_Face_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Ice_Face_(ability) | Source} */ ICE_FACE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Power_Spot_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Power_Spot_(ability) | Source} */ POWER_SPOT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mimicry_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mimicry_(ability) | Source} */ MIMICRY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Screen_Cleaner_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Screen_Cleaner_(ability) | Source} */ SCREEN_CLEANER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Steely_Spirit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Steely_Spirit_(ability) | Source} */ STEELY_SPIRIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Perish_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Perish_Body_(ability) | Source} */ PERISH_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wandering_Spirit_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wandering_Spirit_(ability) | Source} */ WANDERING_SPIRIT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Gorilla_Tactics_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Gorilla_Tactics_(ability) | Source} */ GORILLA_TACTICS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Neutralizing_Gas_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Neutralizing_Gas_(ability) | Source} */ NEUTRALIZING_GAS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Pastel_Veil_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Pastel_Veil_(ability) | Source} */ PASTEL_VEIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hunger_Switch_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hunger_Switch_(ability) | Source} */ HUNGER_SWITCH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Quick_Draw_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Quick_Draw_(ability) | Source} */ QUICK_DRAW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Unseen_Fist_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Unseen_Fist_(ability) | Source} */ UNSEEN_FIST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Curious_Medicine_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Curious_Medicine_(ability) | Source} */ CURIOUS_MEDICINE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Transistor_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Transistor_(ability) | Source} */ TRANSISTOR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Dragons_Maw_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Dragons_Maw_(ability) | Source} */ DRAGONS_MAW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Chilling_Neigh_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Chilling_Neigh_(ability) | Source} */ CHILLING_NEIGH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Grim_Neigh_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Grim_Neigh_(ability) | Source} */ GRIM_NEIGH, - /**{@link https://bulbapedia.bulbagarden.net/wiki/As_One_Glastrier_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/As_One_Glastrier_(ability) | Source} */ AS_ONE_GLASTRIER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/As_One_Spectrier_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/As_One_Spectrier_(ability) | Source} */ AS_ONE_SPECTRIER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Lingering_Aroma_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Lingering_Aroma_(ability) | Source} */ LINGERING_AROMA, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Seed_Sower_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Seed_Sower_(ability) | Source} */ SEED_SOWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Thermal_Exchange_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Thermal_Exchange_(ability) | Source} */ THERMAL_EXCHANGE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Anger_Shell_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Anger_Shell_(ability) | Source} */ ANGER_SHELL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Purifying_Salt_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Purifying_Salt_(ability) | Source} */ PURIFYING_SALT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Well_Baked_Body_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Well_Baked_Body_(ability) | Source} */ WELL_BAKED_BODY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wind_Rider_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wind_Rider_(ability) | Source} */ WIND_RIDER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Guard_Dog_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Guard_Dog_(ability) | Source} */ GUARD_DOG, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Rocky_Payload_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Rocky_Payload_(ability) | Source} */ ROCKY_PAYLOAD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Wind_Power_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Wind_Power_(ability) | Source} */ WIND_POWER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Zero_To_Hero_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Zero_To_Hero_(ability) | Source} */ ZERO_TO_HERO, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Commander_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Commander_(ability) | Source} */ COMMANDER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Electromorphosis_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Electromorphosis_(ability) | Source} */ ELECTROMORPHOSIS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Protosynthesis_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Protosynthesis_(ability) | Source} */ PROTOSYNTHESIS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Quark_Drive_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Quark_Drive_(ability) | Source} */ QUARK_DRIVE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Good_As_Gold_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Good_As_Gold_(ability) | Source} */ GOOD_AS_GOLD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Vessel_Of_Ruin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Vessel_Of_Ruin_(ability) | Source} */ VESSEL_OF_RUIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sword_Of_Ruin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sword_Of_Ruin_(ability) | Source} */ SWORD_OF_RUIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tablets_Of_Ruin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tablets_Of_Ruin_(ability) | Source} */ TABLETS_OF_RUIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Beads_Of_Ruin_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Beads_Of_Ruin_(ability) | Source} */ BEADS_OF_RUIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Orichalcum_Pulse_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Orichalcum_Pulse_(ability) | Source} */ ORICHALCUM_PULSE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hadron_Engine_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hadron_Engine_(ability) | Source} */ HADRON_ENGINE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Opportunist_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Opportunist_(ability) | Source} */ OPPORTUNIST, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Cud_Chew_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Cud_Chew_(ability) | Source} */ CUD_CHEW, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Sharpness_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Sharpness_(ability) | Source} */ SHARPNESS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Supreme_Overlord_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Supreme_Overlord_(ability) | Source} */ SUPREME_OVERLORD, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Costar_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Costar_(ability) | Source} */ COSTAR, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Debris_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Debris_(ability) | Source} */ TOXIC_DEBRIS, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Armor_Tail_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Armor_Tail_(ability) | Source} */ ARMOR_TAIL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Earth_Eater_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Earth_Eater_(ability) | Source} */ EARTH_EATER, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Mycelium_Might_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Mycelium_Might_(ability) | Source} */ MYCELIUM_MIGHT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Minds_Eye_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Minds_Eye_(ability) | Source} */ MINDS_EYE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Supersweet_Syrup_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Supersweet_Syrup_(ability) | Source} */ SUPERSWEET_SYRUP, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Hospitality_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Hospitality_(ability) | Source} */ HOSPITALITY, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Chain_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Toxic_Chain_(ability) | Source} */ TOXIC_CHAIN, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Teal_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Teal_(ability) | Source} */ EMBODY_ASPECT_TEAL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Wellspring_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Wellspring_(ability) | Source} */ EMBODY_ASPECT_WELLSPRING, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Hearthflame_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Hearthflame_(ability) | Source} */ EMBODY_ASPECT_HEARTHFLAME, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Cornerstone_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Embody_Aspect_Cornerstone_(ability) | Source} */ EMBODY_ASPECT_CORNERSTONE, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shift_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shift_(ability) | Source} */ TERA_SHIFT, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shell_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shell_(ability) | Source} */ TERA_SHELL, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Teraform_Zero_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Teraform_Zero_(ability) | Source} */ TERAFORM_ZERO, - /**{@link https://bulbapedia.bulbagarden.net/wiki/Poison_Puppeteer_(ability) | Source} */ + /** {@link https://bulbapedia.bulbagarden.net/wiki/Poison_Puppeteer_(ability) | Source} */ POISON_PUPPETEER, } From f0a56a30490d2d91f9a90b20acd8693ca21649ec Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Fri, 8 Aug 2025 21:15:33 -0500 Subject: [PATCH 098/106] [Sprite] Add unique trainer sprite for Rocket Boss Giovanni (#6235) --- .../trainer/rocket_boss_giovanni_1.json | 41 ++++++++++++++++++ .../images/trainer/rocket_boss_giovanni_1.png | Bin 0 -> 698 bytes src/data/trainers/trainer-config.ts | 5 +-- 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 public/images/trainer/rocket_boss_giovanni_1.json create mode 100644 public/images/trainer/rocket_boss_giovanni_1.png diff --git a/public/images/trainer/rocket_boss_giovanni_1.json b/public/images/trainer/rocket_boss_giovanni_1.json new file mode 100644 index 00000000000..a53be1a20e8 --- /dev/null +++ b/public/images/trainer/rocket_boss_giovanni_1.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "rocket_boss_giovanni_1.png", + "format": "RGBA8888", + "size": { + "w": 79, + "h": 79 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 39, + "h": 79 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 39, + "h": 79 + }, + "frame": { + "x": 0, + "y": 0, + "w": 39, + "h": 79 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d6c5e1804414106d43a7c46f83468d39:1f3f7898a58950988acac6ee7167e012:5f742cbdaafcd5ae864f18ec2af7512a$" + } +} diff --git a/public/images/trainer/rocket_boss_giovanni_1.png b/public/images/trainer/rocket_boss_giovanni_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8adab2d057575f8d7a6620fc5808f5bc646e53ed GIT binary patch literal 698 zcmV;r0!96aP)iD;n6Kc;2OZ_|Ulj|Nr)u zbou}Q00DGTPE!Ct=GbNc000SaNLh0L01FcU01FcV0GgZ_0006VNkl9H$7>SEkL|e`TY}ryG z3y(`7(1UW$^dL0|VkyawoHCI?fGID-#>47Km})N|hLj|@7&*SE1w)EY#FQdFn1q4% z9#hN=a+EPdeZrisR4Rk7+){D4hVjQ$&cOy zYg==fKv;(K#6^5mboLOMKn5dMpI0IWSV_zyffc&Zh6 z{JH|^0z7@K=@LHA-t`+BPZ1!1YY)9%x%J`jFBIBob)b8_fa>?)!Ez>%07*qoM6N<$f)eOAlK=n! literal 0 HcmV?d00001 diff --git a/src/data/trainers/trainer-config.ts b/src/data/trainers/trainer-config.ts index 0f047157174..d29b40e0972 100644 --- a/src/data/trainers/trainer-config.ts +++ b/src/data/trainers/trainer-config.ts @@ -223,9 +223,8 @@ export class TrainerConfig { case TrainerType.LARRY_ELITE: trainerType = TrainerType.LARRY; break; - case TrainerType.ROCKET_BOSS_GIOVANNI_1: case TrainerType.ROCKET_BOSS_GIOVANNI_2: - trainerType = TrainerType.GIOVANNI; + trainerType = TrainerType.ROCKET_BOSS_GIOVANNI_1; break; case TrainerType.MAXIE_2: trainerType = TrainerType.MAXIE; @@ -895,7 +894,7 @@ export class TrainerConfig { /** * Helper function to check if a specialty type is set - * @returns true if specialtyType is defined and not Type.UNKNOWN + * @returns `true` if `specialtyType` is defined and not {@link PokemonType.UNKNOWN} */ hasSpecialtyType(): boolean { return !isNullOrUndefined(this.specialtyType) && this.specialtyType !== PokemonType.UNKNOWN; From 79576ad117a9674a5ab47be2306a1e67ce267e5a Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Fri, 8 Aug 2025 20:18:40 -0700 Subject: [PATCH 099/106] [GitHub] Update `.github/CODEOWNERS` file (#6240) * [GitHub] Update `.github/CODEOWNERS` file `@pagefaultgames/senior-dev-team` added to `package.json` and `pnpm-lock.yaml` `@pagefaultgames/balance-team` added to `/src/data/trainers` * Move senior dev team entries to the bottom of the file --- .github/CODEOWNERS | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 979b94f84d6..a97457a818b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -3,9 +3,6 @@ # everything (whole code-base) - Junior Devs * @pagefaultgames/junior-dev-team -# github actions/templates etc. - Dev Leads -/.github @pagefaultgames/senior-dev-team - # Art Team /public/**/*.png @pagefaultgames/art-team /public/**/*.json @pagefaultgames/art-team @@ -19,4 +16,11 @@ /public/audio @pagefaultgames/composer-team # Balance Files; contain actual code logic and must also be owned by dev team -/src/data/balance @pagefaultgames/balance-team @pagefaultgames/junior-dev-team \ No newline at end of file +/src/data/balance @pagefaultgames/balance-team @pagefaultgames/junior-dev-team +/src/data/trainers @pagefaultgames/balance-team @pagefaultgames/junior-dev-team + +# GitHub actions/templates etc. - Senior Devs +# Should be defined last in the file to make sure these always override all other definitions +/.github @pagefaultgames/senior-dev-team +package.json @pagefaultgames/senior-dev-team +pnpm-lock.yaml @pagefaultgames/senior-dev-team \ No newline at end of file From e862334819bcc37fc4e0ba9cd18ae858785e84b0 Mon Sep 17 00:00:00 2001 From: Lugiad Date: Sat, 9 Aug 2025 17:11:03 +0200 Subject: [PATCH 100/106] [UI/UX] Summary Move Effect UI adjustments (#6223) Summary Effect tab UI image adjustments --- .../images/ui/legacy/summary_moves_effect.png | Bin 290 -> 289 bytes public/images/ui/summary_moves_effect.png | Bin 283 -> 292 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/ui/legacy/summary_moves_effect.png b/public/images/ui/legacy/summary_moves_effect.png index 34d59970c9962d869ecb71dad386bdd26801bf36..61567c9749bbc77e85df7f319413f716f2d2dc2d 100644 GIT binary patch delta 253 zcmVpHQAS4d(X1R*kvVw5~ zR$ztKTM;*~z4CVPq`*-4fJ^M|=ZDaI3FToOnD$bLu=PoS&r-9e zxcwjq@NHdV(iM0Q2~lWeHA4_W>n!Pta}UE0sh2Ck3;_o*c`0uNR=5>z1(FTy z35aJ&Mqq_B8Nj>5p&&Y)!hxl9{(KP4lPHZl@n{??$jcALv3K`#Sk@Q;u=WB;&RDW8 zVg5mo=-aZ6$)+UxkN~7wQ9T4H)%KE2vF~B{A?0!d>LDbNvs|u}A~nc#Zzb;{ z?&5gL!{pooMvNFSV#J6MBmW;r6l0HKxKfSQ!%=(_-WHQ014b`gu>b%707*qoM6N<$ Ef*RLyvH$=8 diff --git a/public/images/ui/summary_moves_effect.png b/public/images/ui/summary_moves_effect.png index 5b1cef9c02e9ddfd669ec7646446d839189597a7..7993cd0ad577267d47a9c39807d9c51f440c3f2c 100644 GIT binary patch delta 241 zcmVOjJbx00960|B);ke?V309RL6T0(4SNQvd*Vlg&5)006K_ zL_t(|Uc8Sn4un7mMJ;W;ftkvBy%QSCE#wNsgHUivXUOiKFc!wf#}A?Td7&E~^HL?# zOTkQ$!`8gz&)BuFqeL}6{NpHp7GF>a@j9dr-kC~`oP-+>~GO8t%5QrE} r{G(b%wT$K$inWYt8P!4<&_@dZtzs+bCtm}E00000NkvXXu0mjfzs_QK delta 232 zcmVClr9hXYWhfE%jj>^+q-7{k!@d$$N-~s)rHr8@Ly5ZE_#%#ngH@JR zDl$Q*?>JuA1XEHfw|0R3a#*?6%4dqkc!7Bb1{joDMzxG;als4R%SRLcsFqPJqxpp_ iEu&gSwU7$vqXht@)Qs+oPRCFH0000 Date: Sat, 9 Aug 2025 22:27:47 +0200 Subject: [PATCH 101/106] [UI/UX][Bug] Removed extra division by 6 in starter-select-ui-handler.ts (#6245) Removed division by 6 in starter-select-ui-handler.ts --- src/ui/starter-select-ui-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 15a08e9d0f4..fbcc6ae7e32 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1053,7 +1053,7 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.moveInfoOverlay = new MoveInfoOverlay({ top: true, x: 1, - y: globalScene.scaledCanvas.height / 6 - MoveInfoOverlay.getHeight() - 29, + y: globalScene.scaledCanvas.height - MoveInfoOverlay.getHeight() - 29, }); this.starterSelectContainer.add([ From 028deedd5993436a33ce42b26914a5bb91a4ba3d Mon Sep 17 00:00:00 2001 From: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com> Date: Sun, 10 Aug 2025 09:44:56 -0500 Subject: [PATCH 102/106] [Sprite] Add new Starter Select Ribbon icons (#6247) Add new ribbon icons Co-authored-by: damocleas --- public/images/ui/champion_ribbon.png | Bin 237 -> 225 bytes public/images/ui/champion_ribbon_bronze.png | Bin 0 -> 200 bytes public/images/ui/champion_ribbon_diamond.png | Bin 0 -> 225 bytes public/images/ui/champion_ribbon_silver.png | Bin 0 -> 222 bytes public/images/ui/legacy/champion_ribbon.png | Bin 237 -> 225 bytes .../images/ui/legacy/champion_ribbon_bronze.png | Bin 0 -> 200 bytes .../ui/legacy/champion_ribbon_diamond.png | Bin 0 -> 225 bytes .../images/ui/legacy/champion_ribbon_silver.png | Bin 0 -> 222 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/ui/champion_ribbon_bronze.png create mode 100644 public/images/ui/champion_ribbon_diamond.png create mode 100644 public/images/ui/champion_ribbon_silver.png create mode 100644 public/images/ui/legacy/champion_ribbon_bronze.png create mode 100644 public/images/ui/legacy/champion_ribbon_diamond.png create mode 100644 public/images/ui/legacy/champion_ribbon_silver.png diff --git a/public/images/ui/champion_ribbon.png b/public/images/ui/champion_ribbon.png index 533c20f68214c6a57a88488b48fedffcaa15f3fe..d70aa92daaf671ed291cc14eb3d314902239968d 100644 GIT binary patch delta 210 zcmaFM_>ggecs(Zv8v_HwzX-F%K#H+A$lZxy-8q?;Ku)8li(`mJaB@mRQ?|Fwzvda= z^JS7gB!_EfBhDZAaDPo(w`1U8 zKE1+^7tPy*yCozJOi~D(z%)UDqe10C*&&fR?K}G#8xw`SnVFSi)IFF~9>FVdQ&MBb@ E08>jxI{*Lx delta 222 zcmaFJ_?B^kcs&OPGXnzy(=AaGAQc+ zdtQ2LmB5cPvj5)e|G%yPRJpZU;PDc%r^`eiEfW2AL3(;P_m&F&|CeMMSs1oQbKjjU zyd|8giG|_+ZKXLX?GZqW*h+%@f*H7Z#KNVd*jz%RfkKv^E{-7;akfW8`5FR5j$BCk z%u{~_E)M!3HGx`C7_=6k~CayA#8@b22Z1oD5GF#}J9| z3~ct5v#(>&`B`~dWP{!WmQ8ub zs@U58A1gHC(Na?^=wv@%XYl6c=Qc(iP9auJ2F@l152ieIA4g?o=Ed?MAJrCAGYB>s oFBJCAF9zDlmm1-j=IhI#1!QvoF$i1=o(!TqUHx3vIVCg!02aVG2><{9 literal 0 HcmV?d00001 diff --git a/public/images/ui/champion_ribbon_diamond.png b/public/images/ui/champion_ribbon_diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..9effbe3669c1a451a7f4122ce92fd5ec74eb7011 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)P!3HG%MVKuHQjEnx?oJHr&dIz4avD8d978mM zlT#X+R@wUhZ=Ml-?rz$SkY@)tlA1Xuw9M`^I6PV3hv&N7o;Ga;Z@rzLxz}*3G_IMw zabDxY|G(BT^VqqqD(Fn-pJx!^+nvbZ-Q?oP<HeVi|o`Sgw zoD&-4uc&PBONo`3q#&wrRe^KHN&`EFr=oUtzKi*80Ug7a8sVAd>&u`8WOD#92wV!D P45B<;{an^LB{Ts5blOJd literal 0 HcmV?d00001 diff --git a/public/images/ui/champion_ribbon_silver.png b/public/images/ui/champion_ribbon_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..c4dcd8d7be0ee9aae7343f6b12d0ac42dbb8dacc GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PI@#^NA%Cx&(BWL^R}b)GJcArj%q zDGg2QQnUXx&se@LCOP7A*l~`eX3hyMGbi#LUTmH(5oc4y7|t*)rsN4ngt!M&qggecs(Zv8v_HwzX-F%K#H+A$lZxy-8q?;Ku)8li(`mJaB@mRQ?|Fwzvda= z^JS7gB!_EfBhDZAaDPo(w`1U8 zKE1+^7tPy*yCozJOi~D(z%)UDqe10C*&&fR?K}G#8xw`SnVFSi)IFF~9>FVdQ&MBb@ E08>jxI{*Lx delta 222 zcmaFJ_?B^kcs&OPGXnzy(=AaGAQc+ zdtQ2LmB5cPvj5)e|G%yPRJpZU;PDc%r^`eiEfW2AL3(;P_m&F&|CeMMSs1oQbKjjU zyd|8giG|_+ZKXLX?GZqW*h+%@f*H7Z#KNVd*jz%RfkKv^E{-7;akfW8`5FR5j$BCk z%u{~_E)M!3HGx`C7_=6k~CayA#8@b22Z1oD5GF#}J9| z3~ct5v#(>&`B`~dWP{!WmQ8ub zs@U58A1gHC(Na?^=wv@%XYl6c=Qc(iP9auJ2F@l152ieIA4g?o=Ed?MAJrCAGYB>s oFBJCAF9zDlmm1-j=IhI#1!QvoF$i1=o(!TqUHx3vIVCg!02aVG2><{9 literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/champion_ribbon_diamond.png b/public/images/ui/legacy/champion_ribbon_diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..9effbe3669c1a451a7f4122ce92fd5ec74eb7011 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)P!3HG%MVKuHQjEnx?oJHr&dIz4avD8d978mM zlT#X+R@wUhZ=Ml-?rz$SkY@)tlA1Xuw9M`^I6PV3hv&N7o;Ga;Z@rzLxz}*3G_IMw zabDxY|G(BT^VqqqD(Fn-pJx!^+nvbZ-Q?oP<HeVi|o`Sgw zoD&-4uc&PBONo`3q#&wrRe^KHN&`EFr=oUtzKi*80Ug7a8sVAd>&u`8WOD#92wV!D P45B<;{an^LB{Ts5blOJd literal 0 HcmV?d00001 diff --git a/public/images/ui/legacy/champion_ribbon_silver.png b/public/images/ui/legacy/champion_ribbon_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..c4dcd8d7be0ee9aae7343f6b12d0ac42dbb8dacc GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PI@#^NA%Cx&(BWL^R}b)GJcArj%q zDGg2QQnUXx&se@LCOP7A*l~`eX3hyMGbi#LUTmH(5oc4y7|t*)rsN4ngt!M&q Date: Sun, 10 Aug 2025 17:41:42 -0400 Subject: [PATCH 103/106] [Sprite] Updated animated sprites, put in consistent for White-Stripe Basculin, Basculegion, Sandygast, Palossand, Silicobra, and Sandaconda (#6244) * Update and un-exp Sandygast and Palossand * Update and move Basculegion, Basc-White to consistent * Silicobra, Sandaconda --------- Co-authored-by: damocleas --- public/exp-sprites.json | 48 - public/images/pokemon/550-white-striped.json | 849 ++++++++- public/images/pokemon/550-white-striped.png | Bin 482 -> 4934 bytes public/images/pokemon/769.json | 462 ++++- public/images/pokemon/769.png | Bin 412 -> 2578 bytes public/images/pokemon/770.json | 633 ++++++- public/images/pokemon/770.png | Bin 608 -> 6234 bytes public/images/pokemon/843.json | 687 ++++++- public/images/pokemon/843.png | Bin 496 -> 8039 bytes public/images/pokemon/844.json | 1632 ++++++++++++++++- public/images/pokemon/844.png | Bin 937 -> 9452 bytes public/images/pokemon/902-female.json | 867 ++++++++- public/images/pokemon/902-female.png | Bin 980 -> 32467 bytes public/images/pokemon/902.json | 867 ++++++++- public/images/pokemon/902.png | Bin 1047 -> 34233 bytes .../pokemon/back/550-white-striped.json | 849 ++++++++- .../images/pokemon/back/550-white-striped.png | Bin 498 -> 5528 bytes public/images/pokemon/back/769.json | 462 ++++- public/images/pokemon/back/769.png | Bin 388 -> 2122 bytes public/images/pokemon/back/770.json | 633 ++++++- public/images/pokemon/back/770.png | Bin 562 -> 6487 bytes public/images/pokemon/back/843.json | 687 ++++++- public/images/pokemon/back/843.png | Bin 432 -> 7359 bytes public/images/pokemon/back/844.json | 1623 +++++++++++++++- public/images/pokemon/back/844.png | Bin 800 -> 9150 bytes public/images/pokemon/back/902-female.json | 867 ++++++++- public/images/pokemon/back/902-female.png | Bin 994 -> 31585 bytes public/images/pokemon/back/902.json | 867 ++++++++- public/images/pokemon/back/902.png | Bin 1010 -> 30972 bytes .../pokemon/back/shiny/550-white-striped.json | 849 ++++++++- .../pokemon/back/shiny/550-white-striped.png | Bin 498 -> 5544 bytes public/images/pokemon/back/shiny/769.json | 462 ++++- public/images/pokemon/back/shiny/769.png | Bin 387 -> 2133 bytes public/images/pokemon/back/shiny/770.json | 633 ++++++- public/images/pokemon/back/shiny/770.png | Bin 560 -> 6487 bytes public/images/pokemon/back/shiny/843.json | 687 ++++++- public/images/pokemon/back/shiny/843.png | Bin 432 -> 7359 bytes public/images/pokemon/back/shiny/844.json | 1623 +++++++++++++++- public/images/pokemon/back/shiny/844.png | Bin 799 -> 9150 bytes .../images/pokemon/back/shiny/902-female.json | 867 ++++++++- .../images/pokemon/back/shiny/902-female.png | Bin 988 -> 31589 bytes public/images/pokemon/back/shiny/902.json | 867 ++++++++- public/images/pokemon/back/shiny/902.png | Bin 1010 -> 30976 bytes public/images/pokemon/exp/769.json | 965 ---------- public/images/pokemon/exp/769.png | Bin 2356 -> 0 bytes public/images/pokemon/exp/770.json | 1364 -------------- public/images/pokemon/exp/770.png | Bin 6816 -> 0 bytes public/images/pokemon/exp/843.json | 272 --- public/images/pokemon/exp/843.png | Bin 2314 -> 0 bytes public/images/pokemon/exp/844.json | 314 ---- public/images/pokemon/exp/844.png | Bin 4739 -> 0 bytes public/images/pokemon/exp/902-female.json | 1343 -------------- public/images/pokemon/exp/902-female.png | Bin 7346 -> 0 bytes public/images/pokemon/exp/902.json | 1364 -------------- public/images/pokemon/exp/902.png | Bin 6886 -> 0 bytes public/images/pokemon/exp/back/769.json | 965 ---------- public/images/pokemon/exp/back/769.png | Bin 2093 -> 0 bytes public/images/pokemon/exp/back/770.json | 230 --- public/images/pokemon/exp/back/770.png | Bin 2538 -> 0 bytes public/images/pokemon/exp/back/843.json | 230 --- public/images/pokemon/exp/back/843.png | Bin 1626 -> 0 bytes public/images/pokemon/exp/back/844.json | 230 --- public/images/pokemon/exp/back/844.png | Bin 2682 -> 0 bytes .../images/pokemon/exp/back/902-female.json | 1133 ------------ public/images/pokemon/exp/back/902-female.png | Bin 8085 -> 0 bytes public/images/pokemon/exp/back/902.json | 1364 -------------- public/images/pokemon/exp/back/902.png | Bin 6423 -> 0 bytes public/images/pokemon/exp/back/shiny/769.json | 1217 ------------ public/images/pokemon/exp/back/shiny/769.png | Bin 2107 -> 0 bytes public/images/pokemon/exp/back/shiny/770.json | 1364 -------------- public/images/pokemon/exp/back/shiny/770.png | Bin 5669 -> 0 bytes public/images/pokemon/exp/back/shiny/843.json | 230 --- public/images/pokemon/exp/back/shiny/843.png | Bin 1626 -> 0 bytes public/images/pokemon/exp/back/shiny/844.json | 230 --- public/images/pokemon/exp/back/shiny/844.png | Bin 2682 -> 0 bytes .../pokemon/exp/back/shiny/902-female.json | 1133 ------------ .../pokemon/exp/back/shiny/902-female.png | Bin 8085 -> 0 bytes public/images/pokemon/exp/back/shiny/902.json | 1364 -------------- public/images/pokemon/exp/back/shiny/902.png | Bin 6423 -> 0 bytes public/images/pokemon/exp/shiny/769.json | 1217 ------------ public/images/pokemon/exp/shiny/769.png | Bin 2353 -> 0 bytes public/images/pokemon/exp/shiny/770.json | 1364 -------------- public/images/pokemon/exp/shiny/770.png | Bin 6815 -> 0 bytes public/images/pokemon/exp/shiny/843.json | 272 --- public/images/pokemon/exp/shiny/843.png | Bin 2314 -> 0 bytes public/images/pokemon/exp/shiny/844.json | 314 ---- public/images/pokemon/exp/shiny/844.png | Bin 4739 -> 0 bytes .../images/pokemon/exp/shiny/902-female.json | 1343 -------------- .../images/pokemon/exp/shiny/902-female.png | Bin 7346 -> 0 bytes public/images/pokemon/exp/shiny/902.json | 1364 -------------- public/images/pokemon/exp/shiny/902.png | Bin 6875 -> 0 bytes .../pokemon/shiny/550-white-striped.json | 849 ++++++++- .../pokemon/shiny/550-white-striped.png | Bin 482 -> 4938 bytes public/images/pokemon/shiny/769.json | 462 ++++- public/images/pokemon/shiny/769.png | Bin 415 -> 2578 bytes public/images/pokemon/shiny/770.json | 633 ++++++- public/images/pokemon/shiny/770.png | Bin 615 -> 6234 bytes public/images/pokemon/shiny/843.json | 687 ++++++- public/images/pokemon/shiny/843.png | Bin 496 -> 8039 bytes public/images/pokemon/shiny/844.json | 1632 ++++++++++++++++- public/images/pokemon/shiny/844.png | Bin 937 -> 9452 bytes public/images/pokemon/shiny/902-female.json | 867 ++++++++- public/images/pokemon/shiny/902-female.png | Bin 980 -> 32467 bytes public/images/pokemon/shiny/902.json | 867 ++++++++- public/images/pokemon/shiny/902.png | Bin 1041 -> 34233 bytes 105 files changed, 22850 insertions(+), 22354 deletions(-) delete mode 100644 public/images/pokemon/exp/769.json delete mode 100644 public/images/pokemon/exp/769.png delete mode 100644 public/images/pokemon/exp/770.json delete mode 100644 public/images/pokemon/exp/770.png delete mode 100644 public/images/pokemon/exp/843.json delete mode 100644 public/images/pokemon/exp/843.png delete mode 100644 public/images/pokemon/exp/844.json delete mode 100644 public/images/pokemon/exp/844.png delete mode 100644 public/images/pokemon/exp/902-female.json delete mode 100644 public/images/pokemon/exp/902-female.png delete mode 100644 public/images/pokemon/exp/902.json delete mode 100644 public/images/pokemon/exp/902.png delete mode 100644 public/images/pokemon/exp/back/769.json delete mode 100644 public/images/pokemon/exp/back/769.png delete mode 100644 public/images/pokemon/exp/back/770.json delete mode 100644 public/images/pokemon/exp/back/770.png delete mode 100644 public/images/pokemon/exp/back/843.json delete mode 100644 public/images/pokemon/exp/back/843.png delete mode 100644 public/images/pokemon/exp/back/844.json delete mode 100644 public/images/pokemon/exp/back/844.png delete mode 100644 public/images/pokemon/exp/back/902-female.json delete mode 100644 public/images/pokemon/exp/back/902-female.png delete mode 100644 public/images/pokemon/exp/back/902.json delete mode 100644 public/images/pokemon/exp/back/902.png delete mode 100644 public/images/pokemon/exp/back/shiny/769.json delete mode 100644 public/images/pokemon/exp/back/shiny/769.png delete mode 100644 public/images/pokemon/exp/back/shiny/770.json delete mode 100644 public/images/pokemon/exp/back/shiny/770.png delete mode 100644 public/images/pokemon/exp/back/shiny/843.json delete mode 100644 public/images/pokemon/exp/back/shiny/843.png delete mode 100644 public/images/pokemon/exp/back/shiny/844.json delete mode 100644 public/images/pokemon/exp/back/shiny/844.png delete mode 100644 public/images/pokemon/exp/back/shiny/902-female.json delete mode 100644 public/images/pokemon/exp/back/shiny/902-female.png delete mode 100644 public/images/pokemon/exp/back/shiny/902.json delete mode 100644 public/images/pokemon/exp/back/shiny/902.png delete mode 100644 public/images/pokemon/exp/shiny/769.json delete mode 100644 public/images/pokemon/exp/shiny/769.png delete mode 100644 public/images/pokemon/exp/shiny/770.json delete mode 100644 public/images/pokemon/exp/shiny/770.png delete mode 100644 public/images/pokemon/exp/shiny/843.json delete mode 100644 public/images/pokemon/exp/shiny/843.png delete mode 100644 public/images/pokemon/exp/shiny/844.json delete mode 100644 public/images/pokemon/exp/shiny/844.png delete mode 100644 public/images/pokemon/exp/shiny/902-female.json delete mode 100644 public/images/pokemon/exp/shiny/902-female.png delete mode 100644 public/images/pokemon/exp/shiny/902.json delete mode 100644 public/images/pokemon/exp/shiny/902.png diff --git a/public/exp-sprites.json b/public/exp-sprites.json index 1903a6c7804..21c89276127 100644 --- a/public/exp-sprites.json +++ b/public/exp-sprites.json @@ -525,10 +525,6 @@ "767", "768", "768", - "769", - "769", - "770", - "770", "771", "771", "772", @@ -751,10 +747,6 @@ "841", "842", "842", - "843", - "843", - "844", - "844", "845-gorging", "845-gorging", "845-gulping", @@ -893,10 +885,6 @@ "900", "901", "901", - "902-female", - "902-female", - "902", - "902", "903", "903", "904", @@ -1641,10 +1629,6 @@ "767b", "768b", "768b", - "769b", - "769b", - "770b", - "770b", "771b", "771b", "772b", @@ -1867,10 +1851,6 @@ "841b", "842b", "842b", - "843b", - "843b", - "844b", - "844b", "845b-gorging", "845b-gorging", "845b-gulping", @@ -2009,10 +1989,6 @@ "900b", "901b", "901b", - "902b-female", - "902b-female", - "902b", - "902b", "903b", "903b", "904b", @@ -2757,10 +2733,6 @@ "767sb", "768sb", "768sb", - "769sb", - "769sb", - "770sb", - "770sb", "771sb", "771sb", "772sb", @@ -2983,10 +2955,6 @@ "841sb", "842sb", "842sb", - "843sb", - "843sb", - "844sb", - "844sb", "845sb-gorging", "845sb-gorging", "845sb-gulping", @@ -3125,10 +3093,6 @@ "900sb", "901sb", "901sb", - "902sb-female", - "902sb-female", - "902sb", - "902sb", "903sb", "903sb", "904sb", @@ -3878,10 +3842,6 @@ "767s", "768s", "768s", - "769s", - "769s", - "770s", - "770s", "771s", "771s", "772s", @@ -4104,10 +4064,6 @@ "841s", "842s", "842s", - "843s", - "843s", - "844s", - "844s", "845s-gorging", "845s-gorging", "845s-gulping", @@ -4246,10 +4202,6 @@ "900s", "901s", "901s", - "902s-female", - "902s-female", - "902s", - "902s", "903s", "903s", "904s", diff --git a/public/images/pokemon/550-white-striped.json b/public/images/pokemon/550-white-striped.json index eb963db2d29..f667f112133 100644 --- a/public/images/pokemon/550-white-striped.json +++ b/public/images/pokemon/550-white-striped.json @@ -1,41 +1,810 @@ -{ - "textures": [ - { - "image": "550-white-striped.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:19e55d3270c43844570910aed8f3eef6:683644c43d593c0354648cc542f0c330:f97864a794849ea9866466461e0e9a7f$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 37, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 111, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 219, "y": 102, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 199, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 166, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 133, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 100, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 67, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 34, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 170, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 34, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 36, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 136, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 183, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 147, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 153, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 68, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 123, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 42, "y": 0, "w": 41, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 41, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 83, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 195, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 156, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 117, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 115, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 37, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 111, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 219, "y": 102, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 199, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 166, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 133, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 100, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 67, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 34, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 170, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 34, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 36, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 136, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 183, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 147, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 153, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 68, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 123, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 42, "y": 0, "w": 41, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 41, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 83, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 195, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 156, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 117, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 115, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 37, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 111, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 219, "y": 102, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 199, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 166, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 133, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 100, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 67, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 34, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 170, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 34, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 36, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 136, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 183, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 147, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 153, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 68, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 123, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 42, "y": 0, "w": 41, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 41, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 83, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 195, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 156, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 117, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 115, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 37, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 71, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 78, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 106, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 39, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 141, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 176, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 202, "y": 0, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 74, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 211, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 191, "y": 68, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 163, "y": 0, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 77, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 39, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "550-white-striped.png", + "format": "I8", + "size": { "w": 252, "h": 204 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/550-white-striped.png b/public/images/pokemon/550-white-striped.png index 3dceb30cddf7230e6b42d281e38a0dd93891f34c..855b7041256e010ad51daca6bba717d4142df856 100644 GIT binary patch literal 4934 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 Eg8R}8rT_o{ literal 482 zcmV<80UiE{P)Qbj~6Q8u(lcW_>dMTtk zMco|X4x9KJVbyz3^e^dit|&9xX+M^7zX z2^y?StF)bL?RXv*)&z~Vw^70Yeh(poFSeudXcCv50USzNZ4m}(V`nY5Iv z5;xeIE+tG?57u-VajXrq?l_g0BDE#hUAM92y$#Q2m?352@OTV|^@ZiKSV9svVKkj# zSEllzm8-sNg~^^(N`j8#K&eGxnfEprmJ)Of)Y-TALx`rhsKKUcEDa!~d{KZJEaedy z`s2v?Wct-QL!u9uX@;!xSys71=1@=P7^eaNJ6iPaz^|GojXVAQ|7AD$j-y-5#z_BL YzaF*~02<3HssI2007*qoM6N<$f`L8P%m4rY diff --git a/public/images/pokemon/769.json b/public/images/pokemon/769.json index c425fb49bf9..36284af1640 100644 --- a/public/images/pokemon/769.json +++ b/public/images/pokemon/769.json @@ -1,41 +1,423 @@ -{ - "textures": [ - { - "image": "769.png", - "format": "RGBA8888", - "size": { - "w": 54, - "h": 54 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 54, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b2e38d3d91d264c48c1ffdd32ab30e76:78adce15d31dd8e3d3a9121d4b745f8c:ba2e5a01352778ce94d84746368de8fc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 59, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 55, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 108, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 59, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 55, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 108, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 330 + }, + { + "filename": "0012.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 59, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 55, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 108, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 160, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 59, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 55, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 108, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 330 + }, + { + "filename": "0022.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 0, "y": 44, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 55, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 44 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 141, "w": 63, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 21, "w": 63, "h": 31 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 160, "y": 140, "w": 65, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 22, "w": 65, "h": 31 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 770 + }, + { + "filename": "0027.png", + "frame": { "x": 160, "y": 140, "w": 65, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 22, "w": 65, "h": 31 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 141, "w": 63, "h": 31 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 21, "w": 63, "h": 31 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 59, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 6, "w": 59, "h": 44 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 44, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 55, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 59, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 55, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 108, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 330 + }, + { + "filename": "0037.png", + "frame": { "x": 106, "y": 94, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 113, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 161, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 90, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 106, "y": 140, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 106, "y": 140, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 167, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 161, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 53, "y": 94, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 65, "h": 53 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "769.png", + "format": "I8", + "size": { "w": 225, "h": 186 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/769.png b/public/images/pokemon/769.png index 842a0f90b2f679ffa05dcdb637af0540a7b7ea9c..a4e65ff1e947b0d3139780947fcce8d654bd6e48 100644 GIT binary patch literal 2578 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 literal 412 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 diff --git a/public/images/pokemon/843.json b/public/images/pokemon/843.json index 0e2cf3fbcf3..40f78f893d9 100644 --- a/public/images/pokemon/843.json +++ b/public/images/pokemon/843.json @@ -1,41 +1,648 @@ -{ - "textures": [ - { - "image": "843.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 42, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:6cf06b0cca3e0b39015f8d01dea60f4d:45ff2285e9a9e0b0ab468a91f0519ed8:1ad579f7e215608104284deec571c282$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 172, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 214, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 256, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 128, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 128, "y": 166, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 44, "h": 39 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 86, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 43, "w": 46, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 46, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 193, "y": 42, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 45, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 130, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 225, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 216, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 42, "y": 128, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 172, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 214, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 256, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 128, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 128, "y": 166, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 44, "h": 39 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 86, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 43, "w": 46, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 46, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 193, "y": 42, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 45, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 130, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 225, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 216, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 42, "y": 128, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 172, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 214, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 256, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 128, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 128, "y": 166, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 44, "h": 39 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 86, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 43, "w": 46, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 46, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 193, "y": 42, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 45, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 130, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 225, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 216, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 42, "y": 128, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 172, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 214, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 256, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 128, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 128, "y": 166, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 44, "h": 39 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 86, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 43, "w": 46, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 46, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 193, "y": 42, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 45, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 130, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 225, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 216, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 42, "y": 128, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 83, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 193, "y": 0, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 46, "h": 42 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 99, "y": 0, "w": 48, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 48, "h": 42 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 50, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 50, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 50, "y": 0, "w": 49, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 49, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 147, "y": 0, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 46, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 239, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 44, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 99, "y": 42, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 44 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 46, "y": 43, "w": 42, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 141, "y": 43, "w": 42, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 238, "y": 43, "w": 42, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 183, "y": 83, "w": 42, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 42 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 44, "y": 86, "w": 42, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 42 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 124, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 174, "y": 125, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 86, "y": 126, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 85, "y": 167, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "843.png", + "format": "I8", + "size": { "w": 298, "h": 207 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/843.png b/public/images/pokemon/843.png index 1206c17a1751a96280572ac6b19580bb3371c10a..18462c6e27ce3ef24a5610bfcf7c35d1f3fcaf0d 100644 GIT binary patch literal 8039 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 literal 496 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

E?M#YipuIsH(IiOSOJn&4 zmuf80PZcpl?Wf}uSk6brj}VrSYi za1$sm4s{xJRKOzXvZU*44F9!avFD0!m|$l#Unp@yzMPQqxBJn82+HYYa(^)kEKyZQW4Uri`Pdk2nR>)dwP`NDx?e;6M z(e7W54Ci!XFal8bQi+}pY}C?uFKw2$wgvmn8y#lGzpLHP-E@BVu1Ym}{F6cEhzY2s zMuzj8m4z?thMdg_l^aUF2@fILSj8!ws^)ueRu-mJVP;xOzfi0``F9$GBy$vhgf|2( z!v40m&YB=wR||c8rLn{` z5UxX%(yRJ;Z{RYSCGh3?Zy|)C`0Y>Ir?{Dk#38@Iu0WX(uJnDzfZ(=Q!?2W*PGwf9 zMB+>;UVV%nItj(C-EesNW@gg@Qs8(K$el(Y&T$WCvurB(8A;}s_-WsxkTG(CM)kqJ z3DP`~dn1zM%>Pz=rA>mLY+CES*U@@-N0`JAN*5Rh{^;Zd4qIZht29lN=F&$-<9#%G zkcN`C$eDvAUjlJrjJkNzPp7Zv+8fQppXUxNa{V=WDhy?Ao!&SP%YKZTiygn;)JPTa z@SBpNvC0pt>K;VQ-U_uA?Ec7CAiUT)dfDPjgj4_)*17amCHb=6Qj-sx+{=Sqp@~A` zEl*qaz>+|C;Y6PYQSiNi>E!E3UAcwkJrhsgxbGJh3ld zXGVor*&IGJQ5vi9d3pHG6af2iv|JssuW*R`rA%DHNYWAXoUnP&Em^KqpRFd;>|te!dd^x$ znORSQY#9(0NGdp9i2wN$Rpn}loJ`~+-N&~|$V}(9FYN$`OLkPaTr@-3xL@(1+_~3j zC8KLApnS{Ip8fg7Q}cI$!}$}*QQ_%5_Pw9JWvbLZFEKe9VtIg2U-?T-ApS0pG#~V( z+tuDw++?NcWuV(8MZ9r=#|;rKBc_84i@vS-*tghg5ONKT{7hYBu`KADyx{zAPlV+} z^+sn)AN~YU`w(iNT^`@AGd%42kfDiS#Q8*%K+9Prv=`lv;;d-v!cq>Y>F-FrJ5Sg6 z#40mvPQ2F@t=jhRfw-7sluD;?mJIv6Z8|!YxpCtM{=Kf7nO+*#fzJUWdW5(S#shjQ zNZXd+wU9!y)ZoiSLhX2GFPY=WT8fQN?XA6Ea~L@L!-1L!3m3M%AKLp~S{@TLP;6N1 z1iTURcAFe~T#g727#Y(T7NC5~OdXghUG2|aa{l;oDV;+%t!#jFS8R{f{q{f<6;Adn z)Qr&RitD}Me*$vk4=E&w8Q1WbDGJ>!jl`MV0Tj$tRX+9V53<6s$=z57F8#`fd`hF; zP^rt`@J=$aDH`Ztyt&Gfm>L#ZLb_>D<8JKz5`tCZ4aA=ha?BnC6Esk6$h+Q(1UPc{ zg*>=AHIwSTIaEZ*V3E7AX^QQvYgoVvYX%U7PUkJW`3p}y;ujT2vw1=zx8gv371q#tjZu~~4NO5M0;zYbYuQ%N@$d%^(0<_d#Ezd z=TAOAA!*E<3r_f3y-fg|Cz&bvMRoUvUKP+i+3yO$-GIQ;*LDn_}EWHlT} zs*JtcXCGt{Jt%!0(n=i3DaHxYw^E7{*?mkG^^sZI+Xwjg!f2vXL775FuyF zqH#atJh+YcwhE-Bf}7I4eSRQ2{u-y`Oq2#EncQZf=ijUNP8>9wK9q_U-m9NY*uc@8or= zk&(m{eK|I_r{=mFKIL9HFQ@+Y5M+GH3W`g=r#Zr3^n697Y;^)4+%RXM?;g@x*Ci4q z5x!h}^)#yxVShZ$%x)7eRg|+on3!R#4p;#(7y@S(Tr}igfNx=K&~NL)W%2{AJQIOm zQlM0h`M>i6a!qp2v5WXKI(jP7j;KWzdd^Q{73V5ea04h=E`;Uc&?7v`Kfaan*CkQc zB?=(=O1-YsVhS&qnQakT2{n4(3qyA_N6PKo&O6=DCyXu`24fC_-^RZV6O>C7r{+&^ zm=oHA45vWOl~L^$ovG|)HfK#?k2__}c$AgZap+7mpm_UUVe97=W2H6{MK-zE(EMDvw0ggo_`g7G4 zXREjuSefx@Zy1v%4<+UO;x`s0tmhCzoOHe4WaXc8>zs!K0voIYui*{gE0T7o#zQdc zV1=s|L?Z)`PRcL z?rhU|GMT*h+No$)EoBG!nJMdUKft`$DUK>vbzp z5LQ_<%q9)JpQ0&2Nx#W7OO0I;%Tr!6#4t>A&f-0I7;=V=kz}fJqBM9UR`4NMe!1h8 zo<_Wr+|+;De7Ki%BSn*kk|y&jB85?|cIwjrVn+25^V-GK)CRXvsq=0q;~#~SZGyr0 z_mN`UMg1041}#xICw+lyM=lz06!SHjK}1j%8BonX0ZUQa~e2 zUXBf=bz*``wCiXv`Ny8&eVa)1$k!p_-=(^8pxXP4FV(Egj{0Zm;cf9XLFo>({qMf8 z5XKT_$A62q5<5;FV)nBURk}^Ku9Kv8WgWNYN)|Nk^GQM@8&HB?7C#eSwe}%or(!)< zpQH+!wTwqv*^a329NGZcUH3$C-@D#!)t(PuSH1STA_?3~MCly$wsw+!1o5`OJ{5AOA(1 z75jb9;vw$Du*$PZmORa?h&WvxhcqQ@iv z)I2j8E9BXLYdcVDEX+YN;v>4kq=D{T{SB4HiWIciq{;8Hn8bCA^RB$HjnZoEEUZM*rqlyh4~b^CZvNS(^s(NeiFYS0|c_mhCS z$_!uJPxP6Oyh>Wx-6{|$rU0-1Q6r!vsKlt%f`#o!+OplA(|rdZfd7Eb|5pMMLdHsF z$uj;QE6g-iu10kD;=ZCUd<6fa=&spTOq`kB|Fe4o*KUBxNI3O<An?{|4 zeWW@ta1=V6lyk&k+ces)*^;Le)C_i!W5-wj`O6FV@K;tXVTL~$i?*0xIwIEtui1NW zHn6LqYbnD|_i~VMUq1Y~C{yHcs>*fP#!%62Z&ynf^V7ECwen+8*?&BdkYB9Q4spK~ z`PoNPRn{~lKN4TWkT#6zJnym@Um!_aTok%+@AIgNEMWnrJmCvqGq@v%!pOFw#^|9+ z+aoJ_DC_sf4CKR`{JE%C_k{B-Wlyp4yL`YFd*PMONB>5~I()McsJEs%MMkho%-cPrGcGK>qV6P}9$aO)Is=c>YaG`OkLZTB3MAFb&2C=I58^zXaKJs0RF6L%XD8IQU!ou#P;(5sgfXNog&^Xdn%446hyVr+z<< z^o#3}-D!EI^9Dl@!w{112=C?Kv5}WiDdS>2aQ6yFD+d2(!R z-5=btY*nQ}n5A2@hGN15X~UCMSwkt>x?9N|m~359A?xWTaz=m6G2#KtI!UDFS?7u|={FPc zB3jB+^RKSK@Dsla2|_H}s|0?In%6b5>L}W7J}#Ie_~C5){hUQdv7@bx^u8a{EiTiL XfqKQ!@e1bkBP=a7J=IEO+tB|3X*VD4 literal 937 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%0Av$RDhcYy6mxCO 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 literal 1047 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 diff --git a/public/images/pokemon/back/769.json b/public/images/pokemon/back/769.json index 379e649c963..f786bd9e384 100644 --- a/public/images/pokemon/back/769.json +++ b/public/images/pokemon/back/769.json @@ -1,41 +1,423 @@ -{ - "textures": [ - { - "image": "769.png", - "format": "RGBA8888", - "size": { - "w": 54, - "h": 54 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 54, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:2f6af04d97f063cb51311504c4e64bfd:9d77bbfdfee3bc3c4f7c0bca665f6e7b:ba2e5a01352778ce94d84746368de8fc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 330 + }, + { + "filename": "0012.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 330 + }, + { + "filename": "0022.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 162, "y": 0, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 55, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 213, "y": 93, "w": 62, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 10, "w": 62, "h": 39 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 73, "y": 94, "w": 71, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 25, "w": 71, "h": 26 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 94, "w": 73, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 26, "w": 73, "h": 26 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 770 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 94, "w": 73, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 26, "w": 73, "h": 26 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 73, "y": 94, "w": 71, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 25, "w": 71, "h": 26 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 213, "y": 93, "w": 62, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 10, "w": 62, "h": 39 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 162, "y": 0, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 55, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 330 + }, + { + "filename": "0037.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 54, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 53, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 159, "y": 93, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 159, "y": 93, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 108, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 106, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "769.png", + "format": "I8", + "size": { "w": 275, "h": 139 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/back/769.png b/public/images/pokemon/back/769.png index 515dff6c64c51a739b34a9dca16a72e6c5a14b55..2562bffad19cb8143657dac9bb3414ed17466336 100644 GIT binary patch literal 2122 zcmV-Q2(|Z#P)Px#Ay7X+}tu~jyKoxdJHhah?()z1-N!qj^8>0`zEJ|L(gXJ;RfC9ieyb>uaa88nARe3Au=?V&}tx6ap4LO7I-M6k*2zyp=23pGZ0NQAR1$>i<$`AWKl^5uUS z)t%u&(z0&nC0b;{*vc9&G3W$#HRUHstxG7DW}=yLf311}Rp77KiUEey$!GA|;FxiV zlB6VRlTI~XI(p6FOEtN;8m7M+rBcD~MyUm1?!z|<@>i5?6jBnkNxdV`%)y;1tR!la zT27!X13Oh%Nz^7>8}wIjrwS{H+N9nQZ04X&6;=|piM=DpUs2*zVI^ssR1;?ADAFXm zBx)0TN07gw#Hqqc!Zw*t0-8CvQ-zg8ZDQ{T@>i5NRai;hCh(3xGY5C7u#%`vYB_WQtwD5Ge^!wAth0p)hs7}X>h?MQJd5|Qq2NVqzSSG z5Fz7G#7lrQDYEZ`VbmsE+cq~|(ae$71Xwyyn{aJ$F9FgdNdZd-YLl+b^%D4CzTG6D z39)pbHsRXbaeKjEAsbv`hdOMgQMT&29=tX+1${`mNiRXf;9?j@bOsmI`Xtwb z+or_$d&`AfdyBj_??_AjifRTI?fQ-!eW*?G^_~F%tu4obP{H6Lw(8Fn9w~ypfCz)^ z6%iq+aU{#B;=L^C%TQY$EFB3XZ%CcN#XZz|O)|X_;oBHF#)yt-$l_8%`UM7;o=IYO zB~Y7eZ3dULAZ!MgE^}2U-LI#8QzZCeDa z#Q}fCZgB}&KmuVs%tw|E(k6peQse^uitdC|1{ZOT8(BJNoB5FP!lzx9XK=ZRfh--Q zO$IHX5nf|~d416WG9Bk;V#*&`I!K!g@^kD+`jyA4I<*BP2rK)`ZnG3R&|KtpgT|49 zlBiZDbo~d2RLxN{&zbQ0KW$$#N6kE?3A=ygjnv3dGmn|^D~g|x8W+Bz_*~JveZ3qt z^BnoGo1_%TY6rk&kIy zHd|gVN6kD&I;L^aYDf~$&z=tNyOKF-JI7!>8GU7*Jsov( z@W1$PhW(r>=c$h!XP#VA>JWZ_$dETjZ7g@(!g(GzTA@(K(olSyMj!1!3y8g#=nT&i z)96Q3l+j+JAVeTfK-;|K5!;B{MOc)z_32k3$`JYH{`;G>xPfoxD8pb({upUO6l0tFsyuZOzcW~WG%qf$eMyN3raJ1#HsY3A|DU?1 zjKL*|f(-kwj;w1*oRPnLN}DZ-`W+&D6&y`0G zRf_HVKD3ha>!%ojMJ(DX#EnU-mPD~pmhrf_D5(UZrrX~j9iw6xN&3(>k+jvSAxe_k zC<#Tzb;vcn)66iG$Z5Zdwqkd#CUH?>7r5i##8nlN@_Wrlu#7kH_wO-HI_J_ZybI*K zd$k#P{)%%Jbd#jF_HWjOy4lF`S3K{C%%PT5l1&spL%!p{+F ARR910 literal 388 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 Ac>n+a diff --git a/public/images/pokemon/back/843.json b/public/images/pokemon/back/843.json index c2ad6db0510..3ce1db1c3d0 100644 --- a/public/images/pokemon/back/843.json +++ b/public/images/pokemon/back/843.json @@ -1,41 +1,648 @@ -{ - "textures": [ - { - "image": "843.png", - "format": "RGBA8888", - "size": { - "w": 45, - "h": 45 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 45, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 45, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 45, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d81155c7f88503721ed6b93d98b0c79:5428dc86e244ab063a4aba0c3835641f:1ad579f7e215608104284deec571c282$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 183, "y": 126, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 127, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 228, "y": 163, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 273, "y": 163, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 45, "y": 165, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 46, "y": 123, "w": 45, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 45, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 142, "y": 84, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 200, "y": 42, "w": 47, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 47, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 154, "y": 41, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 43 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 188, "y": 84, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 42, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 43 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 85, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 91, "y": 164, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 183, "y": 126, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 127, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 228, "y": 163, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 273, "y": 163, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 45, "y": 165, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 46, "y": 123, "w": 45, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 45, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 142, "y": 84, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 200, "y": 42, "w": 47, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 47, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 154, "y": 41, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 43 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 188, "y": 84, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 0, "y": 42, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 43 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 85, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 91, "y": 164, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 183, "y": 126, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 0, "y": 127, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 228, "y": 163, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 273, "y": 163, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 45, "y": 165, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 46, "y": 123, "w": 45, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 45, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 142, "y": 84, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 200, "y": 42, "w": 47, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 47, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 154, "y": 41, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 43 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 188, "y": 84, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 42, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 43 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 0, "y": 85, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 91, "y": 164, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 183, "y": 126, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 127, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 228, "y": 163, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 273, "y": 163, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 45, "y": 165, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 44, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 46, "y": 123, "w": 45, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 45, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 142, "y": 84, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 200, "y": 42, "w": 47, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 47, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 154, "y": 41, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 43 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 188, "y": 84, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 0, "y": 42, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 43 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 85, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 91, "y": 164, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 183, "y": 126, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 45, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 57, "y": 40, "w": 48, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 48, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 225, "y": 0, "w": 51, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 51, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 171, "y": 0, "w": 54, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 54, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 57, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 57, "h": 42 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 57, "y": 0, "w": 59, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 59, "h": 40 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 116, "y": 0, "w": 55, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 2, "w": 55, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 276, "y": 0, "w": 52, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 3, "w": 52, "h": 40 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 276, "y": 40, "w": 49, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 49, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 105, "y": 41, "w": 49, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 49, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 247, "y": 81, "w": 48, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 48, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 295, "y": 81, "w": 48, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 2, "w": 48, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 46, "y": 82, "w": 48, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 48, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 94, "y": 82, "w": 48, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 48, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 234, "y": 122, "w": 47, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 47, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 281, "y": 122, "w": 47, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 47, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 91, "y": 123, "w": 46, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 46, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 137, "y": 126, "w": 46, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 46, "h": 41 }, + "sourceSize": { "w": 59, "h": 43 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "843.png", + "format": "I8", + "size": { "w": 343, "h": 206 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/back/843.png b/public/images/pokemon/back/843.png index b844a1be03069404cd7073d40615c14a44878f6e..4b58254af5b695b1682b7c5d76b1acec3b9704af 100644 GIT binary patch literal 7359 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�pa$0NWX(a)}#iXy1NM9HYW~XE@|DWz}T!Hw30tnQjm$J!k@B#0ry6HRgTtJM3Ge)BSIAgOm+_?nJKxqWl4xXJ2 z>eB|fAP_Nb>qwRu55b&AjBWtoB-IjG+1!C-R2>r-6J5Mr} z&e{-j!MY!QXp;(|+KMu^l_YE&q-SrudLElQotNzA5eR0}4iWDKX)RK+GFAz9Xz<&P zH#XLiqQ|LT1zN5P48k)KVkE*X?lVR*mX@BPC&ZHJfERYotU!MXL&{`p<n8+#xX0m^F^8g-8+k#$;`Mioh5Kv{;+&rCEoz zU7R`tdh(R7tLMzUAFfI}TjT-jpC3*DWwJIP4WYOekj#5(oQ}n`b4eBz;-9Q_h^7K)nNciV;Pp>6T_CwE1dE_Ky3cN98xrR_y7f&evShq^#XNjn#t^s{>ryeGP1#zovBhnj zG4w>@Yz9fe$UnH{x|@fXr-;BEXVl0ZW+F0r#wh`d+kNp%D{x|QpxBr~_JE3Vg9%YN zpuG;Iw(T}+W0MA1vQ^WolNZNRBfPi)-2x&0c(kFkv6iyj$O_dOvb0l47Fk2iTHMn^ z4P?olI!o5;w&jM~Z07d2S^ zi23i`jW6&5wdpJZrQwYFSV3jr)Oel7=+uyq&r!89JL(y3EZJSv!=Y#4xC#PkU>DAq z__5&nK7g`WCs5;na2?7)Obe@tty(#^Df8oqi=>#901ug{YPal%c{0tJrV7NFXK+RX z_KGNjbtqG^DilKN!?Z?)*d&%rFi#ZD@yFFCP%hTROvYAr$fw5LVhy8JD@Br`3E3bf z4OQcqr>&U+f&T*z#ten#qCjyRYJ*RW!(a`ozuS7#Gg-2FkG?}pNi@eLy*TSVtPz1M z7ALYRP}zZ$B}Q2LtFsPeGOf99kEeJ@lHG&~cZsRn)?dsypaEOpJ{^L^DV+<-ZVa5E zo*LV})2!vPj8T%}4e-LA4&K`W{`kH!_0)K5Iwb49sXZgk@0vUl2^kv#IozqK z5{+w@uJa7+3igcIs#f~*c$En8M)qxiePCxUQ6VPm5vxNPtXfHB(EI4>rzmH{_%i}; zEvC*~QY3_EjE(=s>BkTu^5;{VXd4K5TOekVtXvAT*QIgaX$+boGae!1k0}i0@)ET2 z`37owLHPnh@xvNB;i8KzmP?4mnM}wR8$+Eb3W2sugH zg#gi;?blSta@lVx2AP%b$ljX7Q1F*WT#Lqj)h}!q`$+^79to)H~iJ^!B7he;Y#YnN0l028BKionL1)ZZ42zgH+zXC#kLBagzSYuXC>*7QdR%eAux|?-E6|zCNqf0VC4Hx1 zB1GrNI+o)!{*b=0@O;JJt}-j1Z(`dYF|zX~~8>E*gJGUoe-LaQO>`k`QOzqs{n_RIe52ERPkV=swvZkO!g8z=HiN z(bgV`QFPyHGDE?YxTDnBAE>6h;aq`y;x~nFfMsvA5E8QUaIcdfeOEOo!#6-TC6{nE zfGm@ll`l0731Mq(bz@j3smlJ==K@SwJ!J(hg|k+Y#jJcucD*l&kdVY*^}lI6-0#=E z;^fNerM?7tVy{i75q>EMmVH!qtv|&fA#C}n$-|k{+2;hpvU-qh6s7|e8qCVK+Kz<$ zPKaWQ)yBg$<8P{_C?sJU`RU}2ClVw?Es*u$hLI2hB#TjJA88f}sd8~9v+}h@kPsat zdzXj1(h`S4f?U!nXc+LL3jgTQwILxoc4qN#T0Ni35+k{U(@AzUt*^B<76HkmNU_G> zRvls+&FTEnF%V)X96a3T720L>dYAEqmM7ESCffH<+!-7>XU^B7>XoQXWx}a%j(sEIjW0O_+5c=3yuHhV%f5K lUCI9rh5uLE{|Cy|{s+rh8T>@td>;S+002ovPDHLkV1n}7R(}8h delta 395 zcmV;60d)SqIj{pEiBL{Q4GJ0x0000DNk~Le0000j0000j2m=5B01dA`MHIm3DTu zdAVe+FOE##xv%LD+Bl{3U4xlIfB4Fg{CWEv6h3S5vGQ@$b%pS(>kYCErq4G_#Tcm- zpKE(oVywK3FMQEl=kfSr;?PzcFYi1K&CfkI&aJqonTMAHt+<1UH%;eTFHYCAEz45; z$u-QrUP_9#-9XA=o?xQFX@gQumfiVCWld#6v=Q@mVDr~`RZY2n-d`z$V3(Y&wu&$mo><_C>$V=vFBc|g50D1}xt{etO*G5haux-YH pSeXIi%hl{Z! z71q7SJg}ig8p>ETBaGXaAFPJDCTf@`#8Qx)oV=mf!$5{T%v8n2R!v!s@AS`PZJ-$} zQQ63=!W9D|_BGNs#=84|SEzsJG!_;MmX@lLNnq|?-uBCdCQ4N`!?(F@ceu|}5hM67 zm6TWyBrb$dLx{e1YHZD~mCR(57H1CVML~*pp9F?;$=C6gS3 zje^0ssyZPktez`^(4~qa6H@?vJ7m9VAe9?LLHJ8uwj=YcNN{8n~JP|Gj!;$^#`q0@k+`jqM%e~FgT z&Bh~Fj!6c&qtmM!zflE(Kj-K7Nn)8|N;&^zd<>@GG}pd(MHNLYGPk@1V;(xF z*SPHS7<$n1P5${&AAcuO+h;5n1{%yX%KCxkXY*9jHXS+ZRkl+2(VU;ZM~4n+QsP6t z@6Io4T6)xA6aTW9P5aG@tb_m-F!YQihIcc#n5(AGV)6Fp#8GTiGj_NUYxoM5^MGpf z$7CY`=r$<_JMY9sa4~1c%qL3kSoIAkE)#;JxhACbsdLX7#(oTTbr?C%0XZsZzX|bb zK-|9^g5}p9jzkiEbdw;d&cykU*3WJ#94jwLZ_H>{EMb8}e-RWM{GwQMz_=CGd0g#a!P0uttCboN8qb)GD^fkzk(8b5Pc>^vsnMD2xVM#2p*O2eW&T za_kjJxFS2|qAS;AZX5IE20stQ?3I>Fne_kGaAD=u<^jH`kV3i8wo_2voNrP352Pjp zGc6c3+qxg1&l?ArzC;XW-f;7)>hVnDAanjOdg;$GP#oRJ*8l~C5?BHdXV#H?;)#3J z->m0DT?v7Yo4HR_pYb@fgTRKO1(J4-qJ)?f2-)*Kt;F<4!6@<{z5hwQYm>xPRCen@~-ctOeUS zlTww`C&~&jh1`Z-2RyV-tgAu&IaoOh`fm6?*lCG<@GB7S4{p$V0bn2VvpC2~6 zquk+6ORi=~&y{dJ%N_1o)B>;fbc^HBRA28FCW@P5kS{ZTUbwUxwt8(x6^4&KSoulj zP(MXED16ENMb(eza=APwJ<8qL=&8EU(U+A+R!Ym9FY$KTtk0zdAdtO%BN6UVxavpt z3Y`J72}QgQdFQV|FMrX@^R+qN>sc736C6b?v7V1#q*3Gqun>wV2bDh3CILUwu8Tk* zgf*d1BQJz1bJ>dTwE~Ll$wT1D)6Gs@_PHOyCS>bb6Wr^n9z2)Y6*Ohx zshT_(JT0Xvd0lS$L0>Uy1FoZP0tc%vnrwNYZuKFbG})f^?-BUho5V!hgI(j;OV&KE zUT?(3WebZ3r(@6X3)4RT`N30gg6?^3N@jxBro=~4UlwfuqzXNX5z!Sg?t-GANaF~0)}h6T1oI8&xD zw_GR9jNGjEx9XG>;)01_sFG_O@cXY{B+v#AHqGOIugVL&^+4X@26m#o`qvcf7K$gv zBDsUu%HdGhV8d|xoI=2PLE%nQXo-KK=iPc)hP7x$bh7FIrBX?*&Qz(~M2>gXNowsu zV`7sCyNaqqaB-5+n1?2h6P2G!%E?Ax;nu|6Jv5oEhsl96_Q~ae>31z&!iO*;O-6xr z_acG4)aA7m?V;AtdVcnU(%9&{J4stDUVxmC70S7h&Pj^fI;*hW{6jjc#CwnxyK&+S~Z5A zUCMJT*HV|J%fKX4C=G=_-2B}>lKwLhSK?Ze8Z=iXb}O|nCqa6-5)~U>_!K~;?z31X z^~nYBZH7Vm?pMxdq9L4YYye0g&x~ag@Z5_!m1IIWmyJc1I=3m%A`*jA%@w+_Nsjns z=!>jy0a!fux)13+dBua%tuhYdD+4-*wo@SJC&?V|Ipa|0NiO!v-T3$PzM}hXkQw$^ zMUkpt3-MzEq0mqU%nWVcLlFKC`982xil5;;L!@aW%(3=%+loDv%qRLD6*<$@h!vU@ zW?2g4<|6(Dd$UcDLXXKsmT+Pn0Egw20{daa07kY6C0a zUgsQBEarS6fJIx;uD^!mU}&Y1F5ea7g!ZAo9WmV3rUnGA>*hQEq1dXT#oWH{%X% zliER~SaSGSU~5!Gq7YQ+oD+V(`hoW?htg zED=u#1}Jm<8d65NQC3z;V#-G_=KPdgGZvN&#rt(O+Ax!c3`J`IRU=jrsR&r`ua@po zU|bww9NUf~uwhp-A&u5>$6r5`Oz8;b6ose9M^4E=gT_Ue%G^X$u=5X&r!uN<2ApL zDIxT8{U;hUJNL&tk=xksK=O7Lk%?P(o411GLd5B;{=0Nxk66XjMXMrQk_qRvu2W5o z-e1`DHbm`G1^a~<3e!&2RciA!qz8sri^9^ME8V{H(y`xta-`;$i&Nc+(*$3PkGk$; z8>v9G=X_qY`HJ=a0&@(;8de2`#m?abWSL<(Suc~{(IB4U;E2?E#f1|isj>CmT&|NG zc`4-zSKGu7)xlP5zjo=B0(JjC^Xs9%U|b~J1wdsV7Nl~WLk`mA%VgE|MFz5;%aE7p z@^y&_dd7v*zHnlTeX6)6#EeATt#U*Jlebby>EcACT)qL_UInCMc`Dk2eCY6^ng0~( zTr<-*uSE3guRYeJRMIi`|2NkgPu8iH;Gxv&=_`VH2`bTD3(yo)O@5VloD zzuCBObwq6PW2F)V!{2bzanb6CnB)_Dxa4yG4ZfZ&9O6iQKY*qFSV+?d z>)|emjV|s#KxD`i4y6*LU5KlLN#W`iSH!0in?gZRg(&8GGV#88p za%b@@VA4w3_|98}FTlq^3_0HoXvyg@`ygRK&@zcCs*p_&w7okwgq~pzKP*f|CVzdR z-Vx=L_S5uQtpLM>q3yQVY!ypnde_@c>9@0_~D*|$@ z=NHZjp6sMrR*RlMxL#YHM7h+h(JGo_Y;@pfaHb~WNvQ{`cA0zwm$PV#93E#rqGYc= zf8E1VKbS@_@J|_l!=pVmE{V>-^N$6av4*vLl0TVpGeRb4A$u|hVDra{nboJ`a9f|3 zYjCH3pv;dWS!oWjfY}fg_tYb-*3Fiz+0&TO#O@x|y(Z$8c)vy=LohO_jUWegaP?k% ztJ#yw|HV+`gCd_r0AW>YQsf|I*&ilXQYqrDEV&tixM4bIV-N}0tgj=ayrHkK9`SG2 zBRJlUqo=Gd*n3O*O;o6-Qd7wwp11}7d8xXg0(V=!jo!+mr%G(}#eJC}tIg8F$AvqR zq$NlW%7YCL7yXc%TdbfOh1W1AY|et1*^lgC^?|=_>UU>A8WTRqh7N4wINOvZ+c&HF znJDvjsa@WtPlVpdsG0W4%NyOyKZQ)EG6JlP8*N26QArUKdzCzTt_k6n(@!z$3D=Ln6(PMWf zXo>|lt%x{^{<=A=!+@ybGx1DLL!GC3qUlMz6+#|+D@Po%$y>n?C&9gm_zj!V58}wY zdvl{m$HVNhZ0imdrA)|{R^=9&VkeyBgL@^vUnBh5%K6vbx}v0%=7`BmNLBvWz6zc=@6%| zw(bcF)*D!>a2Mo;F8-q5Kha75hD6Ab^}&2n_7xU09+m`ThCs5MS%rf6G8wG7Wg|ar zeereZ()hmYJuFY8=RI#-h1YDJd`i58p_wJ8{9ehPBO!~vOD@VWIZc*0jEtrQ0!Rwy z53-}Wrh~Xy&?VA*tOtKtB>)&!9j~wcv2w+WLjI+d%5YzX#cYBw@`ywNf}d^Qz<@zE zrrpmDeR6g|(?d=`wo#SFjYwuZmbGt@gL4G#KvT7oA08U2iz3TnlLIQbaH$aTh)edl{`Ky~iIpp`k)VI=8Ao?2@ z<2cfoq<{V<6-u3?2al4#Y7yr)#);1u#s7vrG_XM?lNvr%15*%tU(p17EILUi1*8Yt z5oY}_dA#0g$={OWPh>wpk8;!vrD##PLpogc4H5AmA&3S+d1X;mT$ox7-`zu#hQRVS zgrm7OOq9N#l(2}H7`cT-4$Q%32*x&M${zYu6Y5Q7Z=sQa>mf!a{>NRfa2@vEnx}S_ zo5n^fG!)0*D{osuWd(3y|CUIIXh@$KvMgXfnMWkRsab5 zqBXwnM+>evgc%^7CTOFXmM=+?q|x?ehugUhu~&Qj~`0F(kDuHN+fC$SqvX=^g(HhWVls=jV~m95zX zlfmOQY^sT`I&k>u`C`V~Eu^?)7~v$4hxh3Q>e~>Jiy1bcKrP#h$FaU)#Hh(2^TV7= z6>&lqdBAG-;JrA!Y`w+4NTZm9%6{M0CaP!^wtdW8H8p#pL`JhpHl;%vx*}j`mQMpB z=5-5uNc}g=l-sLeod!#ubi=PiRrJtEz?5C$n3mPx5(TQ5x?h<# z;+OBms&=?t(AozzGHCj4V4K|XFj|mJIY$co->H~wr=ot2m}cv~T>X>b9zwDN3duTO z2LtNa#1HTwCqAqnIB)C|g}vQ*7Wf7sbjNhjSSTr)qWEf=Z%E~o;txz;epL~th2Z91 zGgd#hAKu+N}KY)n=WR zjsH-?{pSzvho?5YmkoM%lq=>IOoAVmI7ZCEdS#6Q<5jB<(|ti2Y{*s?Iy$NViT%+`%p*V z)o6CK&mL6e4^eCzAm)U>bZc%0-J}zc!rxt71BbLqB+$$ayg(8@f_rlii}`JAFGId) zyLbew^es8~>>wLAxqY`9<0iMO@|2E#a~F8yRr=-Ln0j*L8{OKMRJ{<-EOJUXg3$ip znL9D=*ehJ(TktfIB`e2}iTiCB4?39*{vQ9B&*;}l&wP$>8f;b2==h|OkR}o6NHe^^ z@Cq5E7{hK+@KFT)cFl*RXda|ubc%n#6`>oMKU(Yq`yTJW{lEz8T zmikti50xC3Nr6m;tD0tQK*yPApPj_RFIuhegT|c!soKH*_Nsw#p49A#SE_W43YA=; ztnb_1A7j8RK%&x-{xgmi_%UcRkyI-`Y4IWK;43;X?U;^C)68OIg$_t&CYc7vkw$4S zRb^-zluR|EFP_m)^oM>tS{g=umSO5NIl6Q*o9|f>jTbn*P68icw6dfRbKV)+yeED3 zLHk3;Td!B+FS)gTk*n`p7b~~Oh>xI_GG?~bt$aV)JtayY;9=C`ZxoaE<4Tk*H_6U0 zI$rZ-TlAdFNJXaw)eyTcF4aL^vNu0j$g8&u>JvEqT?IM9iecw>L|JGuF}7FBCd(f3 z%F*wFvcBrf)eL|m=Yd1u_q%z=uRE#T(DCp+a}?2?&GN2?C{uxV^pEy!H`Y+^2B}uz z_d%SYvmddD%uk{gg?vUs7CFWD4^WMT!uhwk^^7%{=sr*MM)+h^N1QVUQ|_CX1SaX? z_tJmPD3|z}sci}F^vBbo_yI|aQ04$@U9bE(gEMZm?^{ci9PLhv;^gvb_Q?d?j4ncV zzb(Dxe7O`PIZ_%GUR{@($V&xbUnARt*k?-;bf*sj)=?w#O(5g`8?g45VWGYsCNCq#^x6EP9`l6||;i?1mE&CDX-BjIn z9>6${-{+_LHSkS0nEFrFXfEs=Z+bRsak|XN#WRXIpK&>%`B!fM-ZJ3s*+o;?yubT~ zOIcV7CUoI%+(w{cH%0XYZ0ox!&%Y*3FY*R<3zu z&v&RoOi!k?MqDH5AV!*pP>;MeaW7V4SXk9|DUjU{bq zs)QW235kn5%;%1N?SfaJUeuGrX*o*yr;X{PQ}(K_|CU&_L(-#aKnvI&2j?o=S`Nw` zj%H9_tH%%Z=S_SFp*lk&Ui!N8uh>h0=P9;PJa7?i#&52jM4A$S?OFOF_-(LVjVVqf z!{?!XxsH)^*~PNh?OBl7is#I(zXF?wY>7{AH2c%JTLy=Q@Vx6%78Bag?iSg@3Y@%h zKlOchO7Ov#7eo_Y)Cpd20x-3fYDFOLdLp4l!|~eZk0L#hd`vRN9TMg{Q#xC7!QRIu zqCTM9c80@8{TGiN&@SvFKN-m<3Hj{SR~go#vIhI!BGOAsRF&E)bJ-N& zzG$4-iiP^-{UJC6+L`L4z@{flvc45l{A>#RcFD@@ZVB(}!usMX^E$zpequ{sdC^+n z9pp%{Oahl%>}&S3VaNV_F4~sRYghD9eg=gLk~PDQBH5?;hSteCsMVMzd0uy?b|y2} z5GZUmF=IrNyVx(cByAz+`El;Pz?Asu&UjJ{eX0PHk(BuA)?4BQOEEt#xy7OJ@h1Q1 z^C!sQI)R_|EKg9IjWz0hIp3Ai-ge;&OY`(`Gxk(iUuKX=1Q{1Nq6}w}KM7twByN1c z5kKmJ$b5Q=>ncUQ!o>ceuv*Q-OF%D=rdW_oU@MqaCK@h zlD?|X=?#SUJb*$$wd!Lm4D$6?j#_^aq?7F{Gb|rAhN@qihaQ;sS^i@0OycCKlA?PrV2E%KWXU9@Uu?oBPq2Ib92A& zZzF|*t<9C@pbmR>KBSf9^iqsWY{%|K&GVv*!1S%k%9d7}|K*84_`N7_%G}vf5&V~C z4ns4GRib`1W9AoLI8x~KmqtMmgh8}bv=aM~hAs?0YoEpH`415}Qg|J3zZ1DpV{H|o z%zpD9v!Uy``QqYf0oe;VtBAzAi@)Gc(DD=StJgWL;>I2kA6)(sG(pR=bsjGbKg-{-sPd0^Hu>vEWlJMQ zu^<5@vp9N8*;cz!^m$kdx2SjKeoo&;SX~7oiTyHHH);&Two{28*FZxs^#x-b;p_aH zltaGInX>F{Fb#{te|qdN60H*-Otd8^>v}^a9I{XP@n;X2J3Ia+| z`Q-9{1swGH6V&?sV9~%EI#a5>n@Z|!J0JQCqwPMU>zriG=f%b8kMB>oi4F(AHKjWv z-FYe<3vM189r{pc8Hk z9i;&@gWcKROk5N2k2Aci@{(KBQ*BZqCGDAf(`$Fbswz1A7}Y z9L*dv^JWbcwgLLz)J&JGBA{{N{KFfR(H1o};aqueT5+Rr3YUiH5u zm6~XnB9?_aMCG*d>M5t)CPjxu=hg_8x_WxZ)GEXcZ5rNc_N5@LqMjHM_(RQ0gVOA$ z>|~VtcCIWc9L*u*Pe%*6PuF(dnLZA~!}zN|bGVs<*}Bc%bFL|4#6YqL=c~xu-a+8O zM@pe9H;$i~n>kVngkSx3j27ZZ|Tdtwb|EBOGJ&|GY4}i6Z!C% zHqt=IF=HG)W#HdaAgrX!Vs7N;mPcBI&QH!yUjTr!~aTS4SRC{9XulGY=J@rX;`*?SWV!&81*| zte3RZ5)f_9I;*iHVxU=AJD`eoK&G%9e6$JWfYgQkG)+T^oO#KtriH*F1C;Bq|K7|g zND&~Jd2F@zwI!{?ccF2(r-v(Cjslz$t;0TgOeF+rPx#El^BUMF0Q*5D*X`F*##CDHT8>B49l(TzElJQet9aH;h?&sIR1?q^sWG=H}+( z^6#^rD?|VQ01tFhPE!E?|NsC0|NsC0|NsC0|K*LIrT_pS07*naRCt{2U5R4jDzX*1 z7O}D7|Nq=E)XpM-mLxshyf?W?x*Je&sO5llrU_aI%XC4zs9S8ym7T)~m-c>%aW1#X zg@as(me)01zb?dJz&T$xM0mk}uNvS2qlb+?{W*iA|C~O1nEWLu4;S?Lw!k&rVgo~L zt>}>f(g+s~5Uw%KIy&64_{sZ&C=bhJI6T|jS0)e_BJVp#xeDK}D|+3Ss$1UR_7UXG zzmdM)JBGT-@TWrZb%~X+UFyBRZUpoMPX>D~@`y(dV zXlql45PUQeuZ-Z;Fu$j5E$18Gp@Hw@xZPJoHhgWjt1$BiW3k>2p<~qnra-*vsXE$< zGjx#09_s$PnvOpX@LkT^J>!=*vcDp{zwRplZyVkn@+z&2E%ti2X84Kbj^R6pUkI|2 z6o`)iyfT39-yiILwH@x3=NhzG-U!xKdGAjg$UUFnxZlwJN?%vHZtnYIUd09=BwVRTaN6?tj}e6y$12^wnoSYkRcrp&_ChEAT`stqx&Y{T%%Q9)`2Ul zIQs4l@8|vg{z~{>_uu-bB}o6S!|2;n$9W6BkM;R_;lF%uliH*9YO|EW0bZ}_2HK(`wmRoYTNHYK$neqRA=%_*oy*%S zO9<4nON8P3KhM~le|}NhE-=w7aRbS;PY9ZCBg0~5z3%PP1Hiq1y^J~Bk|2LVjtQIQ z-LKk})A5Z7&8(#QJx5~NruvW4S6IYNuAnhM+(2uk8d4EkI3b7fF8plvbIkCu+dvBn zzljaDeem=ncyNHXfB*lx5x%!3E{o;c-elPKLvm> zLWr>qMA{y>n$u@=M59dDb z<@E7?2`=EK(quy*d@q1(Z~*{q_`cJBs~uG4_vMn}o=^W->l>{dUPY{|!(=;123o%q zYARMfjPGdcEI7abjaq)R_g7p?&vW+ZIf5_*OK0{zOzLPcip z)&6l$2n#(-Te3}a=N~bQ=a?K2%oxq0O(H1b>N*EYK=5A_!aD*_d)F76KG8F{+aa*E zC+@YaDaf#)CAFHUFSj~Z2)@yvK936vt>JN&0ONxxrVb`n(sf!(n7djk!MAfB0PX?a z&-*(hry$%DiXoCipqs?cneD@+nnNby*|~dQJ=aijsKM40@Cv}AJsgElFU@2d+ zlF=^jZI0wpLZF9ADrTDlr4;x7GJX!MjwQ0L)Owi+YQC}a_n5(U9D9x&ikfx+fD6OK z@TM<*z$)1eLZie4$dOGf``EMRAtv)udiGP?rS#YlBds}r(@6O6h`>`I7_5KwT+8QN zEGJd2i-FK{H!BIo2AeFjo8Gym=Y|0993Y1Zbq`2vZJ)lY9FRtMs`}0-OlZz8nlg3@ z058yu_+AF_?V*3=RgzJ}r%1@;E#HUlTA#k&V=unbW?a}HRF0&*1BmbKs4-`q=us%6 zv{hxWRH4CTh!Ot^Mxj6(z=2OG6i-F2=?5T4EBVq;K~IR0e*f+P|IO2yoKAg;>~LV$ zLjjm39j7d_CNz7m>_PS!3TrO|Md)5k9)Cf5ejs87-ZQ+A4!Q(4k~xuHdeHAWcPX;lO%@HbU|0DyKdwA%m-$LG1~|m2Q0|<^!G>I`ebIk8{?xRo#e#S@9C4VdvWex#ZITZDt&Lx8t%+*^k-L|de4_~ zDT6VEXg?5&rGMHWSgRGi^Y-c7Jtm7#h9QdDt0Y#6w9Yxxq=V@^;zrC8{NvpqD1Cl@ zLh;aP75`F>HlS@?@+pq;+dN|SBBC$M=+3IZ9wDw;Cu%v`vCqN)14akQ(4a_>R;J z%wAlfM0%UYlJPow_b(2|K>`Dk1+ecetvRskx#Q@lgup|HC+ox!AKVa1Z#UkBaKB_h z6OEF?k@tKbzG2dOPZnJU>95Na#(k&hs@z_Z`$b$V7<=lowhEODFfXwzRaF8*m0b1i zPWOUc5|{D)zq+Ri-gttM?H~PjAf%AhC6&buwP*KuwmSY}=BV?EO7o6=la3vdRSdXs z?(c<855o?eK)!@7h!YfTd?+{l(3X$B6y}_cWu!~hV^AjUGQ|Yf2OKP+4L1%?yZAU) z8QXO(A}974g`#$({o_IYF4hEY;-%D!sktu?E-L*UD(SnsPX{8w9A%&vq}~HN@BZwb zeBe?uy4TzOIlk-hoG(WLuVw(Ns<54XwZ3}h58^OSUfC@I zgj!XvtDupBKA-WTAQ?17#_%!GZqz}z0zt1lY)`T6^iJnhq@KO@>%wpJcD`m8?9Ag% zeP|CgLKU>Tht*WQkL{kqFm0ogO@;lU}``+0tpjR=*G;DuXgJVMm( z`O!OjtQ@?}>-C8k?bBWOUITbqjS9kP89qOq-?*v25;bMd4+hM#Pjn=zzjI7M?2aJ` z6yY;41f@Uuq;bD^rtYNsQ(P4l%aVCJLLE~U;{WxDCa5w^z334 z0tbeurw=A2SEa-b|2>sFLBLFNflO0XQsl#j`fuPHhzPrTJ_q`)xD~Rx-Ss>0?QQQS ze9|DZAe`{SxZJ$aSTRZ^VvcS3qEGBmyO3vpgq)&@(~(&zZ$J51(H{~K~369U}TLmBzhhvk2UtzGRKD_S@zM$b1^j^O-* zHxvguDhR^0L^F;HWG`H`Sx+;4HNU6b<7xLaHqW48D0lO+>-`?i;5~7ewMq|Fn8Odk z62QSiG0}xj%Eh1DGS3ZwyDAvDctvgoOak$;1Cb8b(HA`iKZ}VWB8=D}w74Wbf2DO(%DUA2v5I{I7~#r+BHdMw~xem?`iwwyT@#vwZ5x)k7t|5 zS;p&6JLwa?_|4FEY7|JX=Q#+(-@l({M}xcfbIpsdLa8u{m}FsxLQ9(p*6kf{@J&|s z%7;jTIpo3fEu&3MDJFF9nV=cU@Ei07rHIqIUe$-0?JFQ*~p9d6kg%%LjanYts^9+Y;V}B7hWPls?gJ!!Be{ z2`nN!jMI12y92XVGff7#5CvEPe8P)+R`IR7uk>D9PTo9i7P)R1W_{GAAEF?rcgjxm z4{z+g+xsi5Zt&v217Q3O?>XKYeVge0Ot)oz=N2ng!Qc>zJ)ij#wd1GOj^_zG(_^JS zN-x7oZ@D2-&lcvMA*iQ0dIIQzDRd+WRLPnYXp}Z|cdtxMC%o|o1wpSWDdhqJJjIVV^F+n{yEyS<-KC;o!gD4t#!Faelr{ z^PWbiOrL!%hkvi(SO6S;9etPApKB@mbmB(LnU}A0$Ju3v9fHH2O@>MSNm40HAqKpO zY#%=9QN8<|-oSEXtbhoaql!x@o74-wWh@C9TliK$L4d1j9I51-hESWQ#UeXLX_YZL zlCh>l8|DnyEClZ-_-(;A49du+6eYnsmX&eQ=cNU2tf(ArddPiNw!Gf)&2uBC&Fm$( znf}NL20n#aTRZMH(Az4^W>onl8++87NO&mRUn5ylj8fmH;{@L5sNO%tK>QxSdGz4A zkOBjFqzMq<8wrZoC+!|b4sbEMM>Y@izP5P^yNJ=fD$xiZL!1E(fNvjx%W>|eoV5eM zv*)(>cCzkucxy0{O=??SR&+t%h3|1}bP4lyXk^`A>76k4uAj2v{OE(du0)_P1d>9G zcoQ4nTjAXRT*?u6r^ogP&NwOw#CRnQ@EyomC87Xsp~m6d+$6$`-KRUndB6wk9&dLK zx$gxpE^gtwOzZh@F}KJtz|ku7X~>(yL_2Gt#5WLUsTOGC+vGm7=h>kcKr)xo-0{xw zc6@i0%7hr=On;o5NPJv(PTCHW6lgY^B4>iZCS4UCJfoBFUg0-NfQRjJ#5}-+rUpl) z{S;wFttPG{5Mg0?#IajMn6}TIdk@lkEYpI|H_!Yanytwqi(Rs)X^pOf8gm9CjX&%g zCx64a2ZQn=KZy^P5Poy5m#;dP#6Fo9vo<2;tV>C4@P&6L5^8UD7<(g?*QMoTl#2KOeQuzY>O_%m?VAL zM7BKacu&!C?c8YMMHD0B-sdSl;uRUs+2s(vF#zjqs_tRIn@m04Bx0KVtD{&JR0346 z8(rl{Igs*Gj+f9TnrJa3!e-zH=I06#CXZpmyaKq|J;bsB3*lEckCU_~GrG08-t(V* zoIz#!cbUF3^95{wq@-X@Gk@>=|KjIf+~%Egu}N+cwh8TchvAaXjW*2eY=6=n<(7O3 zwVGU-c86d?xsOT*3lDC*$wu#vvsX%wXDI)Ix5-+w9O;|B_EWcti_&KqM1-Zo==nWN z{G{zx@5%>K?`rc<3q zOESzG;BNa<|$YC$Y$n zcJEG^CH|v1R;@*a1_x3QH%GR-Y3#zm&(OR-;&}$(I|#lzUw5N+y^5Ii9q-_*19$vq zGhDJs2qwBa>P;n=w-_HgW?Bz6OKEKOCZXS(Nbk0LkKu=rm=_RZ_*TzxD-c)~QZ6Mz zK8Cn$c*n*7zcH3&^OT*x*I<3~*x8a%g3p55FlVqnd*uOU{6N-|{0_vP@lGkTH|Az{ z!aM%4dTwNT%p6qK+q<**4W4&$={A!~Xl3rhw$3t$9o|IOIMThGqtP*ONCm{~=@#2Y zIkI9N?V~Kn6;A-$bcF~jp5tCTh2A`}nAkb7$n6j7;$k{I!JsR&*Z~mskQyF%*Q_Q} zQm%OC57Z)gNQRmEG%F^>pgwtcHP&>`@Ga{;O<(aE2u78Wdqa$Qk4f0ge|e6uhC4Lx8t0bsMFO{AM}rj`tnm(niT}u(xuiP64oR zu+f{$WJaNZl0xY^N`VVqp(TxE&u4^3~KEz@Q&F(xo?>Y`QQk}et_pEND+_ZPSlPM z3-0(%d}Dv?n|Qa}Fu6>JP(!aarma}wn`=Ng!N3zb^d{Z?XPHBWZ(X1*svPMnAZqrR z60ygg>Isi^8z%}Xoim@$@P2BN&2?{{W(J!x5Xc#9A4oNuz&j1>GJH=7_5kn!>*QPh z1HB30n|J&hke%UDnV1&uNu(k4_8(}seSQ7cKTS2&imhuW7!WN-668F8HM^%#j*LVg z{SatLf%lgU9Q*K{^^SP>hzoF6n`gxCmD7K6FqSijN#VTCsc(&BZa0Gq&+LHo=ZJNb zLvd2J=Cpd(v61fYuGj8)pYz^auNp#Ss=2Mn+Es7T=Id8Xp`4WVSVsy78slDv_m{0$ zcH;Z4;hlza?t{8Fo2T3Q)lFZc)QL0L3Ga#sj4SYsZ`c~@7EA)Pj3CnKaM^uqG)W$n zuid`hYI7|dtg^Q9CUd;RHRMf9co(pJ*m7hB?a;n*q-+|1oMsYFz|R!D$&NSYI9W?- zAF>9#dE9$-dY8Z%lN1LVhOqYs;5}79F^1$uuQhmoIf3M$JHc0SPcFmvO!s^C`liVw z_s-h7>P?nWb64s!E=NoOvGkTBWxHzt=5>@N!ulboS^;mtx4wQA34>99vrRr~oB=Qp zyF%L9*eCSCCQ;smSoIy@@{aCFYTz$-O6fzVmTRW6{7A?sf$r*Rv+>+j0y|bAA?TNipW^1))VzhM1n}pn( zbT$odeMr2&9O-C;ebhdsX{>vV3<2CqngfViwohGc|eL(?HZ{^2P5a7oLx)=E7?bF@)vvO?S z;0$PGeh<3ycF(1@y9Y5YNlZpH%eUhyV-`Y&t0vK-kl^VL>k4%`3& z+pUIgWZC-rkOa1O%ZJym1$dc=aK$rtR0q9PJDYdLUYD~2#1G^QyYVIi{o7#1Ync@g z`#K+<%L$#_(l*x8 z|AyRfhsnF2XzBGx(|z<*#B`y)$76Hg40L%v(jV$3?VZojR*#magiGk`q}*~c;djNG z>~C;JTrWpX2Y9!bz)!}0eQfUbZFzi^&W}3rq8-@(wZ2a3P2UsN-ef;}mk*GqYquli zNUOoy7}#=K zcMRXfGR9fQZm+=iRJ#X1en2jd zQI?7S9OagFe8b)m;BPlR(d(~BSe*VHFokG~guVFn^yy6_o&=lqCvGX<>KzYE;sRcX z@9H7aiG1eahJ1mF$evu*dr{qPe0wG(;(dVyI&h`#?a_V1gi~~*cdb01orY+Q1eH!SlpI^8wp?soC^S!-L2batZQpyG7VHnQkl z`kg)kJk@N5mB9A_{Z4!bz;}Aezz*Ccvp6U=NqfG3qt_cAjp|I0BPDy1Q6)(^o07NI zQ{15y+#$X?(6D&;DS+3UcQBYw?_~#7Rm?eIO<~OunjJPuQ1OvfUUJq=Iq;a<=Kt~s zixJQ68?WV)ENGgqBQXK9&-de7yOJbB#BNqb7}H%=XHyQB(NTIuQmnhA%6r@3`QO>C zb{RBej4zc`u%voTSxt0F0Q{)~Yv#89OFm{zJx~Y7(td)&Zhi?rNe@S15X?Jybj-A(-lQ`ZxbYw*Ir(V@%1QM zmppfRb=0H)F1jB*g%!NRHNiUQs*S}B2=hf__haxiI<< zETzj+LGswe0P7>5&kB=rRq>7UkXcD$wa{avPWR1u^?9a&^S|p`G6fvjp-sGi4>;I` zUTtgEHC0$c#6fc4%feNgCwx07+Mo(bw6fzH06$`&w+SFS@j*=$!@6YN(vHM>!8b%T z9VTdal)7Gf^Ak9#5U&@+#l(fgrIb8ht=}d1b8;x~4Ghg@i(6eCNc-HqI!$#byTAWp zR2Yv4@0aj|8dIUdrvVmv@%6Kq!g=zpjn1mYjv0+g zosu_1Q5ivQm9bz62;ha7m>0$ z(~^tjOXkT`qHma`f;wOX{P{BhJ-w(WuPWy#qLtx?d1Kb=+N%6$A z{nrs%>9mHk1R9UwCjeh`I%oloAP?-wKUh?<3UFp6;H6QxVh|xHDpPiQ>{R2d=0e^U zR$TNVFtemItu@oqdnTD;eAcab0WaUm4+*BVQP02^Bk5%!&qyWtu`x{b-w_~WS z71=MSo}R*M`inCBUClFP06IDx*i2AflwQ?Rc=GVcGH_LZdrnSFlE2j3ufTT+aL`#+ zI7#A*D=^VV#gHN|LX#2@bSg;HN#;ptum>6J^RxZ2Iao`t@y&+K)=fh1kZEY@{Oyu5 zEOP*O@fp%c^Kv9DDW+td0YH!Ix`5vjLrq#J*;UV*C-C1Pxoj^Z2;C@KC`f((!`7+b z8=^ehft+|d)GIF5a8>3cSc1d4D|w)1FZ>NBM+mlQc2gI}(XzOHyg5zi?Y+<`)oc90 zJ3jxz%^COz>385eSsmP~0-w%0BPih|%V3*|(bF@vb>O&YV_HHyi{{)o=fD1j#8$J( zcfh@wEaH=bDQ@%l2b;NUs^P;6FP9rXS4#yKf}wFGEc%#`*~B;a@1+090`YO~FmX{| zh5ip z#y2+(rdacwEpBq(N(XLLC#Z^RE&u=^07*naRI5m8xrFtJRgTN+F}nRQeWDmbHVQL5 z6@V{NVpjorUKljgRGwbc(k~yG6vc@6r8bXqbnV_Rn@)95WLKY6YqaP zaEp45adP4b?eSKQJ_+>B7sRw~P|Gi>mM?Qb2$d}6E`shMzCrPkoC#|_mXaUv$>+)v z`fTEH^w^t^^Iwm=UR}WRn%1P7ph5*9XB^0xe|}04+vL}-Z603+(nh$d0lgOTq&M}0 z(SxY&l>qmAo>BCj)>@4I2}jaDif^1-yqE;g=2Fc9d|{+;iQOQkp~*cQPjRc_N)|i^ zm@B59QQ>eyg1!W}=ZVi$KcvD5V&^Kpy}p5`!0d$A^l?wxXhT?EEPwn10Oya#wOzQ% zl(ogJ(OF2gBDCq?Dslzii>-a)NSEA?7-){*JrTg20NjfaOrR&J^|kl81-_@?>$Ohs z2=BV7QL<@HnoaYX1ib>bSwQabk(Lg_LHtiMvkda-!t8^4>U4BbOQ_1?bUuZ_?X!I> z^O01sN!h6Cw}rVYMvmAMSx>w3IA9Zmh|~6%iC*)SAHk^ zJxksY;>)UWzN2Z2d$s#%X}!ib2_1s}UO))0;Z$Nu>$zLAZO}GCDlcn?Cg0KIUdVLE z?`P!i(+=0j1NZHTw+rh_=o#KCjZ&0|Vb&!}rp6bT2P{I{@TPqk%=*O@M7=~-7*-0b z@60l}6+@lK#|sJFamj26a*phWCMBd070jPp%j8^ITgui z$=KK}|GNj9CjS1X0gmv#N9i6=??I4bf`Y&c5a<mDVm|jJ6;r1d<}9H4 zSp6*D`=7@FEXF;20*>`S3x#1(U=6yQeBmW(uP$+r0|x>u5YtE}fVx=%Ip$VBhi@>^g|-*geqjRn0WZfJ5b8d)A?+L7B+OWJT4{xGJv`ed%$d+3`IM^rhB%MIn9#|U zeZK7zue5gW_Ucv<{C3I)f|PflcZt?mqmWYb;&IIpl1&D^@g+e?jL#%-nBd)-IIbc& zl^A;T%tIb|V`jP7%re9ispP&V&1=>!aS*LprR_5UdEGh}H%C5u5)L6-S`#jnl~@R_ zA(W*`ww!b$e~WCW20`lYZhz&%DMPAWR``_iu9JWF8eOtuHb7j-q7i zs*mhUoLWLh%LkpSz+25My@%Hy(D#eEq*OT{UHAkrH4el~(;$IdC)mEDDP9Z%Xq1jp zYpX(a`nAZWq7YpBb(5UZPC~kod1?U1->w}BUftsJBEWB=K+Pslu;W1geuyH_xBDkw zOk0zc6Uc3inCJlGOFcl93?@%Q+J(tAw z1Ckk8`(=JUR#^M1o5uH@W!#(X4p;GRs|Q}U4|Yr#c(GW`ZlK^UndEa5 zFw+Wcua5wgg$!%|{%12-XOH~b3C*c2;;xm&F%oBHdK#O%|2h>sBPRj)7Sc_T1*$9o zFW$U%`#p_axXWx1in1@=QA>foLyOu4u1OpxgPDo7D~YO-2H*F#xgEK0O0EL$%}jyy z-Q9oi&dHcqT6`-Iz7v!!UQ=jr9;;yO{llm4e#U*PyiL@_laPwVcOZ)o*_;}25@|70 z;p2nhl*xVb;r9=-rsTq_;jAOjx4NaIWa4B{_gla_$x8BX+;sn1QT=e_zA^L=zLSI> z;adXlT4I@+hl`2p#3s}Bb=IB|_dfGn(}ehaN^|7K4Zf41+^ktE7j3>VK*>oY7Rzh1 z$dPx#`j4LqJjoh2S~Y@Q5$HoD(AS#|mXIjVm0%gf*yM-F*kMh0IPDr)LFkz@a#Gw? zfpjuUDB)F+lI- zGYXX|@c!5H#>XnHnH`a)KpZq{pW!fc6Wd&(ea0zc zRf1kyoeF%@vsY)WgBcs(DHRA;*!_Yf1-{d^e`di_<2!RQU9uknae+50uwvjHw1v0$ zCV+c9xT~|8DZZs-^M^lqXj%dBCm^2<`1Rg=bgqQA1WT~&EmDT$Oz!y4Zp`y_A@g2`x0M*~oV46>*0g3Kd+CbK z8fzanr27@0T9alWj_Kl8W^%@OpUtVWf^*BxOyo@Pw*1(sS89y!_FHO^xFYXfRVVu+TSG6AG6T+G?k3QFL-^8 z6x@i-ant1Z4roD$jnGX^@{+8BJ33pc&oL_~W8;50RP z{Gh%nc;C%x#)tWpF8ppSUTQIqH>olO+4OCGX7aO#0;%2Q@j1}r({rFtCjf`n&$aQr zyYD;oR}o-^9IID?Row%nGj1pAr&xQa8lFxs?b|+QY0;nDw87&CHs260#cId9#3G99 z^MOsB8Li&B{l?~=$}=~Fs9~xn0i1_RriT9=ap2frxnwOt=f>o6e5Vz>Wyd3Pm9$3& z`8NVQy00?y9-65tTa$6(i3xDZd@J#mKBAq@On%%bwz?|=eOkcoM0T~^@79}~@aT7m zKES3cN}vaPpJAx` z`QGH@{#s|;3FE~H$rLMDVw+ByN*`zcgH2IxigSDNnMq2(e=BF&2=phd-j8Qv11-mR z`ep5igoyqVhD=|6#rtVjnq-*@-d|LW-}W2{{&+hRm>tVkllb|GrVyTm<0}@BL}Y(C zz=d*iF2lDlsizNmc88a>E(y@qk=M6hLA9*r)%boR`}gBpm#lntoZXE$^UN!m`j^`T zngfa3&8dc__jd4U-&1F`-pm=`{ZfEC*4X>ii)muH)7DUw(kVwKIKq!gqYt!h|I|)T zP-&t1NAb%AMsUIwq)Z!l`;+mV?!6>v+v@fAH&;C}fisgcY~=nde0OQwwlCzgKl7B* zo=fD<4QtQCojL@FBr6fw-@lmLT>Hr6Aiy2%dH~IDwh1x==%4ma)xisQs+~uj;Y(~# zJp(+oy<^1mn?z)XS`o|mdfP$LEgo+CAwkV${;BU@(OXL7Bk!atntni-r!$_n9a1@e z>a4My%G%e82d7nJfBjk(tt8h{8s2^Pr|}}UbQ<`3l+oAPzNvyL@*B`E5n50Q3jPQB z<|uZ_^v~<6`WkhmBI|#VM%#hrT=(a&CXm)uKT#hsFLcj80pRBBn3fCKOh$r%_DC||9PFJGg`bv-}zT@W5f5J#Eg)*l9={8Y*JHkS5qBv zPbfdgDhu=}NgTnY*W0DOoqt|x1I+M`bs{grqNOA}yJz~7K(F-shQ$Q7>3b1VqrJSS zXLx0jDGO@92H)^nX!y3O;=c6H)yH?ef_N-yf5VHeqlBMFStscFIks_z+gB%XzuJ^y zEbV(G^n+@Zy#@lT)S1%M)=vpwuYRxEaFzA7%DUuxaI_K6c(aQc{u4{<(I@aKam^2fc2wc~CZo3GR*j>`j1z5nDh+xT+k@ zLG5Sp?H1*ur%AS=o$6>J;YC9P0gm|g+&gWY*zeg7b=MqhzkwTxLqd3}Afm0DGY%Y7 zWIsPiL>3e_-#Gv9jkm>DD>&)0q8F8ps`fn4sm*K3U=n5B_?{%I9GwNVZ<}E)^Mkd+ zy$I`P;xG88gM&iWC2Ke#UrDzb-8adl#O-Yf}RNPaRx6nJF z)l@MNm*5K`?o+eiCkYW!-`ULMeX_zC)-gGiv2gP(E?_o)6kP5@x<*%F?`z zH4DEfhn+}O#C-`1rUIlo<_p%s)9Ob@I&M%GuUTN1OaA}+cbUZg-2F?}jZr8|@ zLKut@)MLG$fQ73vJu8%p`R{I}K=D3nLlLTcq` z+4BS*@rx6d+t*)}_WJxq!CAH<{4VoMEG`)k;*ej~`d?n6Y|opT5$;JgAjYtrDVme* z17qU1mbc#%ALRH|6QsfJQ2@9R_z;;kP?0S(q!BPlNeB@VaM7yUTj znSir0W2QVR%DPK1M#*AYAfknxVzuTzwfH!+iVocBni=6;Bo|T}7W>A|HUyIKk8l>f0Q0plee5WDw_WtZp&#f{)j!`!0gBL6pNT++G!i4wH z;thja5=PH+Hh_4nxtG%cUaJ*ep3-DdaSyx~S;T$WBjWBHzO*=RDc5Hk zz>}{Epf7mlS3MMQL~P>4MCI@lJu^~aCTxSNdJ(+!QlgDK;d?GbWVMQHsH$v6X!{A{ zggPd`f-UkiOWq{4``!cv3<7DCu)Z8|v`tu97uL0aH=ykE8i_VjD}?1GBETlru!_5# zYd+NninYY_az(_whVO+mw0YaWV`Kd>(HFLFLEV`VnAn7XZh6gj>*QeRP!S+UDL68m z*;3+Tz;lqq=7WJA|9HNEiY&h`zADlv{*bb%oPH<)juqy{iDAVj9-nI>J4D5ug3Us6uIxoMS1aO<31*pI>Q(~Wquax-7!r`BRLYNF{*!UW zo;9w^Gls;^FbCUdBK{yW`zj(cGkgSaGqN#vdO(i zpHM$002)d?Yt#zMo*pH9e*19=%{R(Mw`E6V%X_UK`!FR5`own3KhShCMGJ_| zDUUT?%)Tz-{#X%l_sSMD01@u=@C&V6tNftKGEB_eX<|C4gBQ*vvfx06R1xBs1#NOv zh`rWY^3GuuS$^HPyzh*Xj^$RD`$$3J#V$s}dr@qv*G~e3)6YOW(PDMpptj{R%ov}z z67%;r0ry0~hUQgOaWCeYh2JRR{zSQ!Hoi%>j~7omHSr7Gc%GiUu)>TDnY;23EjxH& zkEf6Uo9HuTK^+uTO29Wnk|Qfja_+${CV!vyZR3sFe&KTh$Y<3m(1ooy>uk41^#2UR z=`q??De;Y%VV_7PcQfXn)V$6Q6pPl0CMhHMYd4cjIY#gq{}MaSCb$wEY_l) zMjw}ac=%+*H@^bUW%E=-A%`@J8TN^>+Ph3# zm^vkdQDQzEK z(x{TWr6RlW#&}m5Kn=AJNvlegEE>Iw&5KUFo6Tp!y54Ywks9|B(lX4jMq8`ozM{4L zQ=06uSHxZ2x`pqOs&M?cG2okIprB8y5IwibYfpD?tGp&3yvzl0pVAiOsKOverKG<- zJxO}ulWVBRvPycNzJ0@kGetC)r=$-$vH$$cZkb=*k~hPpbqsAsTRvD}^bFsDHQK&W z!^+9}sYMJaHO#`V%=L!prCVCZ#UlU2Fo>W4Z|(&Y)Tf;IJ)%N%LqRvtxvSULLKGx| zoVjG~J3MxBRPZE_%b`j#wd@tcNkw*t%4Qwkc#YE#%2Hd%UAHSvyqnFjw{~b5FbPB&Ueh*Iy(G3I8$s+8Myeeat zr;;jkcbd0<5J$BwLmj;%Jqb(7HdJKiB(n+6!}#u!Bdam&io_~?_@a&mFFO&eHwrdR z{h*asgE)W;-_a!o&}i!mY-dbWskqB#tjra|?+1&xQ+m19JG_$SiL!LkX`b?!@?%vY z+6%GS;2ik&k47FE`H^u{+g^kzP8*4|Q3T#mlI*VaQ{l6I+iPiaM9W8*hY@)5CEV*y zyjLg7t`0LGh}9ViHrL_ITy##Msr~%{_6D`6mfS9@2J^V8X()=Sbogw1evP(L#of8N9)7imJK!-s--dH?EDr7Fyx)ohdb&x!T7LMY zN=&PU8L8r6&AHU<$2clwA=s)>bkL|=Bcf|EvK=ywSagR#T)048?btjT#cb>H6Ymv+ zIKekXXQLafAfqah-irIg$!03RR>j?jxKs4CBJNw!*C~XD+2A5O5SeEpwQp<4V`4h@ z+X~_MdaMcui&;>FOJ@CpEr#s?Wkb@#^Vc_N13Eh+{;k$H(Y3b9M&XrCT97 zr!?8;;iWOgLwPQhII2!%H%Qv1x=J!Wm5Xn_%s(vTsBQNjBt?Yik7WuKNR{*is)-qH z0e!=XcXj5aB?`zm5(qx>};U=@SbtuF#VQu#q@i2c7}tU zBS#euaa8W^auwO*_=bO$xKxV>r#ae6Nlqu;-w$tjfJ)}35mOc=$l&ep0&bdjO6zQa+{1w}t!;?(Fcc_^n%7#3#zzp9!0dv*`RpgUHv&y1rwqdD!qrxRpkO@jD_?u|XReVz|}2N&;{U!p#~Z~Ci< z8FPu(HRsf1PZDu2;eAJfK|*oAM09@cVh$Mu6i~+AnNmZ1pFzUjHNMYi$rj?mGlCt# zjRy&kZNVj=_8s$YZSHi$T-nTQxm-9h+oUQSU(U_72Z4h#GdCa+EoB*>GQ@bTNcK0T zKXjTeVd5O6^^@TZO=X8BXHDo9%85?|zx%{{rKt^{!r8CJH_R5k1=8fOhC4kyCE(H- zEo5SkMgT6y<^*x$^*(AOY_xqirG`IMMwXi{fcV~yoR=8RY4Z}$x3+A1D0v zo(|$$vekTR(?SlAqjW*>X5?0@OY76#N^-sR1-SbD8?`E%Zw&lKE6LYP( z=TFaIq@6um16)_$Lr4hU?N?oniGqWTX%HRzFuv=Gee@3&zw+^PJd@cu-;JgoC5_VJ zoZ=?_H9qned+S=ebhb5H9AuB~78F(59_bp{Mk~ZI>h?7N?odPaz=T(tJwQ_Mwz244 zNR$^k)B^HqfFN=xQ zkn}?h?0w8w8`&actCvxwK(hQa6RUXpd&ixSbtpJ`t$hA_c+{x4dR!y9*$mxQJ_`Hr z;v*EBH*)v4y&DI7!7*o$-h;7{EuJG;-E8r4%7xwcHpeOJl+F_irpC5)C|FT5GA&4K zCNbeF6@>-fQ;k!dB-iSuRFBrnEAGHIkjL`N2^|~mZzG!e`m6PjX1EsLBq06M_=aO7 z{c|U6Pj4O#+WqMd@6u}+;u+(FlB-`A;`pkDHjK4V>^HK-p&@oOOniP+U{|%0x9?ege06lDOR4eg@I_G|vFTWG^|A+c*>hBn zOZ1J7(9&R@P?v4(W5{>`eSDhSxAZPZ&wRm_vDU(AGh0mIRNT$69KW_le}h1}v|Xo) z>DB0gU%^Z*T|lKrPM_VR4BvZ}T)ht9#V^()QQ`hL6gg4bZ49%&T9&?{cl|=GBrmRf z!D|2Q?TMWQjqgP%o{lM2ue92$l4OfsyV||2`Nr0@=3lJx$l9PDua-xJpY&6T!49yU zzW??o-iSoj{dpzi>oN$cT%5xDAigDyi+$5O%;V4aN{flF>3QFUzJ`#PG+hp*XzFPQ z*Ehmi^Y~)<8os-?=(n^z6uO7EFI!bgdL`)O6SN(?|5sj)e!1f6fu6kgY&K;?dqTH@u`hs1VowTbV0=NpNhun=@vLwr^_;5o1 zEA3m@T)?f7c3l?Kbp~U)Tyi!3h2t4tqX7ju-ZKKx`&XW8Y5(n{s)*H!+pNyA)Th)J zPam`Z@t2syK_=luOnS%}kdD}rXNyVLon9=Mh0~ECYKp2lz=0E%QHtAH;`Y-|s9hg8w2h~+R;X3f%0byfQ z#WV8DlQU|hA&k_o&2N5Z09%!?98?#X)+AWTmjzkQahpOCXa{zJK0v0$z#oU6d^=} z;0p)D!790!^w-DUz$7B#^wnVy_%2Mn2;R8x^6AUg?EO?7Twg zVbf#i@Gj}Yy7NPc;CK4!*%PSVN$d;lB*09sO~o94;DM6=F68nm=^_adj}Eb9ioyJu z-a-)@40M7&GtZYN-l4+hE*|$g{pG|6>^!gaxvn!kvl3`CimPG2;wmyy8NTD}RlRq} zmg2tY0escNhR#|7avzk~6@76L_9E4<#U$m4^dM(2LO*y=TcRf*eA8l3I7NwKPXf=Y z{>D)3!U8cvq9TN~k>>$U(`L+>6T`VmP@3pS0si0#2-)QU)9dqJARH_9M1i(IPpX8> z0x7PJKb^f#QPQo)0q(h$pf7^J%=a7rH_zfJkSbR| zDND#@-vEJ#zYSQZAvC;mfSVyQ_`wiroWP2zAr{ClA%tn;+ibKLAZWpN(0fmxW8Bw* zkWvcZkhl_|i)yu&@LH(Y9RmoxKs1Lo47H&C;KM4e1`=HTAi-6h{?_Lw7~gR4N2dwo zWe)*diBv;gQmG|8Dk7)cauDAs)?x3#>u4A8$MVY$zeSye} zSLBxw8%=RCkJ1XRl8xwT%k)GDS1KU*yg5IQ zTaeB@e4nQtix7YrA_k}+dT;!i{Bo%If(Jim^ajg{?}Nm%rIv?J5VnR`)&NdrvLOh~ z4&ps(+5)~ILHv+JBa8%(`_iP85O_JdRlU6*-}*s~+!L5#Hbz|{P@MPq(@J`hU5HC2 zPkr)vvweU>w?5CITU)WH@O{7q4Gz~vAJ8<)Qp57g&aDj5l)tq@fcM+TfvOo0C!~4@ ziLx$AkcQJFNY!~WJLr%dpCdf*H@ou_uhsf=Y^05YZ)ad@E})Lw5?oCuQ+%t`It!Pb zCInRiGTnus%jtl=R>23?5+=0-AFi3NeZ7;_*cWL0Nlh4Er`m;$c8owOH4CVEh;{gR zN%89$5O31lp@sMr5Pp^fDIZvPoh})0$cdT%^!txf4ZitH1>hpMN&v44t|H%>9Vd`7 zpkq5m8xst0G)?Ia(@{{lRs_Il>GE0`PpmqLFZh&>jp+*ERcEkEe!0DeR)L>?XvNQwAoV`uiz<9Snk{{g=e0W$SeInxQF9fYxH787cYNdk^7awn zji;3xaiO?ho*gIHK&y`wK0cTa=moe7tdCq~Kwd3Xo$<%74~d(9KdV;XQIY&cq~ zPTyzJ#WJ220TqS-Yr45TgnuoNAvOSB5yYNJLjycoI8A~y4#j+t@_*)3*f0WPlz=o> zXs#;BRY)1>9hXXQ_5HZ5r;VR~!y9pk@8)p=J%IM9$sysf#VQ|AdlI@hZLz`WL!P|i zWV(niC-UO8SQl{DHszN?x9?Ne^-MlbT?1{Xj*+N)b_F)rfqV55?V8?T6&sGy#hQdU z7MaZ<-V4$(gh_#Xwu732@9;6G#~jX-Agw1$aGk7x2c_aMUGUwUfZ+Qc1#g^F@(*dS znQU1TTx~urAD68jC)DXy{AQGn(pweb=LO&>{;iW^b?u-B-;UueE)b+hL25VGUmoxV z`XTt@Dt758QpBqVepwshy&zrgwG|>F?Q2I+E3PC+&(mmZo}QZ%GkYQ&dN~0e0pIWa z%rsYB2thyRh~O$;cfbPKoGQw3LP57C)Dh({25==Gn_(jrPc}VHl^IZbX{c4|SS z={es==)DY+X|5VEGq)lrydk*C1W@KkWrxDi4!cvGG+-9T0Lu>#lTylLX zv?CS71FbR-Y9*-uJ1AZ&c?lP`yg^*BmbvUGI$w0z9`Y+ggpMJMU@*A>6vTGL2x@@Y z;obC`I|ttt%2ff}XD4Q+IxDV+tXb4qaUW+i*aYBn_OxMLaFvhCs>cby1S}Q0wcrD~ z>8O-l;rB`29-u+4&y>nknE|i6#XL~=@_x@!U))GZ7uM>QUsm|OgIe3f$L#y8K!zC|6yrdnuSybT`!**t2sm(W8u7W*|OTfLsJu zZz#CBG+z|x3EtI)+@mV`lu>WK#lFs1N@?npU09{ zExG!vNv_7HEd*EF@43bgP;4J3wCUEw2kfDvid4%4UVgf4kSoH@cm>7QepuxQ?gu6 z1`cuG5B!+Xp35*sa#cHu^tA6^4+yThg=F6vJ{x4OO>Zi7&7UWrcB~Lz z$u%rJiV!;1krJuJcRYXHDZlK>eDUp(bG2$1BO4-pHlSw+i4o!lLb-*KhP0L-Jt;Af zM-9By80-2tE2jh=Se*IYmtnO2VD7^cz6S(X>5rSo39*nsLYJ|}0hjoIaXLy%e^(r9 zo;(aN4?KVsYP^}=L2Ne-ue^a9^nJBG#AD1#;#oVKd&ki~Z(ct?$08X#$q z-p_JS5+XL|3@z1l))2c;2!B0@t& zjmA^-uw@>?xRNiQ87ZynA;>;Z%`|#uZ)Ct_=|BP81+Lep?uX4z5*XlKpO9AgfB8U$=1)uq}%@(t` z-r9ODaWv-vT;qG<6NQ91=ji&4S~tpGg?)&pwHvn)D#OYnlQkSY@7F93>-rwn)5%{J zg7~V108V>Vq#SnBQSM$W8!ptxhZJU!cmOWn?b%3~)b8y9`DKg1=w|O9%^`*qaBG6t zyiGsU5DYOmsyh|ma-#6Gr{_U|VKm%kMwh=lLuGjT(DCMCezTQ~g&U z&dZ(Yy~kBQF#{J#rF-@CymcTfoWQ=zFfNDpG_lW^jHqx2zU`HY5JHvKP;{%Jque3U z`3fC`i7W8}#|M&BKmPlBOMe;9B=$Xr%JipIiRZmz7=)+a&>(kwND+KL&wcAwJw0DJ zK0kIDMk%gR`(UHSpGc6h=V8r}Ggc6Dt$k#$`|oh3XPoPegKk!sxkCfhm83;}Sr%!3 zXxC%ZhEN*MJBP3;=~YE+M?rVrGpshXO!d?A!RsMCFf?mtpQ@Hr7Aw#(6@_ zwICW<$0}R*Kuv~C7OjZuY(uzAyMGM#%ztq{Eb@fWoj*pIluj4r+wEpg&z0}9oIrHo zCy#tT&SsRy3HTtYoXPptJ&dlI_EU(zdr|tqP{6D0ALlzjP-<15KjxP82%)j=-n|C@bvy{#XZ zQE_(aR8KdkM)*``Td`a^9w6<%FEUEv9nQe_Zmrtx0o=s{OcyNnXw#h6)H)B206!x^ zyUL*TQ<3k8^A&0%;rj%5qgL%@4xE(oF6;k(`R?gyhzxs}l^@o=J^Kl3mY(*KM|Ohm z`*-5ImS;t~^?a})wz>)foX$pQ@6xK>Zaly~vFE-qV6lH3;P;B>lSxtDdgQ_bx83U5 z9ZjC%y%+CaHA?sUTF<~96=F(&I}&Q#sa0!-sZGz366C=F*4~Q~>E!En&p;C*zH*qw z#BMKn+z`fs%w(^6c1OGGBa8QN_X{X58fxJ0F6ygkj+I{ z03PD|7kj7~qS94DJJn2G{=5FjppATvM{2ZZ!M9!j@6iGRlqjllS^V;Hw3Vk^B^_Y8 zF{Q@Fiw*D{#q<+?0|ST_?(So|rq=FB+vl8SPtR-T!E_m+7vIGrCvD^->e(GFKlZz# z4Hpogpb={6c*1vJfHM@GNY!>L+0{0X_xwg_2&w%38Xn;AayYX?C*D7oFZNI?&|C)g zR5Nw?Lzg?H^vld+T=K}@aGtQYfC!cE()C_#E4XG)N~8eyUZI%E269S3cAEGtWs}ju z?O2XADLd5Kg$M8$DpLQ>U%S{x+BQo(_{hj^?9+}NY?rZJ(-}EsFiO(O7dVeUCMi!r z<^gj#iVx_&or4|Zo;*U=23pY~b=sS`l$xsW@C~ay+`8tnD!-aNas;?>Nf$cs={myI z=9K+oSVKh_xLoKkpwuo(NwYxwPN~`;15kW`x1%m3H0MbyH1K+?4Y2wW7Za_ul=NWy z`Hq&HcHd;SADLpVV~=56(iM+<8oOTOr1$2O#uKn&BaA|y{D(w2ed3OcBpRth;`Siu zqNl9~FnW+I6tM9)C_Jx!V|FO+AMo6`d%j_@ceH*!eoKCpAK9o2YnOBtzRw_}%zH!| zltb?r6zP&zWudHzq|!ZqmeeJsT?IeNmp9$3S&aG)dJnK92k!VyW!+MzAu=) zd}uy?pf8YLRX#&jY%0}- zA)nkYt_jnx9{BA^jw@BN<?Q=$J<3pbZ4_51?{3>l~ zxRmP7MGpoP$E%2{|PTWwEd!3LR>tLzW_C1&y$-)(BzY zy$I3tY6r;{vQnXs1xlIlH-h26HXw#0{h$of`zh7utR{;i#e@G7FkS$m~*W!_A!&$ zL3#@nQlUm>DbR{E2FS+3_#g?E2|%IPKHH1Er>y{_z{g&Aq=}|S*3Vo~7xtw=n-)zI zubm-r_8{j8r?Be^-_2v17ss063pUk*x#0gSagGAXV^M^p`32u6& zVIWeWAa=T#5hzos4PYLC9>H!OwcZ1Zy{8dC%0J2QL43R%*X}!fk!Qw7uDFafi)NDT zL4BRF+jnV;W+&PU?yUagSZ^L*A=MHl&MzRQG;I{hstCb}lINpn{G^|s>q_HFYA)mo z7fFdr4UjKJdcySqM2gg`H72BCc(M1i93bkCG(Pl!Fz3sA9C-1}I_8o|Q69Nw(N)Rz z&`6H66Ya6&Sb7xFSZ5*>fcP|SM*&f7F^zLg5h3!fbE!p|hJ2(ctt*Yo4ytS+kE`4m z02gI#0G1*x6D+lVl+^psV()3?;bH|JbX9Y2{;Hoja~VyaL>5gZZCO;#%g#=YnKZVf z8dpvG3y3vS;me8Y2nyC>zQkhynrkYKdWA{Xw%H1^*c$l`1Alv)&`T~5V@ZOZ%e941+lk)=xPms3*!VI z3pDWXKt!zr+`m?L(1Ii6K_U&{ItCCa(t3iG2OzuHo73-V3Lt?2vVjje58hEbNy=Aw z=9Kr;ko@nhRQdNuD1%(fzG~OD{ zr9;Tn+r$GfzhxW=xZlpJpsP3@c#g6?Qe=?K&lD|xykG2uasw9snI^}jc?zF2|X>F?ojoJT+& z82|?{O1pw~TI|a9Szqiu&99%n1SaH9sGW373`SgdX^UqQb{ZB9hFv$g@lkeNOtim% zh(r0&oRY*1Wl(s@OwtsCK{>b=#zF_#lRP;59*Cr$+5G#K(u)Gv_X& zZBf_2_g;2=2jSW%nsyZs+vA`PoYC(wLbV0HL20~0>r2bAryb;s_PbR(l>u%81E>Uu z_K%YQRPBCqvG+8(58T2>yLN)qvL7Ds%<25B;xby|*=*6e49bDzc${!mq}o{pM8i@7 zZxYX_wK$px+}~~vKLr2v^rKwuHyjYWaUQ}dryn--onQ@wUaz^ z9(0Y%uoj&`o~`-nk|W9S2;o|gYWyV}D!nDhd1RCqEM|8VkTn^4q$fB zGn1364bVG+%Og+{+RXz{5=!5-*gIMiALc;#Kb*YsuxBy z@ImLb^D%h9Gn=Hca2aij_RPO=qHtPrY)OZ(Qb5cn=ad%WAbo@~%wNuA&N2BO)W*$~ zLP-f%q>9V{QAe*w%%IG$-Vs{|pt-Tw#{{0&W@MnDPhZZeovPx(qEyweXxAfC^>;42 zUfPGNvNq}P#vaI;pO{nTLY~grN?HmR<4T9Q7;d2kDa)Vot=<9BZnPf&&5D4#gR;hE!(VU?=JQ>QWHPX&e$3A=U@l+#h4KUhw?$4Urr(3LStQGiB zB&8wr7d&g2rxb*>U zEWx~E0ByAT_7R76h5A<$A6M2+$|+S%dL!U$K5~AhJ=fbAgln^az#%Z~^8N}tLVB$+ zylY~O`0J#QymutoLEL{sPHg}D*Y*!>pYz>!H$GzRbS59aWm0wOJL5b4;A-%Lxt%eBYYZ^$A7C>8k!dd>P+Sck{6!<=)Y{33S6W-L zf%LeY9G^?L){11OJgf2Qr}(6&k?~9jJQ)gRg!2dBwH5~Gvh$q0mH4pumfSL&T03cR z;UgBUo+y~)xJ|h34(KMSg!Z8vQ>4S_T>XTFEMz=SmtnqVLbxXnV1%UIH|wOk4SW#1 zv)bu?uy%5pSK9r=8|=EAh?t;su=q2qMrt&S(J?&3K7h;Mt%&18&ru)j{4Vnmu9Z_LBhaP8Ray%l+65Yf zBnteP1HZtgZFc=DCtT-a58zt(J{{nFW?It}{_%EA>A0iSYbV6_J*%CTV;V%Miria%Gw_xK~(*>L1yX-H7UqcWH{iBe@lC|z+fMmpl;TEUr{=JfpYd$p2@K53F5z) z);K0lo5O`=b*H162qVq)uV*MzDMyMjjeqjhUx#$Hdkf!#OIm#qCq%M$G`}$N=Ir`4 zgzGu8H!n)U@1p)_uY9M4i^o@^vo7t%E0d2mM+>??)L4}>^C#)cKpoQ8D%97G(h0Yv zo%BxS?7>#B>nG#8C*3Ss)ji>xEYi0mZlCfi=g0L&gXq3BF#}Ui9&vE~^=725*JqkV z8j%=n&h)dbb9!&lg_Q9?y4h?>zs@D+8bH6!XxsPej|SG7M_EIytK?A^ zbYbCgDO}s#mTRhF%_LcsA74)p$uOaYr6dxnJ!G~N#*X>IHs#oV0@FS_GrJOFuehdb z@C~8&oX)E0=DjoBZ1>vK@65IB1Hxt#-yj?0Q5T(DzYk{Pcs$tf9n&xGvxxdwd<4m* zvQX3Y^e+-onmANxE1(MXlLFbeO1zr2sy)mfB%JhgnOi~;oG!p;?9&(+dc`#za^N-A zc!D!OcN(*_?-;E0QCvAAJNV$}>7aQBa`SsM}IY{iPTGzqktzugi~b zC*;H@k~AX@QL`Krj$Pb}m`kbk?323oaSwus(q#9db0AVVO{#CP!d`qA6vreu+3uk@ zV0eiPxRXukv!x6BCyiu7K_;D%8QXytq3#wgk9U+0%0{XR^!zGkc!j}YTY8Du6UwX3 zaX`35wue_6Cn3<_rEB(H$C`yxDZ3RzZ>UKH zVt3+%o*!IDtc&S62;XTGS69y79-xerNULQ4C+2ZiW?VZn7VeIzJIDzaa#r2L6zbn$ z(%#AE@{G9TAW!@C)ho>y*nJ}^f^=-q*za4sxGV2zJ(m;`3aRTM!;1pr!gH-m7XP=k zby_(xP#i?z!LN4WB=VV7J62vzS(8TIRz_~zH=|M~C)S_$`*7yKlW*5k8FeQwUmi0L zi+{h2_&0PFSf0@@WH&)i67`xoFz%J+a`LFuueJR~>@>;LOWYM~8&FUwQ8*ZClt>so zdcZhPYa4r~P2n*;MIqlAhPrcZ@Nh>R#YB0zleVa?PmqzK?!Fd$jObT?Of*sJR~RZc2TnaLWwt~ zJ?PL@CeIeA-!4&JQuA2)1EY&v~arCKV@A{sT1x+s5=#qV4U%EvnKwH&a0|z5B4eaM-#$b?Jk@|) zGT<3*@`00%z&)f)V+f<2Ez-yodMnD=9NDZgG98P=*_vJHsgO^ORn2?Zkr@}{wA9Co zq1cN0VIC60F#zt)gP*4iv5)q1J=1zb3LPN zeEU-tt}Ow@8pE=4((gYv^q!yw460-x2Ni+hIRq0-Y{@BMGG2WeX?9?Wj&MC z+{RXH1RIzxKL4Uq*-y%Qs+Oh_Ff#KAl@FgY`B4D)qbaZJ61!5- z?3JVkpCP5R7rU+kgO{>bt>3*|H1cRM6We)7-7;XcTZq!q>|FI&$s;9Gj*lrC0Qrg1m zZA#I1%{}tEjubmfz#v{0HEk7mT8S0&9HA!V-d<10HTU|6z*lit;0d!*|;mF6i#v|Q8L(&_VDg}Y+nmXPV4wIQc#30CyxTt7Uz%7>2D zkY~&QZskYU<#io_(Ca?Yb!84Qpfmi4$w-sOd!_YkEogH+MF>5<&aX2;ArtTwcItFt zP;OhAZs8~gr3oLw33;UYI{mm zU&No#QTdtYnWm<;J$^E~EsiMTM;qLY5+QWI+R{AnwxxZ=K`jDtv%{Hq+|1LIJ&d8VmfNFWI6E{7*Chm%IB+!r z;YnA1YtvWcG}jL~cZcp6?t70#G6Q5$uOEU zd7e0V!*xboI^MOO@BR2*h?W&lgCpcy+;q(D`{5CoYxu4*cs9X&XqXT|&`p5l_As$m zyQaBc85ySymn-afmr5KKedI^(3CfYqnYYU0^>ou=zS*q&YW69$?O~v(;I$?{>L2ex zR^T1zyAt3gkARqm`QGNf)WOD^@0;uSi0k=SQ@Un_GpF`BOqe9J8R2ohDbY%^e)n3R zGF5=aW57%SCpljaC;^!C5nwQmbgbu1zNv6cX}WD?WZ&|uHgU+0{4fCXCt^2S;-**Y z2TC`|s~BdZS@{($Q?FC7NE27FdOPl<%kP8hnL^EbJ(o45 zYgSNV6SQI&*4UKSM@!ce`*gZcV>kdOe$H{i{J`3IYh&sXd)YQ|-aC|$`B0>GCW1uO z!?b1DQ~3GUQ2h`n-E=8qZ&!Y$eYAQV3_$N#SMsAFlOH8{-KA!uN$Yh&|Bke7lS5SQ zFm-^%#1_6iCsW>j*<4R35$khR&#g@Wfd~4H`$pFwQNJ${$!zH|v4`uP4PHIX$iieW zPvc=SX=Jd6QO+JxM#e*t7F}xS0WP=e=SJ&|;86kif%2g?5W{*iUA< zx$1{jLtbmNO>48=nXNedaN+&G*!Nf<1l%r_Y2=w>ZwM0029%K$IaxFAJFQ&( z+-R%Sc&k9J(+`&qtr6g%?zt$8k{|s@6*9_?-qJnYq(8dxj+(nt3!{`L*m=+Jv81;L zqr7U%8r58Cdp+0j?NH$?DS5I0D;VCuo1W#J_-rQjjcW>=UmBP!0Fxm%*pfzeJkOoV z$R)lxamW&5IX6OpkKkL?Q(mW=eqZ@e8^GY($TM<_;Eq6zgWOnNHwqGNbgp_7ykv3b z-J=7-u^sL8TysaezMiwJXZsasM!-++a0vV~+nGAXGk|3?v7c%{$?{86W+y*5f^TaO zS5eO1sf=uJ&2BYMjEf_`USeay>+sF`K~o#ShU0emP-$CEg$OR zP^zpnk8avH@di-*;B?UPx*c!Na|CeOF$OM-89EU~M*Xo7?RmD1^^CE`@jBH9)1$Hlq!^n|#V~C8qOX;SY zb816beWQF>8||qZV~0K~{pF;%0`cXZJ_+IgIA!#ZrxC!YZ{$^iZ&}YQ)_kN`W42=N zyIGx>;N}Ve?Hu1TeQ1ePJ0W!C*avs{UFcqv7>xwKbldI){=u}so#_8 zl+xfN#r*r+8RF{*T8z5tE`8OJ<|aL(iX;l5-&hEJ5v}*N=4oxvnrcy6=qk}G`=lh99WNqa6Y3GDg zglIRY483Y;IT>XNGm+~CCc(mlS($D(Sj1kfj7-a?5wnGFl{w&<2-%W|Zk*Rh!{u>DOeEx;_=e=JjsaXO1k#;ZZ$O6(iVl#%6H=w zdJNxMe>$U(loRgQkH~LKv~r5Rqon8gl+&m=hOvP>ZFT0c?G;AGQ$KPa&Jd=J030#5 zkJqTy4>!pSjpet?@>U&sr{pGu;fwtr@2Pre>Vi z*d28%SV^)SI0y*5Ysd`}Oo;wkIc?nK(xt#djpzb@yYvlDqvbD0j zEgueM;8P|}d$2cB>n-_4O{njlDo*we_Q<;$+ltwYC&x2pgNP&P%zHFWVnk6f;SH1d zggh;uI(2YN_}lu`1Th=VfVdwy^6Qv8w)o?RF})Km_@MhP)oG745_5Kf7U!I)xVEUa zwW-?mJjK#kf@ToH6Ys8DGo0jMZ1Cbk$J{Nx-(L^NXRF;=%v`0#ho@}@yUXmqEWOcF zKlF@qumjWXdBCK5#vFE1EZR9~-0axnIr!G{!j-Uq2oEEPphkF(5?8|0j%~_5__gRJoOzQ`E$9v%i^)=SB z+@My@J_!u>a%ValfztuRIkV^Zb1b`RwhNRy)%@9P{A!=#;cpk{% z7jbfT=jCZ?l%pL~y39Q|j-iej+yG;|)-J_&?C3&iS{NgruDI}>9Uh<4<`A__v?C3) zDGL2_bMfKpC`ztaK1myjY>g&Ae2ms;Is3DxrfS}>K2w^u)oQ*l;rnn^{QDcTcgcer zlpM~}CdjHbKUTG`XPXw=0L=CF87nBIPx2pbj~|J;*7>U{QW*mHzS@CTezham|B;Q; z%c7okNAt7^LhnV(r)a8j>a;meNfl4vHsBNGwpWlG{W?vWcCa1ieEy6k#A7{-jgd0y zAEz$AE^|*w{1U&dr$A9=t zndOD}KKDrEq}I|zhmXs|Z#`Hl=7rAx1Nh}_^Rv!dUQomb(hm!{r|11i%XiXL^NC&4 z?UB|Njb{J-_81;DN28|hL2255ZL=LdT3!|ozn+#6HDmuW_mrn6nP#-7Z=*J?C*k?O z$v}TpqZeo|B+E3#59p_F95|;<74iSGmZff5Gde7!sq65~iR>2sA_M(NO=PW6j52D* z((=9GjY-Sjgl}q@W;DJS%V_GROXC63^1skRzq4uo6qL9yzBXt|A7l{$sK0gfKuR*n zYEDp+z*}2VZeq1*|56M6(x&oDPs^8rZa{py`tto{s~41JH0B}v-h#y_GE#o>w^``7 zH_x)x6TOL>w1q{0H7w)G+5Zca7LecAd! zdh$2ACtqkrTTR{M4weO^X+MXhY5%qB8p!^ltab1&vw)c-a(e&eUghjRz6DlahIecP zQt^bhZLpj@>vsOb_%CQlGdm(Xsl&gNqYm(@NzfIA_oywql(YX&ny4ZtBzwU#pqz!C z0z!O9e)(U!s0EV!)vDI8eo9(cNh0r2ME-wh9``@JUmbRQ$Si~yM>|D?`)z63f9<-) zvcI0)6R+PQ%V)h)7*s_5e`o>2n-O2e{|js(r8&BwaOapLlgI;#pMg4yt=U7ASojIAw}drxOwv59<&{$ zfhgmwHKR$CF+u!eM3eDfyQsCqg+UTIel^~Sozq_vet}#96_pa+;T&n&f9$QqUP)ZIwtOMIG~9S6Rz&_B zQbhifn_m-O_Nc0B+;>uB+$T-@ubtjnn#katc=3!Pau`%Z{-Ybc6s-if)uu%Qg~yBl zkD{Xk(w+a>m91F5nj~^S_mmd)FY`{d9EC`5evuMM(>m}2{hEyb+SRS%p7iRG`xfEs zzYO0UqPj+!)`xBF?0@ZhTI53f*6M*G@?$2!SOoY_&;8pPJ8)BmCof<%N7Ea_j3#5J zbmzZzP4gtZO0ug;5_we-IlegPFLB`B8GIXUS})pFBE9TIlX0Kw(Z6|SB`KfO6Cs*B+cMMo*XF}zW^6EzwC!TX0Bx+WL1aJa)yFpsCuvUs)V z+bazJhc}1fw5TrbSew@8(#s-EyRDu5uYF5%=$jJK(}#Fi5;=sbBJ!M~?>kZH7l!|{ zTPCVYFP~0uXX|Ku2fCi}58glDM0%B1&w;QYO2)FTFu$&oqHn)2{2$${sIG|GGt@Kb z<(Wkp|Ka=Rn`r(fOw;N)f_JWnEJxGv<2^q-`EP0B0iKztE|=d?bCg9H(;EnqDC1x9 zhSy)+w5D~Y4^qSTVMXLWu$7{^TGKuX>XLM45@n2FJ!Pjg1Hy^zi>6_J;t zipYOlD@1hzi|QuD*!0^>n)Vvii+^prSoCY*Pi_``^S3RvU?qx(wgx&se+j zr)KxBtu|5?E_JinGyUyrC!)GFvG3#x&eHDu*G_M=c%^POc<_J8rPlneFeUCsv^)Q` z&c@2w#UUlS@PGJ@>aO(dKP3NYO`KEdno{ij>uV>sDysXh{qD9Vi42n8e>uE=r8e!q k*4x&Vv;XCm|Jvd9KS1|7CVK!~Q2+n{07*qoM6N<$f_%t`e*gdg literal 994 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 diff --git a/public/images/pokemon/back/shiny/769.json b/public/images/pokemon/back/shiny/769.json index 15ba07dd305..f786bd9e384 100644 --- a/public/images/pokemon/back/shiny/769.json +++ b/public/images/pokemon/back/shiny/769.json @@ -1,41 +1,423 @@ -{ - "textures": [ - { - "image": "769.png", - "format": "RGBA8888", - "size": { - "w": 54, - "h": 54 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 54, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 54, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 54, - "h": 46 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5b11631172a11bf407d37e79923fb804:8c939d90f16d785e49b25d082399edd3:ba2e5a01352778ce94d84746368de8fc$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 330 + }, + { + "filename": "0012.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 330 + }, + { + "filename": "0022.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 162, "y": 0, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 55, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 213, "y": 93, "w": 62, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 10, "w": 62, "h": 39 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 73, "y": 94, "w": 71, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 25, "w": 71, "h": 26 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 94, "w": 73, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 26, "w": 73, "h": 26 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 770 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 94, "w": 73, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 26, "w": 73, "h": 26 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 73, "y": 94, "w": 71, "h": 26 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 25, "w": 71, "h": 26 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 213, "y": 93, "w": 62, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 10, "w": 62, "h": 39 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 162, "y": 0, "w": 55, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 55, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 0, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 217, "y": 0, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 162, "y": 46, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 330 + }, + { + "filename": "0037.png", + "frame": { "x": 215, "y": 47, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 54, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 53, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 159, "y": 93, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 159, "y": 93, "w": 54, "h": 46 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 54, "h": 46 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 108, "y": 0, "w": 54, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 54, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 0, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 106, "y": 47, "w": 53, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 53, "h": 47 }, + "sourceSize": { "w": 73, "h": 52 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "769.png", + "format": "I8", + "size": { "w": 275, "h": 139 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/back/shiny/769.png b/public/images/pokemon/back/shiny/769.png index 9456d8a5d2a575b2e9e2b4135681619a64ae1ad5..e12708648b0333e2172534c99bb9d174499b5345 100644 GIT binary patch literal 2133 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 yBWDL8B%FPIsie`)fi? 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 delta 395 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 literal 799 zcmV+)1K|9LP)y%x{SHjl4?Jw1Jnj7v@QMKT6M^C1AYU zxu`6qdxUJ@;Ct5%oKtt@uhFwq6qUudzg>9!#5P%wVE0(VcV+p(bw&=Dc@44!}9&dmg`eujAVBeoCQReU2w|yy%6kX9x6ahNq}$K1F=F{NWuKK zUeZ!aK(smQtj3avfo5UtfGXMpnZk1L(I%7uQWy5qGz}#(<|VV56atG3P;SEhXS1Ln zMSx@$vDMnwmb3{!g~s8Y9($)$LfpqJ+#yOQNx!Z@@nL)X)mR$PkmJ$iImxlU(D(b%yaLSoEX%gNI=DFI9xk5x>`d;7-tD~3l8#;Q+&Y>Q#&!l-UvXV z8me05*BHU#A-!O03I!+t$w+Dq969IwpBzH33xN|w08P8I_~W<<5djKL*|--a(4JCKY%kH9;YpAx5aByVjcaxTLpc5O&@~)QWon!^;58lgK!){qpI$eRApd!e dIp&yS{s9oSv!7|j|8W2S002ovPDHLkV1fh$b}aw^ diff --git a/public/images/pokemon/back/shiny/902-female.json b/public/images/pokemon/back/shiny/902-female.json index e992404f37c..7b8355ef84d 100644 --- a/public/images/pokemon/back/shiny/902-female.json +++ b/public/images/pokemon/back/shiny/902-female.json @@ -1,41 +1,828 @@ -{ - "textures": [ - { - "image": "902-female.png", - "format": "RGBA8888", - "size": { - "w": 93, - "h": 93 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 93, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 93, - "h": 51 - }, - "frame": { - "x": 0, - "y": 0, - "w": 93, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9b7366ec94c9143ff1591f296b453b43:4b1bcaf81ee72fa92aaa6604f851862c:16072dc598107c41afadd9df4d7c27da$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 191, "y": 223, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 94, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 557, "y": 266, "w": 89, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 17, "w": 89, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 373, "y": 315, "w": 84, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 19, "w": 84, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 655, "y": 61, "w": 79, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 21, "w": 79, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 85, "y": 317, "w": 81, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 23, "w": 81, "h": 49 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 275, "w": 85, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 25, "w": 85, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 182, "y": 274, "w": 87, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 27, "w": 87, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 384, "y": 264, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 29, "w": 91, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 96, "y": 215, "w": 95, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 29, "w": 95, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 121, "w": 98, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 27, "w": 98, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 69, "w": 101, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 101, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 551, "y": 61, "w": 104, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 25, "w": 104, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 101, "y": 111, "w": 102, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 23, "w": 102, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 551, "y": 112, "w": 99, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 20, "w": 99, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 193, "y": 172, "w": 97, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 19, "w": 97, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 191, "y": 223, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 94, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 557, "y": 266, "w": 89, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 17, "w": 89, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 373, "y": 315, "w": 84, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 19, "w": 84, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 655, "y": 61, "w": 79, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 21, "w": 79, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 85, "y": 317, "w": 81, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 23, "w": 81, "h": 49 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 275, "w": 85, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 25, "w": 85, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 182, "y": 274, "w": 87, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 27, "w": 87, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 384, "y": 264, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 29, "w": 91, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 96, "y": 215, "w": 95, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 29, "w": 95, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 121, "w": 98, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 27, "w": 98, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 0, "y": 69, "w": 101, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 101, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 551, "y": 61, "w": 104, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 25, "w": 104, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 101, "y": 111, "w": 102, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 23, "w": 102, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 551, "y": 112, "w": 99, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 20, "w": 99, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 193, "y": 172, "w": 97, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 19, "w": 97, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 191, "y": 223, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 94, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 557, "y": 266, "w": 89, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 17, "w": 89, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 373, "y": 315, "w": 84, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 19, "w": 84, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 655, "y": 61, "w": 79, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 21, "w": 79, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 85, "y": 317, "w": 81, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 23, "w": 81, "h": 49 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 275, "w": 85, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 25, "w": 85, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 182, "y": 274, "w": 87, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 27, "w": 87, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 384, "y": 264, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 29, "w": 91, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 96, "y": 215, "w": 95, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 29, "w": 95, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 121, "w": 98, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 27, "w": 98, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 0, "y": 69, "w": 101, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 101, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 551, "y": 61, "w": 104, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 25, "w": 104, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 101, "y": 111, "w": 102, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 23, "w": 102, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 551, "y": 112, "w": 99, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 20, "w": 99, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 193, "y": 172, "w": 97, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 19, "w": 97, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 191, "y": 223, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 94, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 557, "y": 266, "w": 89, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 17, "w": 89, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 373, "y": 315, "w": 84, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 19, "w": 84, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 655, "y": 61, "w": 79, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 21, "w": 79, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 85, "y": 317, "w": 81, "h": 49 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 23, "w": 81, "h": 49 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 0, "y": 275, "w": 85, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 25, "w": 85, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 182, "y": 274, "w": 87, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 19, "y": 27, "w": 87, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 384, "y": 264, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 29, "w": 91, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 96, "y": 215, "w": 95, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 29, "w": 95, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 121, "w": 98, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 27, "w": 98, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 0, "y": 69, "w": 101, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 101, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 551, "y": 61, "w": 104, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 25, "w": 104, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 101, "y": 111, "w": 102, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 23, "w": 102, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 551, "y": 112, "w": 99, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 20, "w": 99, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 193, "y": 172, "w": 97, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 19, "w": 97, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 191, "y": 223, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 94, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 378, "y": 113, "w": 100, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 16, "w": 100, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 187, "y": 60, "w": 105, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 15, "w": 105, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 594, "y": 164, "w": 97, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 12, "w": 97, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 285, "y": 270, "w": 88, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 9, "w": 88, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 92, "y": 266, "w": 90, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 6, "w": 90, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 224, "w": 92, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 5, "w": 92, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 290, "y": 219, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 94, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 98, "y": 162, "w": 95, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 95, "h": 53 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 284, "y": 0, "w": 94, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 1, "w": 94, "h": 60 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 0, "y": 0, "w": 92, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 0, "w": 92, "h": 69 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 378, "y": 0, "w": 84, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 2, "w": 84, "h": 67 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 652, "y": 0, "w": 77, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 35, "y": 9, "w": 77, "h": 61 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 292, "y": 60, "w": 86, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 8, "w": 86, "h": 62 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 92, "y": 0, "w": 95, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 4, "w": 95, "h": 66 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 564, "y": 0, "w": 88, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 9, "w": 88, "h": 61 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 475, "y": 264, "w": 82, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 38, "y": 15, "w": 82, "h": 56 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 462, "y": 53, "w": 89, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 32, "y": 11, "w": 89, "h": 60 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 187, "y": 0, "w": 97, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 25, "y": 12, "w": 97, "h": 59 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 304, "y": 164, "w": 91, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 16, "w": 91, "h": 55 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 650, "y": 112, "w": 83, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 37, "y": 17, "w": 83, "h": 52 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 646, "y": 266, "w": 89, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 18, "w": 89, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 0, "y": 173, "w": 96, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 17, "w": 96, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 462, "y": 0, "w": 102, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 16, "w": 102, "h": 53 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 203, "y": 122, "w": 101, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 19, "w": 101, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 395, "y": 164, "w": 100, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 100, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 495, "y": 164, "w": 99, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 18, "w": 99, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 395, "y": 214, "w": 97, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 18, "w": 97, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 492, "y": 214, "w": 97, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 18, "w": 97, "h": 50 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 589, "y": 215, "w": 95, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 17, "w": 95, "h": 51 }, + "sourceSize": { "w": 122, "h": 80 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "902-female.png", + "format": "I8", + "size": { "w": 735, "h": 366 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/back/shiny/902-female.png b/public/images/pokemon/back/shiny/902-female.png index fd7cb37f63da3757cdc4060ef81244d9eb4b03e5..6c849fa949f1700e847b53b44ad932999304efbe 100644 GIT binary patch literal 31589 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 literal 988 zcmV<210(#2P)wL z=e*}!u$}*A!&wE-**;uBcW+nq-SO=zWyVKO`q6!vbNDAu`85vjefN(sm|ftjM<0*b zRQ}84C|Tr>{+#-ahzmc8#80B=DW5@zQXIO_nGu*>p#JcHY{hpJn^WlEH}RKmpfd5d zFvvisjE(q<8r3hVMik;kJ_Cy%BMU5QH2SCTeWEaC&&|Y_KBYh3>010+)F<-X#%0Vx z#!<550qQyY8m`}`0ZNtFsPjwmcXPfzIiozkfXUx>~I z8hRiY0HQMS3Qu1Pt94OkboU{@yJjZlK3Oj41;Rm*c-y4VHBLn>zYFX6WWts+_!$O( z&#=E#iBFwo>f&W8q7a$<8aBfxYb_I-?w2l?Gnj4X+lY-br6%8xi~h1f${BooU&y5A z&m5aaYomT&?o$xM-wP_(?jK~_U=*72VKT8PrTxmcoN5VlrOxN57tpMK%|y6*<;xRj z9SGQ>VS2&f>dnJK@nqoBJt-Sz1Y}0n?!RLbyxZG1uO9Td^xOx52ov~B3pCutfb1#= zetJ9gT@SxBg)6^3gs*o@_bT}D&8N_LL@}V+f^qQnu<%>(d&A!wdv?aJ5x|wo6=L`p zQ21+9&a8So%Abv%mb=byN6qq!$_n4fMUgtH|>9`}z6<$5AwBYoL%qpXPV)Ti-M? zb?Yqjk0DNJCcfU)t)2Im&f!9TBT2qS4;;SK6Mwji2m94?=JClBKT)mHr`O};oW$3j zbGX<)PQXWu0QCKM{83|J_!~F#6I|uENr{rgYy3gK(OR1AsO%EPf{5Cz66%MO(ihsy z)^ir4&`H=Fi?1+B$lx!*Ete>KS+hvA(PwEu{KFIRQKCu=mizMW>)e_8Kq(}b;)<^} z3;$UhCq?m-=lU<<19$tG{>FJ#?3um`ePx#Fi=cXMF0Q*5D*Y3I2a%?Ib%L4J!L0eBy&MhQet9aM~57=Bj=CJqX z=H>tZ04yh!WB>pF5Oh*bQvm<}|NsC0|NsC0|NsC0|G-d-LjV9E07*naRCt{2eT#PE zsI8s`d4~!3qrLlfeIE+uI z|5>F!B>hAC`28udpEGhIoj(b_>&=qB@xPx@nxua~>n!qe?4^t4;aEQ-mIfLjeaK<5 z{12#);r~-grxm4tM)+k)e=-Gr4iCRG%ZD}(MSs#XpOSu=*zeC-_EQ1$*JeqdEDt^= zdHHN8xn%tF3T})o)nmjz<1gtlJ~p&QWzXpRsone^MoB$RVPZ3ng!PTM^*#PI*lj5N z);ash36=XM38%cUS8HUc|DtDaj&LpNQqsH?Rvw?S$&P=Z=mj!7y67S zDznf7GK({{m_AT)e7A*Wt&a;WWUlM?_ay4Vp^12cgRpbot;v`sh|-57FC{v%aFKn5 z6N0q2ofUP*WqyCtZ@qz=qHbM`{=dgZQlWMSvu|f#IVm4Q+=*Y%MU<|u~8ac#y>|ep3KY%*I-k$b3bQIa}glRfTXIJT1gdHXSxudYc z!y-DYT_>E-xzHH(J(6LwoT#8PNRAhkM&F`uVdQ=^8Xu8_rwVpf`Ka()!t3z>(7o{% z2zz_lr_wg(a$#hBH+43lG=P$C4|(kSNmO$?M0fU*@C^Ui5==U$Iy$#Ea62p~wg80W zhGkEqE`C>m6embmh|i*POcvcEjRb?FXQShn;q`hg0Jk^b5PN&tcRl8)>ZmO$o%lyF z7u9N!XguZZC<{mDT|Xgp+la0J9bWJ!#rx z>liSza}<~Z)qiEwp~@qEBKY`T+D<5Y8a$r&Oo1AsmE+1n5q0X-Byl$?Q^^w13X0pS zq8$j=P)9buCf4yt5Ixp!(HU&=c06kCVGkpK?mc4OLL9r6X65Y(g z0Y>t%C}NgEL*%(lM5U4-3?6N$?(Z65E%p%Yu`O zi0(Pc5a=M*t=0=cwECb1eu48C>RK{mTjH>Ltl!@b%7kXb;fRn8eNFyj;ZnMoDu!!k zz(c<_@FRVTK@y&tzzhLl7Zi5t{^Og7u}(vOu&J=BK!&{~s?Jo+pw3Va1l0JTpYUd` z&fsc{`~$}GMBGn;WHE6-k?10YgN*DQc0Oga0PCWY80VgeLom>P=Us0C<9%5ie(fyd) zObVmc2|b`oJP*V=)z={z-j-P3sGF0wK$gm;wf>QD7a`KELCyPCoeeySK5SLIY}z{b zn!8M>Vjj|C4%P-Z0ZKQUgh4N@q?7yu@{mb+ic#PB;j#&P z3S?I*Vle7sWiVLbqI~wkwlE&H(EqI1yxp!4eF-+1Py{>yyy}n zg6A>Rp%ui$Es;s(jp(VN4pcSuq85y+h9flaGHBuNDw}Y8MzOt8V>H8tZ^UkHP~QKS z)33aTVwM!0Z;m=-6uXe_>@ZawZO=FMbtwC?hn@|J))i^}RK$>1(Ypc}75SvVmiCIPgmI2@j51bY*! zh{yu-4<_WH%;Z8oYZiU7ic=@85H8rStv!un7XX~;*vuMIJyv7uCye~%pFaq@5#>Rt z973D^LWqnR_iC@77;HLsma1lAu|Ez%EYSyOR}3cv2*MnHsm*e5siUI z%G+RlPj-$aM|ZZte=**%ZPV31Y)^jFrD4aNEq$7S}RBuaG zJRg8_1v`c=*fl}SpN$t7>`V-mP}eo^uy~VAtosp&xiavz#w_ZZu#42|uTOy;SS$Vc z`udvDJw;!A*^_VUEb}IB>1-VZWM_DMofW;7c%FoFEt8zY$eYemwR@BmBR4AZe$5HI zRG3g4@RM zZQReW8+P!9L@Q9T$e1)b?yU7xSVRd&1{deDiB<-_be=e!@{4G1Ap+tKsACHO5dZv{ zh;~i0tcABsqpqVeN-O;2&#=Bd(T%tdPsHP>+)5@%RQJG?HYP2=bJ0eQGT|sy20j@{ z?U9cyow;tDs$yd7r7Obm{m$-4Cc^iEhvG*k34q?tTjsQmZC{M+*oB|G!`%$*+Nety zL@k`(KOL~b8zQx~A`p~Z$vcMMjsVz&mgh;`j{#!({76SrHuWzlYH9Fix?_Xgi>@V< zDlBr1K(NyRFHOgx#MM%q$~*Oz$+`ek?w}5JWB1Y`N}wg2I_ zKo*Xb#DtoXylj`Rv3U2E*D1%79AcBh#Vb)~(uuZgr%)%@i;6$8b%DFE!iNI?P<^*y zre+?DVihP8|HSFj4eu!0XvN5mQus;2G`kPHO0)`I#Q_=42~XViVB%26x<=z45|qR6 z=N3y4Tl3n^2kr5i&Vg;Wmde?d&hH;gl%!&l#E(4K%%=Jm*tvbo$Gnju$i`<5o2pBf zV&c$b|Hdk(TIHfFu&_hi4U1+M6c3CIx%d=dM=BY?_f{m($y-U>mX0f!cw*k)e|m+Nu|*1813P2P>5u8dvb3p9AhT zlNdu};X~L0&))yw=~LW6Go_Ni%Gz^RFAv_Gi32sLxbs`82VWFm*rm^&S_YH)P^z;+ z(PGliW?&~~<|jA#8?%W~V5jy0)IFbX;KjGedmj!DUUTCvs}|;Hmbudnt8(hV&ihGP z`MsStLbg84E^$ecShOIiV3)EbR_s=KQUgo$s1w)~&hai?z!qDXR@4mUwAkZ9qY)>; zBYv$9OpWwdwwQT_@DBOoZ!wD}F6u(zE*QbbR)jj8i$4(#p1wA>F<0g&+L?t8l3Zav zdALDp239{>KcRBe_(=qf6Yna(t}9!uK`tm^r3L2%{s(C8mm0w;8#Mtqc`JK!7WW6F zZGE_04S=yi-NV!vV&GZ7)=*lxb*I#LR|j$G^Ueyozvjcbb8nw>kI;eL){$!QIT&I{8gD{(IK!mJpryMT_JXoF(W( z)K7_nXip@5dNz=%R-X6fl}<8q;j)Fgpqo}!8T=&6MI(&za|V`d(n}@|c0(nun?XSL zg6F4#FnU=6QHMW#|K|xSUIVnUZ=2skGpVcQm060)3(MaLtH?es4|J3O%4ToLe!?2V ze4LErmh{G!Hifjfuc{zR2 za@^Mf?A8>N^MT5ofo(Er^q4j5@~iU$4Vx?g|NFrAvBF)4c%}U0jk=TpczaJ7o_V7C z&oi`2VAZ_H0p2XQeK`(|odA-`;wPkWQjPP&rgsJhH+k=CfP?xwmIGXi^=seYU68yF zphs}#snA_a)c>;y6wx)YMs&2r9k!#v4n*M#gt#0WKzfcvci>fBrS2r zZ?xghKizI6>J)QeGD02v{d@A;&zjFtsuf8QT@_z!Ry7MARITHlf-^km#l=cvQTZK@ zGcGXXLHc^nc5l0h8{~pcFueULFu|aI=eH-0o~&jIOc1m5sRQdTH@9dy<~txvPT9Dew<_9e|O`p$nUJKx99y0@=Btn z!NM%wDk~HPK~De&FS`q(^39{e`AI_GSn<%O84R;h3Ry##O<%+R_)>4#5&dj&R)Y7=t5xitiKx4Xn+aTESekl38yY~tS6xD<>I=uBbUkApsz8ev=TLrr1ytfk!p zO52IZ&b}Jp*}iJvz-L^>uSX1QvY!#pM^s{ye6F!347Gt?Ii5qE*+tjQdK;l}ZV>AL zbQ`D(RqZ8>vHA+1K#+N+V5i}(*0tQuJG}COZnB3u@%1g#nV_GybqCEso0I}|C`^2V zK2$Q`8;rZ)U>CiC0S*z5?jjsRk2lB~H8|#19cESHMl5khCMZl};*+4`D-X8yE!=L1 zxi_M=OkJ9#QJ1eNnD{*0zwr!J5q8{7+<3I*R-i*Lj|grFtfj%{wDRH9b{XKcyg66^ zE;OQM6eNTkoI_6(UTlPBx6s2M0fpR^KiFb)02R~z{eDC2cWJ8Ca|F-YZDD@6_ zuB%q(BM52+dk4?^8i&G7vf9bGNkGtTyNMZf{_3H540MZ+%c&*pPSS3pzQI}s1B)sc z=`+kVKDSTGd*W}cTA#JICGHz_P~y(P&YYrfS@Xu+&(Dvn?FRn~|K0Kq?!U|+dV5pX zu7aM@J9yq0g`emg?-ItlNdPzbZ%}T5XR`8F8T1Lw&wVrpt7jJXMZ!cHM&vMB27pjh zvjGc1ovrnslYT7+qt*7c&NZ~eO@GGJ_oh+%JihQ#Mz7a{yb@Lz{>$e&BOkMT^eUvv zRp8)xpnvOXY!8j^IXoY5lZIe*zb|$_i{=&4Jc>G!C%!Bgz9EJ)=HAjqwPfe0Q709D z?xZl8yiqsn*G29tP*-$9LnZFEZ5BA5kdKeQa9KB;WBhuwZiQ5JgIVX^!SjH^a;7Pu zd#S?Vzfm`72u3)6k@q3$4xrg6%4U7>aSBPhVL<*F4akcLp_P5bugNTsYQeA5gn`Q% z#$mcHN>?aK2P1X42(qGr?#Bn&iA(t!Pp{Z9UH?W$jr%8Rn;Mgazw(AYjGIjCV<9*@ zV0efnpwh5tevYD96g5_TJ?>80?fFLDw_j!BR9Z%({d z=1ccf+$6krdu~fZ3v@q0fimfSbgkSH3e?@@@ZkXD7FRF^Z{OA_4;++FnYd9oONpyR z=^J;$C2l<)b_)e|^74ydB#hra8cMCdy8YYpK!C15r>L_p2f*XtV}gzM{qPZuiJ^nz zLGBz>TsWRVyq;oTpJzSl;DOQszqY{+I!q}_U5R_c5_hI3l@VTU2ZKXh{(;@eQISUL z+!k;3Z?|bzdA!P~E1PQE1b268Umt>I#mU3R{F$JymVI=DLFYPqfrC9}Evsj9W_dqw zF5~3WGHr?bI9lS?qu3bex7^QeT2_v2;=|PY!Ib5#{%!Z*xuNi@oR2pZ|C)CqzcMie zJL`atBIdJDi1}keO_vbb!g3ujSq6Y^*1iVCIh%xrU(Xg^7Ie$wiV}BVgaUQ>whDSr zZg3h??{D{S6SuN&49$k3@Etys5T}SaJe2~vOC#ooBdM_vCeq;L4v`1Q1|4|7DYQQ}U^-5He`=rZ`x-!}!)FStqzb*S;VIjWey1pJWOJLn&g zR=IM1FLS(ZF~3=MQwtp(mD%K=Uk4xb#kxgNdQs5WQe*~nuA+H#Jmo^v!P$S6!zNy# z>WmsFla+@5_x}a_ zIe*)IL(Dk$`uwQRwE3X?W2l?()j(GXeMpt@5q1s@3g0=VaV9t3(*ifA`wx(IeDdP> z3di{bGfZ%=9~folaMiht8HZJ;t3dt*)NKLjU6Am<%bPfLPoEuoAv7?#SL3hX4dP#qb?I^eiC(6#eeB354z33KTO}WbIHVwu;bgG8vC|RjF5cU=l3@&ANVud z*Qsp7XkZqg@*lyQEy$z{jH}~(1#7Ku5IX6f8S=i9l7z$EwDg;( z19uxx`1>2QB2srn-MW_rhlaRb{%CHDfeK#SFXmE_u`eH*YTsj*qwJfj}TN_rcB> zB=A@8_W8pyDNh)Mt^p^3ggPO4`E0DCx?oJ(M)}dG`Cky`MyrFjb(7yf(8!`rW(cZn zxY#ZrZvb_mYsOq!3#F3@c5jXAWH_Kj`UW3F$<7|g6vp2XOz7^68KPg6${gmovB2|% z7gq_Nj&)(C3~dy>c&9IYO(I{!>OQ7Ac-Py;vVkBjXxz{vgTNmvdE`>&IP zA<&$8a1OBdO$}*&4oxB#RiJyDsQ;R)Nnr!uUdZ88Dt|5%U0m9MHH~yXK0V z-DF=XT|b#cB?x;Q;`nmy{5L@ZHNDD?Ub5F;y$z9lFeWhv$`;X)PPcGI1RQ=n7VET* ziO6pi7f_Y!(v+C0^bG0<5RJd#mK$CC&?Hhqi#ZmmN!9lTMdb}#guIqnh8FQ`&L`Mo z9ap(=)cO{?EYiA7NCjVcS73$K&>sfAEhd1kgweAN+Aj=sN|%g~hM2s<-Lgr7lm3%E z^)uWwhUU9SL1zBk0_7GVH9S|?@y$6c2S3{UELt3_<{XLqn@ZAImd zg@wxDsKV|TnY0eR`>%fVf!RvS&^c>M=f=lKkqw=rJ{f94D(v5Cb}*`qV_?D5V$H@; z*0nfNi;}lrwltcMYC~OOtwCvuMv<@kfB^j%7SB=CB05QADu&Sg?id^jQm9E?P6?I7 zZ0fV9TN{?9>MM++&NdS1yEs|H;y}XwI?rRC5Ose40Cp1oqgFXX_^3M{ZwwB57@UpV zVQWWmlti@8>? z9DVLt%1U96KY={l{iJVi68e%^k(M=>;$S7#lr`=8A_kl!a>>jDx|JEFN#-V# zTH1N7RpO_$w3Pf)?GNiNZ9Nm#Nl*&L4ryu+Wdnr=JvKd?{e4R`zCzVN-4diAfa3xV zM^QFm?#LiYdUbtlrL;lxc&uAdc=R2XfKE)01mrQ3DG#x(qJIn3d}6L@_>LJu;9O{n zU~ccV*5ZjKevShi+;&Jq_E=eKK%G4@2t~b-W^2;OuI-F0o~?q{ff6Qp!<2{5d;+m( zY?g>J73?xL5;#IsrPsB>ok8?OhDAh2K?G&kq#2ch6H|U7;r(upg_4EaCs~0?d=p7# z8+ffi=MJ^Ov~s{mD3tg-W03R>M;YI6CZA$a`FnT(bI1hsY^2gTMdO4?a)&!2SXtvS z(aAk%qk;gqZ4B&~r*aB)c%c*sG_{v1ZCpjIJSG~g3>(Lq(K(@molyO*l-@H+b}qcM z-mMI981ayV3&FPnJxPkv$=opF3`Rp9uwfI&EY-{8(p=HGE zdpk9$kmX7ym#UZ(?TZA0-*XWHT)0dkFxs)i5tiO#2aV?M`U!@DB9mZ-*1ySxE9jp*bQ`S zbd;&9x*2wcV_R)uJY^Dfcx!K}AV+qIktw{%+yuRdeZa;NVCO7BZlW3?8F5eIQX~Gi zKD9O&H>s5uI;cbMmSgS0*5u-^LDZ#0sFVJRW1Ygol%(0+$M`PkStU8QHLw)E++qF6 zCCp}BM+qS7%Jz_a$As7{)PyMf`#-pA6UYmx7~(9Em{5TuWHx&@MKeg^$}lm6_e^;l zH=I3Z6?Shc5N%^w4IwR3?&k=8leeB15S&exN{qZQommV#3c6bNj(cL$`vS59iy<5+qW9{Hjh)y^; zH=M2p%lEk?3Dax_EcZqk8Jk8fvk3&iEmTkw3kEUgqI}+(Tt(pX3b%x5FHw=zp>*l% zte!I3VpbOEp{@>2)C5pCpn9xMjO`#wd~%k=6>WpPTNRImodDI)5N<>RS?87$k8a z-G9eA;G05iSlB`-3q1CiX#;k!;Wghqyqu1$MW2wjh8=$j^UlE2!VZDlqQ9YMUHI0a zJgHIGIrsLkGudUx$#dvP+`D;Gz|E6x3yG+ViH~<)wQX-;!We2wm;||d2X;~3HAgRT zPDsFmpFW?aI8vA(jpP=U^4kdQP)EjBPsu<1Q@;T_Fd8OFLTbAr|Cw={fM=3eiEI$^ z8cFzH0)~7X|LOT}(iZ7b)DuQAYU6;>lwZcyY0$~Pu^DdRV=W2ZpHi4@xgIIsj2rAG z?13y6BL98_js5`Iw3~3c}kYGu5tsJgF)u(Tjki_cAJ?WnJBs9s{_ME*^65*Y(@ji~96llK}d3i}eG2`1Fc zLAcw5T})P{*hR#axg@u1y9I&tKGdg`ev*Lgrx@gxoP(`Qn-Fiy?XX|9V zV~ZGQcVK6@$N59sP+lS|VeCrWaabCdD*+^a`)Jgnb z`vHSY5JI_&s4xo_Su1?jeOuj@MN&}1m?f-Y7y~?eJjRK!I_8Zr3vB2ts7t9NQ`?}{ zj^<4W3R^|+mztyS@WAa4I60HWZo;la9haoOCbd@B*g(uzV&Z5V(KxkLI0fp~-niQc zA@Y(%ecmcXd6A?b)N$#X+B-)Yr5%flnY7J!4a6=kqyB!6)Td z!c2Q_@xmEH!`mD3jq>}ZnoMnj{`5VC&Hw-)07*naR7M{hkaIUIO)n}~ORstw{Y19d zxas7JYu6u`S(9qI5;AuuRba=dJCJ8#(cBZ8tSP{fWBi}*}xj`Z`^Bsc+cPbun5 zPV{tyV(?yK3?%kZbGY7#d2o_<(1!fp&`QffPAQ6+EOyJu86#Yh=AYbsNm|yV#D(1> z0+oD~w=g7hLV_NpSk3{tYR2;iMM4%&F*g-(&eUSS@WjiL(KnC=LxIDn&?Fvyn zg23<`G0sV1T?3L5LrJqk=@)8}<3Kf|I0}Ym+gj}%5m=K5Mc}PwyJygqs6#fwc47=1 z>PT%y9dJUFyn~ZO@$Pw*HMGkB$!l)eVmF+egEWObmLer-Q5{ThVK;cHT`m#VR$|+C z!MJvd0X7DwaE6{9g%PCTz$)OfFyiO?)0G3SviZ#lW5?(s5#ey=9oCjyl% zd|9E|YRM_4sG7RHnw6R&g=aZ~AYB>Kk-9^OM?tg((CtwA1y))OQ8Fm6UsK2I~JR7Rvg+SM6CBsoCorBVQwu#(~gsK z#ldy1DM^*#*KuJ(W&2*ygnh}Yi@j_0YP%J`J(%%l5Vj@S<8D90= z>gRiFuzdGwkvkM*SdO7LG9BSEkQpCs(0SISiTo<>5z9e`T0+bI##T-^xtQS=5OvHD zTh^rSm_NaVE#aM#Y zU4XC01~VgFA!ATiQ)>_3wqwrv7d$o&=8W;~BvXi*cXH!>h!D$#?I{^2Ytlz$TDOrt zD(@U(sy(E2Ga<>vrJSdn)?r*{QMuGsR5oXqJN^9LB(B6`i&H%|O-G2bO1f^tx-?FI zV^R0$Y@avxAt!&!eW(#Et+dpn_ZiPqQ?OVeD`!QkL(H&W@SFa}fWxAW>Z6xM9s2n& z9YUdTjXL_ta6jK%hlicDIn`r~?PWMhV~#CpNXm#eB+BI!aPOO%x9otvxGFGCK5hs$ z_oZCe2F$GY8*h@j^$-)9l%N0ha(77fl*)t(gSxMm+JXFhhRs}i3g;;IDm;(%^V^dU z8}y?7#WrlMPu4vR8EOL&+= z%rt+9iT#fY6;%qLx~Av`#)+=HSS<99_w(C!sR-ohH4E{iaff*@ge&5~FwIL`JWr7g zbO|8wc5>Ix1#g&0EsM5ros#qr7j|&qkVDLeV~!91%{5stit32B>Z=tq(ge|!!8C~c z>h$yLa6jJ~Cem3BOtwKuz&a$6ez`i`qnowHlNA#$7w!#acE~fvw(Z8S&ZM}79Y445 z1izDcRuo^BCG-w4k1?}&+`TAFkRcw%KJXl2+~jRPd7bI!>+w*~wb%%m1#==ZK3)RZ zdQIygrmu#3vxnad=zhv}V8^Nbp;aTA*Ojqn>Tn)tdnn0_b5@fOnbT*VY#%QFZHfO)coT| zGvh~wDe~|KO;ZQHdTd6tsWr+;XB#0J4@HF3b^LCyuNdd#8kKFRt9imf_hTAg+s_xH zQGL}w{0CSkW$5Ex{Jv@Gg?WQ!#^cqEIVBhNu&zd8i%WU3RjbCMhq|LMwi?S}{}uiG z{>)bkyms``N?908yUKP+dH{5VDI15F+V)I~#^LI6BH#Go=KsKOzqr}YADo~$#-Ee^ zz47pv8SKA5}v5-%Mk(>?a{GY>ZR zwD4Zm+`dLh!o6 zjav)13q*|BXGo%t4Zf4wu&o->alQrUe*|{Waer3T0B5eBn?lNIoMeaM_M6BQTd0eX zX<;@dLv;Uouq#M@@kY(X5Zfy3{%O>?&H9Y0_%bQCS0CD`e7-y0!zCg=X`zm@SQB=1 zMb>Ww?$)4NFGMxry^NM*bducm_XnKS={e6wRLvEgZLdy>Yo?`LUjD;$~;D9GLyTaaB0HJd6Ccm?E_%PaW%7 z!=--5Pnlo0mJ!XWffv;*LbvMpRx$1&W7I6+<41;T%4~?Bj{6cwH0CgXm}%;pb^ap! zR9x{B0;!1`ZsCfGZe0r^U7yDSO~WrEs$C)m+{zVjX4$Z4wl&C00)0o9V#PhtDWsGUvYa9oA6 z8m{9NBZIHm&OS9r4Fd)?vHF69%jdk0~`9V|OBp}8IcJGxaiZ^1yw0DQ82{t!RX zui-BE%mg9AU0Kc-J)f{+SWP^mIU0aCGDR%1U!rn4r3~MTv@}W~PU21ZS<~Cm#Hf3XBLsDabr*`?XOOSMQG&>+Y3ZQJ!h!MHr9;Ik* zJxD@Q$Q9!dTp%5Me1Iv|*EH&)skxM@B?ur&_nD%a&Vb9?z@(-|6!9D_YdMsa;-hCL z8iRr5*A_x8y497b9#_LM8Y6S>5jApHKLI;>)Kd<)E}!aSxOmye2%vI}O1}OsJ-7Ov z^xgVtHOJzx4L7|L!TU~MWmmx5%J?-IJ<>%%6(DjCH%cP!2C++$rfJoH(irT(*iVd4 zGC3kLnn%km?O1+^)s}x8iH~tbyeR|WlL!eD607tmHqQ)`j8ffk17C9;BVf01Rm6e4 z$$F`BV{48^e}z*-H$?|~$@Z6+`kF-Y5=%|_Z!kVVA}{k0{T0Vd2q;OXh%qHuN_I9qcicJ|dnqMAfw-U#sGH!;;~ z-=+I%VMlf%9~uSqnSt4VHQdrQ-zpMc3S$(akEjx*$Yz41W7jhd4L%H5%(2O8njcF{ zSN1+|;IooT!#Pinxtq_qY^|$XRn6h1SU0AC#u6fFjycBJIl^gO!y`53Ko8m@k%y%a zY52-nR6!?s%}m0+GZ9S>k0^0CGWTMIIx==FxZsd3V`W;dF&4DBQ5WH5J;b$&jS;$A zSc?)(yf)naoX1Tf*{@80MI7QeR@+`7sZnDJ(LeG*m8-eD`w)%%3ZhL5H$x&16Ryfv zoC?OPRbum6oJzp_p9WrH(5kz@{;Vr9Ei{Pn@o&n`6E-uw#-IrRB=EZa=S0u*o(L-^tfQwlSj^!44e# z!Q#s7>rdsuRuV#2=~L0Q7IT<5R3L%@5zQ2o)C$-EVn^3u*k$EmH2}Qp_Oj58LANo)DPuI(OebYn+a*XkF|-PI^^jyHQ?9JB z(Q#+qH)daF9_(iVCJwP`f@G+3aQZ8zaB=8vr&yUp*i5kkk(O>;@|`T3z2x0X3T)fL zy+JWYA}^l_?$BflvhTilG|yxbRF5C{KyIW!yur50u3=bc`Jy4dKmG<3knaZLcKNjq zRE6WAi8eoCnleaK+Xa>c_I29|ct&D8$p1ET*zT{If}48B?~at3=Gfy7L|W~55tT^3 zQP#-WaWTsbiM);;J3CKO*y_ogqiGdZ>+4}Bm$#(4b9@WB@_UpIEJB$yjX{Hrzs|xKa_H zV+GHVZ0Dk-Zf}mx6x`Fp6t8uINsE2GAMa|^&5_94$qMbeb8y7N&uO85(WB1O+qk2h zq4^C$zE13qy#9M8xNy8&GYm;{!&TvNxA|GEDHE%k%oX7nEpA;zM6J07=CD)Pp8maG z{V8)UA=~Tn+Ka7xa`aknc+Phn8J*p7>FJcHH$pVF-js&;!~>Wn_W_ibsC3= z$`3sUi^qc_kY1+VC-^2a>tHI*&;IPz} z#HZY#zD!C7*W%^+#p?=#jXd&4W4jte*rN@1h=p`{y^4^|QzSbBP7!vQ4ueFtu-LK& zs~Or4yNnjH_lRTNwo*0=M9~?7JDa%cYD^mczytP+Ssn5;eMwMya#M^3YlY(SXV+~Yl`RY6cS5=`Nq=fB+WMk>Ly6!?Y2HBhb23O zqOPKU|I7pSu6jaHb9)ukmlk!7oG|B{-$7l>j|w?8E$Fb=`_Ptk8txmjtKFWvb3nk< zIW!P85J6LX$rSIFeqf5lnOw^nMKe&kUnt5=eE zTNbz*a=&HHStfiGVy?_63{SCt>)PhGru;_dvY6hdwOx0tLg|3N-qTf<(LH z{z9_*qTwExq?)5-k#0_LmnrtGp&xr+ghw9tAO5VSI7TARU7p#-<`k)X(h0?5Ze?#* zkb~{07ut-gOhQ-@KH~5EUZ`6HcJ$ptPZQI+7dI#Te`? z=w3+2?jV6g=fM429ahbl%ZWWNY_qn#Gdivl((W@x&>>_4? z?Z@L`XSk`R8FR#?ZtGL%ivGrRg(ao(1%!_mD5V9FuLN$vBTpdVf1U;)(MW%-ISlH` zo_^dw&7y``@if~NePS@>Jq;j(!~g$94jY~Q)fm`uJNk9{ zB{cF_!!2`^fv7VDJ=VG1kN5Nz6EcmNp*pNOvIixwjdx-xaviPpiSbb4?L}Lne`NGp zpH~PK{rY>{mNh?W~i-1 z@h-V%PHh$y{*5(me2kIK8}{|uoa3Jzc$vLySiqM11DK%cpmDu?hUMi;>FYV76XQ1;?vG>Q7aF)~g1SoZ4a;`!^F%6~X_41WxgYz#pSm=oL|CxZveR3u zn+kq-{6@q5+fDti7_?qgXP@~4>&aGO!JsbE7rEhIh^Xvm2X$pA71?_CN{jRn{BTkhwzkb&ErF9G?(>y)()8{QK;vj|}@+I4WE*+Jqb88ZlTdWmzS zw_r0%0(^(hx)E{k^$6;yOEx#N^02W^NhXjq^#df--4Zr#J`e)$-H8x8CjqfdTTXAU zOrowo8SY6#0ZtyDr1f5y1$z>85!p%%YZQMllt4lE$=F+A22dBjkuLtb#57%C092hhTt#YOk<5N}{9O>#3kB6N(^YDl-%ATD|e^(Jc zmif<84F%K5HCyq@ufS5W^*c1a!@X#Xd7#2%_pV|g_> z)1m25qB3EA9G)e*`}PUch8N97I)>dPsC&nSNb57OBXS4YE4t;-mzNWmSeUjv8932COQ)wj zo~$KG?`hHUhNY$h6+hmYiE7j)(XEvCuoQ~g8cWmR^aR1^8*ix>P$cE0Liv2fHqP{i zInYL=(^b8~HWpbp$wp!&%HJ1t6L|;|gm%(ZQ-gaIiwMD{98rYma{1KLqS_unxuby5 zvj7@Eo1q6$#X`9ITgxG>#$b&q$=tmgiQx`O-aV5%r>8@Oqj0>|m(^QpVM7PwX(e~1 zuY5`ezt;|=I7!amm!eLJZ>8E>C9F0(b&U|CsFPDq&)X`QZ*7F2b*joI66m*$keE>k zQVmhH%8h2K$Q0}oHce%Lsz7e_L2sF?z{vXB4s7iS?0$l(~YKm+|dW%6Nft&NU>Em>HAaUw&v8Z z+o`+oG3&q-Out2hrJv;~lGGAR9zE2RCF4H+OhEDN`!nmu`5(TvZR*Y*4V5l;sU~cD z|B14a!+X|*oe-|wnYBj-F7pr3lpPXI%vxUNdnKQMoiGi$y()uKLQ}?B2aY}j$pqXs z;U`g$zU7 z^DG80lxWHh3fDkNm`0|@i(wbFl}^@_mO&aB#o3o8Q$12Lep_bnYJxR-Fr*{w(a}(q zS#OcK5P;=Qr7ik(LLD#>aWQODDZx6a(`ud1*h@Re-Y{JU8PV}YtrEU7O&P_zL$Fik zN}IkD&Ub0N%d6m?iB7zEs}vPB)6b@Q0|pDa0(Kq@hxRIBf(7%z|BF(YZEDz+GbOC4 z#Ot|)X)PlTJ0oh7`G`xxb`?x5^tO<_u_B8I{;xa~DR{~hB9-FG#qju2_?e8@gm3k!CRL(ZKMYh;)4v-$0KV z+U7)yCdwaAjdkxYhzV!q`Xx3{K|eDr=PquqHiuXJr9>d=F$eFoaHx|%8n7dpvh=)1 z4z=4fWpeE~Q#{DG{9wn2QM~+xad+kYvF%Phl3)Atp~yN66`A&6vOa-|l&yRT`;O{Q z0R!SL?0!Uouf^LU3{I6J2b=wODshS1w((;3;T&G90k=3v$3#GfXvvEi+P8d9corOl zGRkngRy<`npx&b<_)VHJF;G|-dcF&iEc;{zdCpYB>JN@?qwWHPl&&dLehn3P%v;yQ z0?&}Ds2>B@E_1*&UrY2U;DCJYXQk zCnes9J?7B0QK4cgGel)8@|59?coFrui%#nv$E{w3uaIW%adFh7SU6^Y1EEVfM*EHW zS_cTmgw!fqfn7PrK)Gp<=8_p znk+^~we%z9|aV5rT=sJq{DAR@2<^#Y!FZPS#Q zThE2*4q5kdElH@83vHk9uk&FzQPk&qS}r(6F}-xr)g)J7+IY8`NHm)3-2qfRMR^$D z!0@~eMF^#-Zgqc@KMoTH$L|$im+8Q+K_kz^?knY~-J;8EN{^{5|CLex{U^Lifq%E| z)06>*=<5gZ8{OdsQKa0$>`n5SXC{Z5ynw9!HH6BB-b>o`z4IXxi3Up*8-)C8JRBnm zFs$Ul;9);Q5kku2UH{nLo{UyIzqI>Q8ZJr5r$;+t^TubpQ$0v8w>(1CdyRrY3ySfNq@{n z--_74FbC4rQL!Eq22z8;CKXsW>iUtkTmYs1{I zbS=N!*c=>{kwJBnrtCRHQ&u5bv$p|VQo6_dQqUXI**^Qy_eR*F*tc&9tDM|7F=dXQjXgsNRcR{ z{i3T{k6uQ83+Z-mK~HJQh`jmv9Jz!vs9*y-37Up@&&0Zj9r+b}kCtaiw@Qra&WAYH zLrT(IAL7obaS$^4qH&5ag>tVq!LY``2$AekwEH8QChN*w!r<-nWag>kwx^M=CxD{s zHZTFtV~NUMEuu2R)H_L2W*N{LU`}mn+ZaadGqg6dRf}vD=C{CAm}uhyQLyJjyK^{Z zSVvlJXK3!#5Ex3HPR!9tFcJ{W9jo4@65p99N_HsXb_~hT$lsgXum>249Z{L6&!Bt% z_#jQ0rQW-hakOclL+bZtcU$%Hje2qcg7k3}=1^9uPM`{2^bWndTkHVp3{hEwr`jZt zdZODPVQ}u0c{LihgLsf%ikkpRyc~-rx6RVcR9u1?b;oJSSTLkn8}E{?LF}`R?!(}! z1a!?teJ?Am``OQ+j)`HDokM-N2E&RK^3Y;~YtW=>si}|4iJ&Gz!r=e5EAfz|S}<{2 zt>uW!wyPx!z7b*Ye>g{J6L`a-D;&Oe(kuuU2on?Ks7{HG z&8C3Ss2j7`*GmZMS^MYh1NURwow~t>_?>Fg*h8r@asXAHK-~fhEYMJZA@9{JdvwXk zcq^9i^~GkrOHFhet;9{>*3^({4+0`=TXdZY6D6xKtdeg5Db_bPkJ)!fLImZ4**5(5 zp-b#-qs|0GmHQUwLo1#S4Jy=%L1L}Dp^sKDykpREG(xy?$jtLa&U}n8IG9i;w(>Oc z47xl6PjH~>YAnVXLfDlTsrK^W%`7{fgPn4Ay%54i`_ByeUJ1d zQ^>dRoia4|^C!(%JLkkSyBp8Z`P;iS^Ib-6EmH5Gl zJOR5-Vx$EE-G%%1K**gJ6zT&RD-|D@#nbz+Kgft45mg*I7j>H<$cR%goHXs@^-^Nx zM?Dc^;&>$LFx5M~!_fP$Gvjd;hP{}IVpRB)KaIM_R#IBZh<9QRL_=s3ub%}2i+TCu z)kitcQW6FqnnEV&5Y=D#aZ(icArLeuM#FD_&Nk`|L`eEO7j|D34UaB;^jXl=6t_LX z;8RoVqV7WW>CYZwG~gUAt`0iGHR_?|xdA^EegYHaVL&4WEhoW1LQ2x(+MAc*&w6); z@u0T@!T(0y>YW~NR`_9xug0u~#QT%eI6$eNB7giz zM1PFX2%erJ|M7R2u&Y$pO!nt;eW+IU;nw_LvLB64 zuQ7Z)GyOt5U6j%7a|;Os?7tK2_QxgJ?{_MdBfPEC<5J-@Q5o9lFejsz-i#Oc8UZt5 z|9#YbG@w5|iaIgnCo@yHa1Hb+_ZFw=6-=X%2$X8r3IF;fz&01-hC)E9uk-R)2MtZ1lQuNhpeu|M0SxD=U>od{~SFpQXUY zHMIZkE&sYm>S@DcEJzuLK!MDXO?L8ve@`a3n7H}exFi&zgVi}>IZ~-~?(U>ZmH0cy zfo*7yr*#)?n`^k(b8sR{k4K9Vg4=b73KVbiZWE!w)hjZAm`#YAPcrD99oHGOnKXcB zd)~EL4jiNMl`W2XeJ(^yuixqT_a?KqKOYJ8>C&Fq*Ul4)6Wg1>`0 zZ_tydD`Gmz_hD#shMN93Bf{hj*_`PRF}{XHV(Fn8znS}rsiJ--OrU9!T~g<(`1jU= z^)b8*;o9%OuGL7-8g#>slr)6NR{&un`k6Hb&KeZ!La?;Q!y%%gci&mVQZmSobHHq( zE+HvnM1}}do~{ocqyqKgS0-I!`FN=Vu7ml)g>3W?t`Cf8Ge@T)+EZcEeQlty?Ca+u zdQwwz)*$NjMLDoFL=3=gV-2BLLsZv^)2>rbQ=x(hoI}BBdSD@Gb;ReEFT7xVR2qZJ zxUjp!6yjPjm&N6-3XRMs!{v++Bn-KTKD)^H?em5;rDJ9k_OiWM*8MdY4s5Qr_+H}i zHPjxO3~@N44yUZBbXTTy+n9?dNR9|?Vdits7aonR#&JC{_6l(};4&YI_S_faP?0XglziG5;qgBccSUkBI_TyLOg5~mwT8fzFJMrhzpmmWzOJ;K2|#Fmx#H7Kohnr zl$*t-B(~roQ$mbON=F>!hW9t>T5A~foN6KrM#V~!0|kcE$UJ56R|33kz8NG!6Z*Z9 zte1&0qGVlORJPSYqS4LeY9Sto-j7Qn%gA=XpyXS%bp;g#c;%^`*sAH zj?SC*Dq)Ba4(t(20v2!y5`v;%L-b2H+7d-deQ*PO(sR7f=r9_<#D*KGOkiGa|D5BAHU%BahEr*h#kGNJs62tfnfk+87rS;-8 zB*}_Ri3VSX$by01y|aX{REq$%zkwRRF`~vILS2^%wBlrZ5-)6GD$D*SGn67)d@>R2 zQZ)gHUY+ENMr=^oH{5tW6!qMh)XbQ zz$Ne+TAni$O5IcdlqCKm{WisDvlyhuTZw8E{)h|@qL=H!PU!cX3lZ!RSH2F{Nr*;I zWLjG&$CAn(G0<@1$xs9m#e0)&k*b{Gd9WSwHlz!n7w5s&h1;~P7J7Sxqf|+i6xi%1 zw1&f;)3RA>Axs6z9%TqDiK&cgZ}<(MT-%|fT4RH(7g!&Yz*=w}IgcL?c(%ukjY=HZ z`A&x-5FZ!vUdtc7M<1QIec1sXWIw7(mH4=^SG*mL0~;9t$%pr-Q#1mZ65JI-sS2gX zc-O^${6Z8IB`M>Rn93p}B%^7A>d4XWReZp3l5SA<6kKz6yO+YdCiF|}P}yrJN{2#` zH>C1Mn+fVdf((c3)NzMBI+-)HBqZ-qU8meDA;C5wf^+SDHPl*yU4!?WqrB@xoi)-|m=_`dGZDrQfBcJKz{xA7TTpW2T6wMk` z`J+i%BMwT-MQ$UgM z^yhAXmuWv%@Ko6?;FoJg@VwPwi+&IM^X>^U3D?M)8n;t;f23S-0qA@su8!OfMbidV z_if}1Mg&zVx=IDa2>r5paKnWoE$iOmpM}L`J+@3)Ex~YIr8U)_6LT#TqlD6N;&S6Z zbu6MfcwH?iBdvemA@W8ID()MT z-?4s3C!%=(LlS}>9f!z{`JG+3CU3huE=?Jo=spSdlqt6u$L&y*p88B-$Dlj>(d|NoDOH1`WZYV1 zG%tiC-lmeaH4-_Hu#KW6(~c=Omk@iNgP}B;P&(u}vLFu#fnCJ^-5C-Mdc4fLv;~Qf zh<-1$$a>*yq2L-VSyRzc$5FTK$GuQ=zejwQm4=DzmqM_?UBQZ85P=St$BeoL_qsT6 zCoc_FL!rHdw&w&NN(abH?Y=O*G6Rmtbnnb4t~+5DLYyxZJCM)F>Xp)f&$JLL)Y=H7qCE7 z)C{+IC_NscZj4~gk@Y$v6Nl;&bvI4nVTv`iHL6P7`mqm1*cs+f2juMQxIt5$GwL{0 z17dF{CRl3?4+Wmr>h z$eKDrp*y5QT&zL+p@@!BG8DjzXF?IZyw{9Fy+UP%J=&n|QEt_SDeuFkY^J@S#ZYq% z$9UI0b2w8=mek5$%JgSYH$p#AlJzPd@Fr{Oomf+^xyr>?;v1nz4sXM(LDi01^w9-- zH1aPGvPX+0*_J)-btHcDWWn!AcIT+lUXWs_q>w-AIexCNES?M0k}@Wy`U}LSX>7SW zQAO4Ze885O)v%@-vO;1_y=D}ZxQj&+ittbzAG?HUgX)%T(MPuc5k~K86jme0_*n8D ziz%ncf^7gQilMvtuJD{=yzAmZ1{VN}U>5?zlQN{D#zHPU*%S9n{s%Mtm71{oZfYgdyY=l;R4Mu38&^; zKu(Y{Zjki~syUV_Z`@^fP*~J$)I^zQ{zZ_RG-#hbnjgI+BAY(~2tQTf!ge{{l!k(D zfTB8-)lj(v!Q6Gc>kTSUT9ToRvJ6{?ScyyKX2Zh%6I`8=i@HmA%V1hliT6Vh7!~up zG3X%lLz6z*xM&{`2i8+;6$gldj+jju#!MLs$9WMixE4d{-U+2A<3lJ}O_jUnA^#*V z5RdNnIKfC<#)wTi;vrMkH8@aftLNN1 zo^t`4uU*a3=48xVN8v!I!{0S)`Y3Cv)3>a|>yn637u2Bh&~Ky+SX2)X;S?jWoygj< zHsx$JOi-n{CJ+ZS+>K(Qa04(bYk65goCNt$@&HRX|F=n)D-^*x8dcX$!3twBWxb;}6?5G($tCH^Yb)OzMR7J)%;7Ii<) znCT#;lPh62D2db22~bQ6bXMApm`@MPQHJbmLh07fSofaoowi%ByGHsaSyOwX&17%5 z>@Oj*H!;0UNld-Ul_ysiAH|Ux6ZD!WNp3Jlwu=2<*Hrhvc38&7icB@gUPh7L=SZqcBc#)ilF`xM&i544I=&D8Q!7~AgjIjTzdL9Hi?k_!npd( zv^~j(xNVtV^q+!V5sC)h%s4it_^>{t!{PB^)M0M@5bOG=zOUHbxMt=FjawmmT@($^GdYY?wXVAUG zEuPvuerexJ-8k#!v(2&%qAmM$1QeBP*CU5He%FpTA>+*snDO*O#Vy`nS9G9+2iBJYzP<+>hR=Nd4ioRUIW!ho> zJxVZo-RSO{InFtiR$RfNY(j1v~}>rDY5o3YK0f@wStQdx;QeQtmS+4fJ;UVHA-^ljPe zte;7|2rq7+MjgDir;^WN@yPfqBmB^sWBks&!?z*Xr3*8FdGEbjfv*ll-4C5}#YTx( zMCQX=l+2$?QSLyvD@f5{q;;M^5LY7i>+#MK%HBZ~X+7wp^&fxzD8sR5m9TSKVMGKcaa6A@bS8%bqV-TS_ECPMb`7LCJ@9C1hlw}=#c2i)_)#XQ^A^nm$19SNLFlW z3JFIC{o7DTJMvk_J6(ay!uVd2FA2Dg$ix-#el?6}I2eA6JnzJ@?hmPF+u6Hb?$?ttgK zvOj;ASo;&`t66Z_%|gK7zHk=QJ=nLieFG_)<1|2SQYTjTJ5jLY9TPTj=AsH^h)B~V zc#wL)wUW%{cSK~VH=UgT=W%KifnG=;xUkCuZ+x)+xJv0mU%&*y>5kOemp$=`B@3>) z8Q~(DXhe$zLvM;Ty^1;6(5@-9c(CD8-xoG4bA6^^K*K9TOX58yN1KEQhDt0ps1&`x zNpvv33~(MtLm+60KkQSSLy?eyb=hqvJ~sg zq>f|eIY1zoT*bad#T^+44gYM6H~wU1;_JE=c9w%O5iHVL#tQ+>kb4Ua=(nQ*WnAz? zk*DJbpU8QaQRGETuXu&6myWX8V@5Pj$=0A7tt3)q9^_ds77+Ek+i;n-IF&skLPF_N#Z?5khnG88BzHX+0D4AiKfd~huaBA8W4t7M+3^S z)Ir)7ENJhUdIdHL$`x=G3K3GKhzHTx$)@JT`32DyHd;wtz;U8=KP2HOZyJpzfnaVz z_ZS&dDykciTU8)JmSg}O=`SEcjxwN4F4#c7QjGoM?cJkCMY&Lk)Rrj?XtI@8ojTCT zfc_@MQGR*&>;~RvYuKAKWFXrV1g1UBp`@qh926PqRuX;!dn6%R>h9qP-JIMKfp++> zjh%#?y35E&ov}126i3)ClQuEXQ-j zERJpUQ1VMk11brY1Bi)7krwS3kApCmA?`-r4{neG#Z?jg#It~&=607BSHLw|VyS{C zHfP~jm;WJ!k9^vCiwIOAZ^62r172z|GID2}zDt*H(2zqEEje?E?2&#a6Lzh;B*$~> zUEx6iC#huBN;Vj=XOASmng*1DX_I?aDWqx9kUtXQZfFy0)RAmeJ=?gGBM5PPeu3qH z9ANl*Ktr?UqsWPZ>#GCQfOd`{u^ge# zTog(yQPu0>E=`v9pOGKjaCGtfYV@%@e#U-5{~$U82Wp8XGK; z8YQHn3VPZCi+Z6$4c{RGK_bvC7#S5AQOg_LfC|kVMNJ%4wnyPfU1u54#+Tg(9f5+p z8(!_tUEvt;B0ltM+A>nTQZODvij_CQa96h!kDUw)mh`zhW1_2ejNjZ^Z6ze9Di>JP z@L?r5MtR*^jzz@|fneBSWK42?5bJu8X0U+v9K@DddyWC^*mCXGrReNTn-{Ub%fGno z)^UTxUZKT>g`iGs@!Z?Qz&;%9M&V(6p*mD48+9q4UBaPa2|7MDBV7xN$V#4j49$CE zhCpzSkuiRAuh<`)WR3aK^Ay^9hz23xjH$#3$r<84?6A)iz!fyuRIl7S^~&BR8b%F7i zKEUv&=aFF7BU*pYalGMc@Lvn;x?HAX1cGK;BiV@}v;j1;b2{R^6BKBJtCh&!i$z-P z!|^0l`#Yy7g%3;W02l7pD^w+K@1fq__+X0GfN9b$efnbj)_`XA1>Dm+?H>D($^)Tuz^B%NcpS$ln=n^Xe>;~$v+TZChSu{7A z?aYCzeHRqAUJ3ur-FC>e(5*yWq4r&R1yT zZ5|a*bGQZK#0nSJ8ycHn>ox7;^v1J>NzGdb>3h9E%S2lM3s7S;r;ILx+O0Lt~Io}9XK6*6Dd6+*b5~-y3m(+{Y1VN|C=NsJ+-RLD>MG^F63-7C$)}1a4x*j7V(N@k)8Xk5N zXbXFs?!R%#xT?cs_ICG7?Tkm_hcb#;vISjHt{gZi@-9Q=VyXA8vjhrtbsEam4~X8V z>o2bFgg~&%$as)u^kL#Cj1H=QX*|50xuGr(Cr>@0(-q5F1qW^?Cw*8|7r_8Jdz3%$ z0ErG%t6q|=Qc$gH82rE~gX1!VnJd&Cj7DrNn&;f#f(L0y<80;tI7TXlU-4DlnU3?-N8g^Y}zh&6i?{O|9e&W4QeFn*00Q^OW5rptY& z^wkAp+9+$-f!3@ZY{t4rv90le!Hx(T_qx6CkptBOT&Bb0Ujm(B74KL3IX9j$v8Rx( zieYAcm*lip5$QGJxRKlW+ zc+;a`qhCHycf;#!AA{Ye1Yaii@#=3M{3thU=|JISg}hEE*cGZ@J}R|u=bWW3g02SL z&+-{&JR(&4=j8_H)s0+24cnpBj^V5tmv^?v*r- z{<}`KuQ8)ZjP!ilorn%C#(Q^5X*A7fb$jOPpJMZMq;$=#XN`fKV&I=n6CZ$i(Htj~G$oG>%p z*-@h|Tu*nsVD z^r(0~D!3{4ab9k344Sx?U!{_2{ml>man-mqMy#C>jkV1FR2$JhiAiEfT6$&|ZQ^Ft zGdjX)Jev(vxi2I4nAo0YQ@MCdC`!N&J{La}+1C{47=bQr(lACBd2oTO0%u8kzrPXv zgQ70rOOwD5Ot%>gfukjxFP>Tme;2};EHImhM<>td6pb zZ{OHB>>fREv|==KYY!FBW8ojU@q%GlAKAnj(uRars7*3&*l9RBPU*_>PT@*};#KRJY198-eCm-|f9^jAmkREMrJ zPA4mK9V5Z^T>m5driJdOTKInTmDJRtwki4dc*%oMhEKO^OdrkeQW|P+sHj(}&PPa2K;-N}nWIj~YWG+j?1n5nS+0HxZtIbK*@5 z>k+vd?Y!o}zyV2{l;L2v;ElLSv>Vm2F*?V{mlsa5tjY$#L@RYar02<_0S-yF9!0%j z8cX&+vcMK_p5fq)p3hJH#4@=ivdfO# zGQk%4MA|AWL#g?h-c01MV${VXT*owvuW!di2SZYg&7Y*bb=EzK0WmJQ(jb`POKT+5 zV0C5CyuMRGxQ-=SG=u&i&8tb6X~ ze1AMEXQ`h{IIoj%c6@#ycTFNUj>~27a=?Lhp-Lli9u&{Ul}w_}5~n4rZ-KfYoUHZ~ zhCB?NW3k>L5$Nc%nK~k+*ebpR-g5vqp4g^YFIm=2$g4@#6L7b`LAL@sBD*+CcD7Dk zIB#jYIwo_5v%A}Q%1uyf%_l;5Ep3$v*8+{nSO+{cwx7T+a1^`Om(1L)Qfoynm!Yb4 z-f`e)z$?vm=@ehaCR9I9;k)EnS8hDdjJF!D#|@J8g8Nw*&6C7B#fK*#B-Yg)2X8_u z^A4OH?2?g-$m_ca+aMJcZtQtB_b5{qwmTIIb;->$h_-hRHl`| zvomo-VZkv{Ki6yVJnN1dkD2j=W!-?TLnvdopCyP|0yIngY~Y-aZJt6d+M=}W!C3`c zO6hSoA>mbpTeejgGr32ZF)=Y%(c)@`ZPD+~HcK@GWIP-2MQv3jlFoA{T}{mebD9Qq z2Ifn_`g!W5!RWDJ$$OZOu^=r)wgQeJ1)&UO;5T` z5!5G&b;i4GveE*2#SpMZdf*l#j8RRhT+6bq#P{#;#1j^as43es?eBNbWqm!0jA#fs z3qW_^41{W2C#OCKZ!b8vn4e+m_`|DLK46?|7~QV%fT(}a2;!Tiza|V zeM_i^0vB7U=^ZJbkj5Fl?qVt;>ntrzwO7$*VzwF!uUkCpaw0Ee1sD+dR^WFOF(m5^ z^YmEvVjIqSP63p*p~H^^Oy-+@f^swBh;@kQnd63=^gSCxQgr0&PkeSdNJyMVtuV=T z{Mz`+?#9lgP946c;U5{MeFVEfsePr0=e)fX#Gw9Td1*NoY@*~CXAwSVj{Z?2aXxB}+V~f7(PaKnMK5?g3qlCmw zA6ZM1Y7)%2YaR1I1j1t3I*0A0Tm;${*dO>NPd`YPeP#l-Tr|lrMYG>Lg&naxX3{;( zdMOe#0Cu~CGHtTQ5_L!}x&nbaQQAIxj4xqBu$2q%&M+x>!Xw|ln?x$oebp~rRRInV zHbqDrOI4L%+X#k_4zSe5-o;)~>wBryO57BR`jxL5{PmjH`9D@1SQqG za-qU);Fu3&wGtrUQR@?9zcDt_P0%O_w%z9K&}&253#m?f=FGu|AdD0uaQ?%%t=d2f z8J&koXN9AAWF|uaZBU0yfsyZMyF(g8R-dqTNY<^9qSd+u=N<>|06&t#Ia;}~kQ*S- zvBF(9iSSsdolu}A_cmq=Qv%zAT~sP@qpS(cPVkfYwJWiZ_PT2N*tu2$0SnWxYs}>f zeuFw0Bh290ELohh4Sg?6fr&SfE};q?l650gxSyl{!^4?SSFoX`4LHl&;7vcV^Ns?-p{HE&BVTF-h`24kC0gCxI!u-z9C0PdTo37);~UKb$^9-G(ymp z!2S^LjxJ1F&6#u-FECx1bauCKE@;*r%esV(!zAlr5jck~oRw&3UAK9LmIkLZGe{QX zzE1AGn=B))P0p8yka(-%c4koDu&$ae1SRp06$Lg=E4Kz^ zL4!P;)p0Zzq_aZNyd#^$ zD9e?I@okY?K7!brNjGtuX8j1sIv;gFc+mU5Eu59!DzkDCrR~oakFqL^d}NkNNUi=g z>n5hzG^r5w(sbO(w?4ZKcfqhN1lx$20wg89c4~$USApA%tzbwEfond_oq-(}2Z6#g z_zP=p%jbJVI{S{a^*L_aE(KSvW2ww^j0MU1-n%pgbzL}TTCPyQ`HhZYID7iwb8Zs6 zYf~yL;Zaen?lj!ix|U!Yk#aY39ZfavU46LtM#AFqp7)M^2zm?L4$2+Xlb*|GNq1k! zcsHD&Xhz}7;;2Op>Jo$Q;W8=+G4ux|;!VCQBuT;Q!#2QAhGDx0tlfdt4<5p@F z8q-F@9k#2`McB9=FQqZOJ96}jrkZ-$=H3xUwKji*4cAMx1!mssVLH);Q3qey(kl=G z?`256-?50i?O4Rw#c@X(N~rvYBR{*}g#dn2tXym5b-Qo*PUwU=cD46uU1sJWDftEF+Xusk?W0<6m2;#_UA$NVHrxB^ug&4VK~D z=9JE6z#w`r-DER5d)KzPu-&4}5E2X3aj1+~5*^=nj(JRb5{z@)^_vRDL+3^vi*P)$ zaKP>3F-1CC8>Y#!4l^J=iV`Y&)<|p$9?vB6Aw1UvV6t5%b{M>*xs+Q0+U;-i7G6xQx{<>Ol@r+9^lUfi1%Dn}ClI~i zSl07k)R87ROX8X2%yr5>=i{^Q+v%sCh%D&ddx_Rpjk>Ahj!BKUXbhbYP8~CjNL==e!=&miC zjpD2$Z^b@3wgdxD&6gAHNJ}@xRIV+M{USc;vxLN=C|6)TdhJ`ETQ0!GF(NA5Y>U?6 zy?%$F<2P5kl;XJJe;D(Ox>KY8h8S<@(SRP}#S@~(pO(xwI`I98LmYvkaYNrQF4u)* zas|mKrwNJ8?!7VnI7F`0fCNw0mIKyxS}(CuF6nI;A9j>n_Y z+deV9Vj@e7*A7evhhn3}@mNvS43D60($;s*O$_cr0XiLT@$=NMp)2K^$*==1uQa4scIy=iU79_pqC`pNX06=dy}pDDz$aN=xHHHphGt8Q_W<_UWx0kw>h)4)$`-TeQPQKbB4|N+ZiI3- z#UchGX}X%JK}Rt|4}8Pka}=xP!$HA#hr)PD;MQDR#z3^Q_10O^S(!k+uUlu@XiH9!&i>z!5w!JbREY=sZJ(&C zrjN;jW+Y;zNb;(`4cFzpZJNDnNN4}QA7RV2FPfr-lG)8OA*k_-;n>N0b8L#4x( zMtA%T&pq-f{moA5@EPd;jsF{4eq za_oU|u}++OuGjK)Z?WCYO@cBDSIK&oDiq{$bS6=GG@O= ziwtpy(Xe0DsCHR40-xT+ltw9pTaM9x?x|@0f23}!w@+! z>SWCqP|L_yLNo#Ns8o?ucfLvfsxQ|EG03t@;)oG|B&vB6mx4~GUSIIF46;FX$s7$a z>Oq4Z1)!LCJa=v_8{EFmZf_6)F@O~Fyz)3l`NZ?N6_xDPuVteVrWlitX#wRO>FaXh zZKp0O{$xP=G?U$sM)HuRDFT|~>tpm@zVh@DV%n)&W^M<6ewg>?3nGlk)8~igC5GIy zQ+NHjv#EZ-?~^Aaf9P@C5X00v(%5n57Q7yf(g>oU^eIM)2adbwnrlyEfM26O>u(T1 z6E8fX)=KdL*){JpJr@k|yBQyjdJaqyp+Tep-qA&!KkuRY!{eDgL))4e&>@*q#Q_(w z=b9IPcb(@`Z`t$@(_rb_eQ;B`>zeQXdHU7c&&6Ew1?3f}(X{*Qdr~RKm|xw)7Yn|^ zFoLK!A!M)G&~GW#OfmSwYt3^m6tLz60fv!M>{Ww(I()k5HF?Q?58%X!;FNUfRT>Yy zg*q0T0N4&_*p*T_z#jUAZ@BpA+ug-;Bl7%6yNVh>PfdJl#~peHKP}hq2_d1^Rusuo zZB_r2eBHv2?2 z3J=f5$rZ3ywm4hu&lAe~9mRpq#^d*j4klmyu)M*N!b*xro_Iz-03Vd%W=*M@OqNIF zemNn(xX67GDrk$L}C#r~tW$Zr%|{6DhI gHrs5o%{JTo3;eid%osQOuK)l507*qoM6N<$f*ZE$-T(jq diff --git a/public/images/pokemon/exp/769.json b/public/images/pokemon/exp/769.json deleted file mode 100644 index 7fd6b616151..00000000000 --- a/public/images/pokemon/exp/769.json +++ /dev/null @@ -1,965 +0,0 @@ -{ - "textures": [ - { - "image": "769.png", - "format": "RGBA8888", - "size": { - "w": 222, - "h": 222 - }, - "scale": 1, - "frames": [ - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 61, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 46 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 61, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 46 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 57, - "h": 48 - }, - "frame": { - "x": 61, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 57, - "h": 48 - }, - "frame": { - "x": 61, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 94, - "w": 56, - "h": 48 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 142, - "w": 56, - "h": 48 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 56, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 56, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 56, - "h": 48 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 20, - "w": 65, - "h": 33 - }, - "frame": { - "x": 56, - "y": 144, - "w": 65, - "h": 33 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 20, - "w": 65, - "h": 33 - }, - "frame": { - "x": 56, - "y": 144, - "w": 65, - "h": 33 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 121, - "y": 144, - "w": 55, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 121, - "y": 144, - "w": 55, - "h": 48 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 167, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 167, - "y": 96, - "w": 55, - "h": 48 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:417ae469c35cea609c584c0e7ca094eb:6458f627018b9ddb6f2fbc2096c1b150:ba2e5a01352778ce94d84746368de8fc$" - } -} diff --git a/public/images/pokemon/exp/769.png b/public/images/pokemon/exp/769.png deleted file mode 100644 index 5e41fea7682190bcd73b77d11840c6c46daae3cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2356 zcmV-43Cs40P)UYwh<2z<7|_kdy9s2@A9rOMQxl0_|K$DNJwES{M$|+i=XdkG zi@9c?5#J{^_7!PN&39jJM)^Hr0-|P__yviK-&dp&HIZn9nqY?sn3~}N=RkzK-#y0x zUo%R*d*=O|-~RN67VMg-_kNYJc2SwNy^I5*CK7#-+XL!~KFzwl_Y1PzP#*OFh++B(^vnI~L`E9B?wZ^M* zocD!FGis*34$?36NXuSUhy6B^=tTSD6si0QtESFexMh_H%`g+G1`y|@^Ao!!w2gBv z={0KZGHtS4JA)LlSrf?%rJ1|DZnDmowco8TvhS)HN~bNq{{Syavv#~7tapa*!l;@0 zMVlFZub*=(__?L}4s}hD7@OHP+If&PhbysR=iAu2I@FIs)y%!`Yl{O-ip)B@F5G3F ze@I)u^<_8U%KN8&P47D`YBhXm&|Zkd560Dfp4ExbRk`h6&D-Wjfs=Q2RGk*Lre7#S zcE#s)UK>X4saLZK_^pPu<00aGQxtZ29a#|74)E(QyY<+v^8B;&wjXwS)%R=dBxnp! z6U(mb4%_qlgSY)czaAJ*Vr;u#^J!hGLG;qWi)ol@I}vPq4GrVRfg~PUub1!h+bs6g zGJ&{wx*xF1>giie_hSDA-AEj`wAdGes6VDmBp%d!rB$L4t}PI`=H&FB1d;CR?CEJ= zE1)4PXVKdhsher-dd)zqL}=q9TDA`LzO#PG1I>GA6GbQz6B-Q_=Z~|IenM*Sqh{wp z9uGfX-wzV6(Y>7Bk6#%8;OUMJ0Fd|l^f4ec06>2B@XhWcsQ~~ovjePsA~gU&Zgx;b zP6GhsW(QT|Gyp(mcKAUeGyp(ic2G=40|2yV*AiAnXaIo3?4X#O1^~#4|0CKZOHC5y_06=c`w5Ey$tpNa1vqvpeM4F{(07%RZ zKSEOgkeEGfC?=(80BFw+37CM;6aX}5N1g~EruKto13>MUX=ziZ`6Fr2YygNpF}unG z$FqpB4He<1dXczVinLqo6Iw4%ZuhNTC;(XdVfHRCJNz~dewlA-!cRmJ-)d#vama_+ z{YFH*@6R6HSJWF+xHzQVX{BwYB&xqG4mChN?T6WyKbEjg(*Eqxx=)3R-0%IO`)-eA zLZ>x(t_J`C`7k?RU9XpDkV2yu1hg&-H39iBJL1sK^(Zv_I{2eFUacL4d@2pIw;Fba znt-%DzlY08I|liV0nSPT6-Lc02HjMB#=%j@cWm}r0~H3SN7vIzRlD7 z@!ARbCp4aalD%k+=bwBp(0KmI^`bSNfAYORM5`CAvHbJl?%@t1eHk;J zo_`|I(s=%Jv9+N&cyM7GQf%XD8uLGFg&ks?WJRin2yMB)(-;BC$);-BvE9MJ(dWYhzAi$`K& zTxYnra}NikBBmd}+ng`*h!%wb{KWJFc$@PjemL^#UWTv_;BC$q!m#)tvbgN1&((dN z=R!Pyw|JyB^q2Yd{(?yL+A`1R2k^nK0T*v&BpXoo^`X0O~MZ=KEgS^U$sqj$qT^48m26T7h)pwX)L=+)fK z1dqIBfnJT>7z~j6$0=$zGy|mma|YyY#y|3o(uQ+_fzBLZtQhD?0u1y&`UoDuL&<;X zc>j+F1~`9!0iH0x0Ot>$^YOuRH$DgkIA?$X&KzKJOEAD$LNhtHTZ73>9bj^Z6`0)Q z0VW3q2qrhZA()(IfW9Db7|(gY00ARrIK)shKrp#{hBHjO3NX3J&v2Llg309*`)LNK zK+@y^2B?|bEFmcvpki{92N>YotAwALjY8jifV*Iqb4KKrg6Y5j=M0e~&%pps5TUra aE&c`|Lt0W5p;+Nz|@cJ8IUB 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 Zm%vBKz*?%ZeEkavprfg;Q4V?${C`~7N`L?W diff --git a/public/images/pokemon/exp/843.json b/public/images/pokemon/exp/843.json deleted file mode 100644 index 06456db6386..00000000000 --- a/public/images/pokemon/exp/843.json +++ /dev/null @@ -1,272 +0,0 @@ -{ - "textures": [ - { - "image": "843.png", - "format": "RGBA8888", - "size": { - "w": 159, - "h": 159 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 47, - "h": 41 - }, - "frame": { - "x": 0, - "y": 0, - "w": 47, - "h": 41 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 40 - }, - "frame": { - "x": 47, - "y": 0, - "w": 48, - "h": 40 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 48, - "h": 40 - }, - "frame": { - "x": 95, - "y": 0, - "w": 48, - "h": 40 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 47, - "h": 41 - }, - "frame": { - "x": 0, - "y": 41, - "w": 47, - "h": 41 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 46, - "h": 41 - }, - "frame": { - "x": 47, - "y": 40, - "w": 46, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 48, - "h": 39 - }, - "frame": { - "x": 93, - "y": 40, - "w": 48, - "h": 39 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 48, - "h": 39 - }, - "frame": { - "x": 93, - "y": 40, - "w": 48, - "h": 39 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 46, - "h": 41 - }, - "frame": { - "x": 0, - "y": 82, - "w": 46, - "h": 41 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 48, - "h": 39 - }, - "frame": { - "x": 93, - "y": 79, - "w": 48, - "h": 39 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 45, - "h": 41 - }, - "frame": { - "x": 46, - "y": 118, - "w": 45, - "h": 41 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 45, - "h": 41 - }, - "frame": { - "x": 46, - "y": 118, - "w": 45, - "h": 41 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 48, - "h": 41 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 43, - "h": 41 - }, - "frame": { - "x": 91, - "y": 118, - "w": 43, - "h": 41 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9312bae554a97f4e1cf7cd6a28ceabf6:1da73bda54fc1449f0690b5744fb330d:1ad579f7e215608104284deec571c282$" - } -} diff --git a/public/images/pokemon/exp/843.png b/public/images/pokemon/exp/843.png deleted file mode 100644 index 2e45524e26a523f99d6bb41bdc5144fc529c3ffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314 zcmV+l3HA1gP)yoS}5QLkW(rMd%|L0u+Y!C{lM0#R(iH&o9Oi~v_7xO#L+pZ{ily6 zLiGrs9M)I*v(xP$7lEn~Ksl_h%zxAB=C3>X03-(h<*+`#-+2!KRvTeG{@mGK0J68* zT{)~T=D%Jcz%iTb_<6158x$gda#%0aXV>5CF2c{RS$=U1;-eJdIvA>1x$zgqYgV+ZVmQ z+Kiin7IRk)>&p)J%OJDF{)7Oa9M(%GS|&bc8+VFyCm?&89Fj9Lpuei+3e7@9#?2;L z;xM?J+%f8M{%q(4wK)7#HB@oU^eTz5*>e-e)y)kR^YzxF(3I2Rk;R*+}@6>zg3UX4R6(JLoXF*pYdCAaqY_a zYap)3RZdJ4pT|8tF?aNp06v1RkImX>&?It0MC8sVjRHY^CBS~(jr8a=XpH~SkbJ$LFGW67-^jQ31MvRQdwC+>Of$Yt-^$mokN2G~`PL+xSRSZv z=Ib}e$1X4VsOuh>d-)X|9t2_4RxqKyN`9%ra8doqYd49`R@6 z0t}E|==FLy;{14l7l;{s@T?n%F2DfA`SAiT5Hp70WjAW~9_KS3T%h3vE_l`rL>FLy z;{5n3FDUA>!Lx24x&Q+d=f_ugL7CA7&$@x=!T@mDYrH_n=z`1LDCq(YT&lc4$mn;2 z*o~4d-~fe)MP49f^ueWW)O2A0pis#RY8kntACWHDGZJwRFbn{c8ZRI*c-~E72iqq& zzg|3(&(wK=h>wUX-OwZAh|Y-`b#`z4@0ofH7gz`>3_4;xCy@BvT0Z>|W zCc_13c_-y+^<&wO8yH@=0F*YJDQQG_UO2r(ghD?7FBJB%ntyzNOPkJIX+*#?8okE@ zBldl^A`}2wozKK{?qaoRPQ)Lhc%k4kZ2-kNE$Qs197n7mUI6(_k}lAa_I~1hzu=2? z$M6EkXYzCknsefd#J&gc0?20sTGFFADPGu6ya4hU-W#-}MRQKP;B0uvOosSOgO1wwFv37_%sBCg*8@C7Xp8rgrI&z$fg+Q&-&9s@#X zeIGs}@dc%Sj{qUGzQAW9yoh{Z0r-L%2*LGvJ`>?Z&Mw&f*L~~I0wMGU34A8Pi-a#2 ze+Ruf-!DKw2(B-G4NS~!ZkU;)Kxp)pQ05AWXU0@3^ z80GveFOO(ifm;L&1AHOJ9~~YvQegDAv-&m^e<*m+!2j+p^{p^p$bb+C7!~z#Bn$-b9Z$5j@4MC3{41Q}N!IoZx7wP2 zSLb+|vpvPFcIKbp9M5pJXSmh$&Yk0l&h`Yin%-OH98Yw%XSmggZ93iAp5azg?i^2a zwx_t&lsU%}o$Wbpb>#vpO@5+uudZEHHDct7i4Z zIBrX47MQu!b+bAc#~SJE`cAjHZB`q-bYg+2TirIRgIlVRPCToYW_9h?fu+*(y9ner zhYg*y1hcwgreAz*A_{2myX7^_YE$>M+pT<~zK$6zNUN>PJV&#>zAyXQuvwiZ&82@* zUo@x%v-)bL7ru7AmH7nRh=f3tgxPY_;1+%*H8QMkKYGv*U k>K|UI)M!7(`1g;00MsuUG$BTIT>t<807*qoM6N<$f`n*l`2YX_ diff --git a/public/images/pokemon/exp/844.json b/public/images/pokemon/exp/844.json deleted file mode 100644 index a081ca549c5..00000000000 --- a/public/images/pokemon/exp/844.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "textures": [ - { - "image": "844.png", - "format": "RGBA8888", - "size": { - "w": 216, - "h": 216 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 54 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 86, - "y": 0, - "w": 86, - "h": 54 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 86, - "y": 0, - "w": 86, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 0, - "y": 54, - "w": 86, - "h": 54 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 0, - "y": 54, - "w": 86, - "h": 54 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 54 - }, - "frame": { - "x": 86, - "y": 54, - "w": 85, - "h": 54 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 54 - }, - "frame": { - "x": 86, - "y": 54, - "w": 85, - "h": 54 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 84, - "h": 54 - }, - "frame": { - "x": 0, - "y": 108, - "w": 84, - "h": 54 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 84, - "h": 54 - }, - "frame": { - "x": 0, - "y": 108, - "w": 84, - "h": 54 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 84, - "h": 54 - }, - "frame": { - "x": 0, - "y": 162, - "w": 84, - "h": 54 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 84, - "h": 54 - }, - "frame": { - "x": 0, - "y": 162, - "w": 84, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 82, - "h": 54 - }, - "frame": { - "x": 84, - "y": 108, - "w": 82, - "h": 54 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 82, - "h": 54 - }, - "frame": { - "x": 84, - "y": 108, - "w": 82, - "h": 54 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 81, - "h": 54 - }, - "frame": { - "x": 84, - "y": 162, - "w": 81, - "h": 54 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:477c3e24ed01f357b40b55a146886579:67027ad0ed80befaa15d0952f4fbaf01:791c04bd94958ea464eaa02b1a2ef466$" - } -} diff --git a/public/images/pokemon/exp/844.png b/public/images/pokemon/exp/844.png deleted file mode 100644 index bd138b7b6d8457e340d9f5ed8f1438327a70b0e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4739 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 R*Hr)j002ovPDHLkV1kpoYZU+h diff --git a/public/images/pokemon/exp/902-female.json b/public/images/pokemon/exp/902-female.json deleted file mode 100644 index c9199ab17bb..00000000000 --- a/public/images/pokemon/exp/902-female.json +++ /dev/null @@ -1,1343 +0,0 @@ -{ - "textures": [ - { - "image": "902-female.png", - "format": "RGBA8888", - "size": { - "w": 256, - "h": 256 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 81, - "h": 64 - }, - "frame": { - "x": 175, - "y": 65, - "w": 81, - "h": 64 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 81, - "h": 64 - }, - "frame": { - "x": 175, - "y": 65, - "w": 81, - "h": 64 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 106, - "w": 87, - "h": 53 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 106, - "w": 87, - "h": 53 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 81, - "h": 64 - }, - "frame": { - "x": 170, - "y": 129, - "w": 81, - "h": 64 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 81, - "h": 64 - }, - "frame": { - "x": 170, - "y": 129, - "w": 81, - "h": 64 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 94, - "h": 55 - }, - "frame": { - "x": 92, - "y": 193, - "w": 94, - "h": 55 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 94, - "h": 55 - }, - "frame": { - "x": 92, - "y": 193, - "w": 94, - "h": 55 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 94, - "h": 55 - }, - "frame": { - "x": 92, - "y": 193, - "w": 94, - "h": 55 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 94, - "h": 55 - }, - "frame": { - "x": 92, - "y": 193, - "w": 94, - "h": 55 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:115e187eb068c187d4e3d4e4716da67a:d0e3dc39bdcde2a96488e969c8b3f7f5:16072dc598107c41afadd9df4d7c27da$" - } -} diff --git a/public/images/pokemon/exp/902-female.png b/public/images/pokemon/exp/902-female.png deleted file mode 100644 index c1cb86ff3bfe6efde09cfd7f4f3d9435a2528a07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7346 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 diff --git a/public/images/pokemon/exp/back/769.json b/public/images/pokemon/exp/back/769.json deleted file mode 100644 index 41828e9c61f..00000000000 --- a/public/images/pokemon/exp/back/769.json +++ /dev/null @@ -1,965 +0,0 @@ -{ - "textures": [ - { - "image": "769.png", - "format": "RGBA8888", - "size": { - "w": 219, - "h": 219 - }, - "scale": 1, - "frames": [ - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 57, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 57, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 48, - "w": 56, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 56, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 56, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 144, - "w": 56, - "h": 48 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 144, - "w": 55, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 144, - "w": 55, - "h": 48 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 111, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 111, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 64, - "h": 41 - }, - "frame": { - "x": 111, - "y": 144, - "w": 64, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 64, - "h": 41 - }, - "frame": { - "x": 111, - "y": 144, - "w": 64, - "h": 41 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 73, - "h": 28 - }, - "frame": { - "x": 111, - "y": 185, - "w": 73, - "h": 28 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 73, - "h": 28 - }, - "frame": { - "x": 111, - "y": 185, - "w": 73, - "h": 28 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:17e2413963cd5bd4a68ba8e469dfc190:227880ca0b7c52d6cb51957ab3a1be77:ba2e5a01352778ce94d84746368de8fc$" - } -} diff --git a/public/images/pokemon/exp/back/769.png b/public/images/pokemon/exp/back/769.png deleted file mode 100644 index bfd607cfc7330bb9d04e733b99a9a524b87c99e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2093 zcmZXVc{~%0AICRWQgRjMNRG|XT)z>1TSLxel%sOwdK@D~L@YzfIg4D=$o6v+l{8X6 zM~9;|k1>ipp6b!eEaaFm?U6^n-#^dm_xt1f{(O(m>-)#|pKtzI4;NV(H5mW^Ad7N! z^xD&zpCKW>N9Bjx*Y-sFEZWCuPvzz1?GR>>ph+;f-2$Y@dMSGf!ULU3}z9i&qf~ zE%Mi0?Hv=%|8gTy`3>%-9qq}~PFd?|&-6~pAb)}7Q1K03mSelJ8|hqEzq6Jc#G)5{ zO<=jwDNjAweFj9@@Sv3%w6stZs`Y6xAS>_1j`2IiW!{##NW>m5>gd@?+`8~5bt<`N z(VX~=H^I(}UqRY_j8Gs(QT#9i-TK$%Ber8Ft%t1#z1sM(likCXY#r!FuHeSVn}EkI zelG;g@o}IgU;K~=JD>qAxJ=+w33PUHF(WFRZ$_Ds0~iu-YAS zcC9h5Kr2_5eb|jEoVcIee&wH)wrnW>ZM=1k{B&k){?G^AAt!&PitQ-pHXBa|x>*F3 zqT&bIYkjG*J=nnlo*v?$Z|!zZF!#NJdSd8||GB=;_OGNcH9;Cw$5uS{voNXUdw1*z zb;0=AaVVui$GD;E(zh<;wW})16nc?m?_lzzu{x_*dHPjDV zV{98#XPA6#ZP{TargB4uh)e}{D&FxLF6X3skGrox{f5ayYJy6re-*dy(&H9|N**$< zVX6E9kAwS=EUGcdt&jQ~_8jWrz@&Sy?)I_cufNMFOaFaWPVQxM%!}}SgsA_4LWzP| zEw4oL{}8>``>OU|0L_dlbx1(nN)y%|bU?tm$wb;A)$zkLY1M{C)b*DJmVr!0NuRW_ z6@l&RBTJKr;Z1a+wDpdM40vCX)ll-9^JC_63#DWewGnfk>}mUSd9yG1ADDJ_+6{zK z_*-yD+3J(J%)9XCr>ikPSpJ)5A9wmh|KX(X+2#eZ3dz@3Yl0XaY4yQ2>ZPX~o$MP_ zcO`hIKnCRKw^yI^U;!U#Cm#Me+7e=jsL8DOVo-FHyAKdHYWxrSp0Et0dW_joX-5shNvAbCHa=l)N!7km z$*wOfC6=#PBFwXnds8)mssU9vOm<4`cDnMvm|-)6ovesVxy_7dz&6A}4&-1u!gTIAlMVT#HwitYsfmfZx_d#fw zTjEM{u+Zo&zQs0Lc(D=(!I_|tO2`TbWk1EOgptK)pkYq!_nL!Y0;Esf!bM8YVw0P> zbj+xj;OZu>5u-W-4?sR$7;5jOvDQiGI(#dg&w&L_n-+@7w$Yz5ujj3-(24X^CJyrQ z@{!k#_ny6(-nCgLnV1G>qYHjf?n=A%cC?t0n66^@WcLokqlyupb_{&%%=CFb3C7+A zJg%|T$==~!(<&NJ=PbT6n|0B};ej+6Yd}F2Gs?=Lf(9@B@xoO=N_N#!8bu<#>a&wx{f#j3sf&MUo{=9l&hzwP>;TwK5}^#Q-r0t2)9 zx(KP{AoF;QjnaYH9ruNT<+XF=n&LY$oTXXAjDEsQqHV?nc-60kwO5nUe(%|A@f6_e z0*T+b2wcE~q!o0692Ao46SXTD9Puu2eoT}dOC@=ewcZSz^o;ZUwSwy96Mya>%^w%e zTSQqAumJ+R`#d2=Q96@tJ)a}lf30#h@4#}h(Pj>||4YG-3*Ob#`xMQd(11tN(eyx? zdKU*@-2-s~HE*tjD~x&$5)SOFHKuWv8ox6hf=rX~3Eb)pQ+QN$ns?{DpZ_0#a`JF| IbSmW5UtAFqJOBUy diff --git a/public/images/pokemon/exp/back/770.json b/public/images/pokemon/exp/back/770.json deleted file mode 100644 index a34a15a289c..00000000000 --- a/public/images/pokemon/exp/back/770.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "770.png", - "format": "RGBA8888", - "size": { - "w": 191, - "h": 191 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 88, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 64 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 88, - "h": 64 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 64 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 89, - "h": 63 - }, - "frame": { - "x": 0, - "y": 64, - "w": 89, - "h": 63 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 89, - "h": 63 - }, - "frame": { - "x": 0, - "y": 64, - "w": 89, - "h": 63 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 0, - "y": 3, - "w": 89, - "h": 61 - }, - "frame": { - "x": 88, - "y": 0, - "w": 89, - "h": 61 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 88, - "h": 64 - }, - "frame": { - "x": 89, - "y": 61, - "w": 88, - "h": 64 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 88, - "h": 64 - }, - "frame": { - "x": 89, - "y": 61, - "w": 88, - "h": 64 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 87, - "h": 64 - }, - "frame": { - "x": 89, - "y": 125, - "w": 87, - "h": 64 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 86, - "h": 64 - }, - "frame": { - "x": 0, - "y": 127, - "w": 86, - "h": 64 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 89, - "h": 64 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 86, - "h": 64 - }, - "frame": { - "x": 0, - "y": 127, - "w": 86, - "h": 64 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:437913a3fac6d9b2d11b7dc09b7d835f:94d3b6901d95203a26299fb484be5e9d:9a5e6a86eb0697afa19bc4a32f422cc1$" - } -} diff --git a/public/images/pokemon/exp/back/770.png b/public/images/pokemon/exp/back/770.png deleted file mode 100644 index e3d0bc64cbbdb445de0ff260ab1eb6d636bafccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2538 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 A3jhEB diff --git a/public/images/pokemon/exp/back/843.json b/public/images/pokemon/exp/back/843.json deleted file mode 100644 index b81be0f5e96..00000000000 --- a/public/images/pokemon/exp/back/843.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "843.png", - "format": "RGBA8888", - "size": { - "w": 133, - "h": 133 - }, - "scale": 1, - "frames": [ - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 46, - "h": 46 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 46, - "h": 46 - }, - "frame": { - "x": 0, - "y": 46, - "w": 46, - "h": 46 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 41 - }, - "frame": { - "x": 0, - "y": 92, - "w": 45, - "h": 41 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 46, - "h": 46 - }, - "frame": { - "x": 46, - "y": 0, - "w": 46, - "h": 46 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 43 - }, - "frame": { - "x": 46, - "y": 46, - "w": 46, - "h": 43 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 46, - "h": 43 - }, - "frame": { - "x": 46, - "y": 46, - "w": 46, - "h": 43 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 42 - }, - "frame": { - "x": 46, - "y": 89, - "w": 45, - "h": 42 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 47, - "h": 46 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 45, - "h": 42 - }, - "frame": { - "x": 46, - "y": 89, - "w": 45, - "h": 42 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:7d4f6807020830ca248b07a70cc65564:a038fb69889659cec8a86a0a2c87caf9:1ad579f7e215608104284deec571c282$" - } -} diff --git a/public/images/pokemon/exp/back/843.png b/public/images/pokemon/exp/back/843.png deleted file mode 100644 index e83d4585b0c7df346235c5ab981085016d499a27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1626 zcmV-g2BrClP)Z(?w*y`#5 zWsQ$;io&nw`8~D46Cqz89?)P9k8lRUMT`)guKXvmv5@OCbv{BJgv;Hi))RkdTpp=o z?~cD~Db8fqtN}#;siFPhI6X!E{P>xoTTdi3ra(`@V1NvvxjflekAd&WW(-=VZUzv& zXDRR&iZdAAh%498ae&qo4iQkg2Ut14c??7*S%P4zLQEZ z;8XSW=R-Wd<+qZ3-!TWn#2ZhAZU7N-_dR0xAJduY!aS^B!3Y!-`#V>S6P;VU$Jk3S zOjc9+`7ok5g7+K@)73c9xit*R!7yFznGGSfbR;x)$Zm!C3yi4-=L^G@VcQ4*h~_BH z+Ii$*5?${~;C(J4A(ytQJl3iykY2~CLC7cnuy;&E^g8~OYctgB0Wh;cpzb;-aG2O6UD%P!S^LE(?& zSnzJ5iA7Guxt56bT|q&#=fgfD>6#2Iaw?9`etcIR$hn1d#rYS(I=Fjxs+cjpWcr7| zxfHLO{ybAMlq2SIGc!Q0_6)lB@DTLy&-oyzAcoA~ujI_Dy_1L(;hn140khXQPJCY~H1EI@EW0U;Sm>BIm* zKNDb+YvPFsf_^5z<`(9u3BpY?fl;*vV>A<>rRsZ{!R3x72=6;)0<72;DS!w!V+vVp z4<-oO_jD(kZS@2}HxrO@g^88kKnpVgT&gyBOJ!yPA14!&6NI~F0)csYf}olSz*4o9 z1z(s66pE<{!d)|g%se+ixN9Z=MVcFX@THjmIJ(!y3xd7z)vz`}SfP*wd-B!Hb!1CH zUP1GMz4q1BFVI956wF9~7wp+rx7M7LIzDLrZY03T_{vvbt+_NoSR71LE%uue)OO{o zi#3;_7Y7rMX4p_vrl6}UX>Q@;lk04T4T9RPb#*Vzzt+E5^K-+7mg1tTdujf?3D26J z9X3!WU4fV8+NnTo`3XicKDu6Hq`7)PQd#~>k9!+`)zy_W*N-OZqo$I#GeYsAt1D@K z)W(O{O(s&X=zgh{<_p^P(`4e>WFfNB)%vFvEPpj?u+Y_t$;9vJWnnUbe?rh$ekFiY zdp%7Ps*jfbnZkGO4*$H?V#Is=bJyZgDBk3s`xXy2$69a$|ID;_u({TP8~JCp#p31~ z3vT6~*&fTg6D+t|K(jrTKb|jXaHW9W_#Q84a2o+F^!Qf=G}mK!cXtVBzQ@ZNTq&T} zb|;x%t$<$K-Aw{|ad$TfXd!l1gBuBGSlnHw!EMy9L@}qq-AxpqK4so%a2o-=+T*JR zw-V5Ok0(E%A2qm@itl<1>~Gk-23JC0HhgW51?`$SiUwC3XguXw2yS~U*|?g6Yz#DJ zkJ|MZq~c;GjVLgG`j}}lZ{uqDYvjQ%!JnFpNrOfCYv#eB1jp?SD4>zQCxV3s4|**G z$L)dJkneFUF7Ee5r1#)SuEpT6z1-xMB3BppYvIAOM~%5*d%4N54Xms8lCOvUbLkh4 z>OW`dcPI3?sWx-JSGjfsrrohUzEnr|Ye`Xbr{A5><5FF;q=|vf9yRBVc2`^1+Wo2x zbn&Pu_qw~r$Cv6FLT{j>T}`9M+yDRo07*qoM6N<$f=_)En*aa+ diff --git a/public/images/pokemon/exp/back/844.json b/public/images/pokemon/exp/back/844.json deleted file mode 100644 index 3842ea72251..00000000000 --- a/public/images/pokemon/exp/back/844.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "textures": [ - { - "image": "844.png", - "format": "RGBA8888", - "size": { - "w": 158, - "h": 158 - }, - "scale": 1, - "frames": [ - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 80, - "h": 54 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 80, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 80, - "h": 54 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 78, - "h": 54 - }, - "frame": { - "x": 80, - "y": 0, - "w": 78, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 80, - "h": 52 - }, - "frame": { - "x": 0, - "y": 54, - "w": 80, - "h": 52 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 80, - "h": 52 - }, - "frame": { - "x": 0, - "y": 54, - "w": 80, - "h": 52 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 78, - "h": 51 - }, - "frame": { - "x": 80, - "y": 54, - "w": 78, - "h": 51 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 78, - "h": 51 - }, - "frame": { - "x": 80, - "y": 54, - "w": 78, - "h": 51 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 51 - }, - "frame": { - "x": 0, - "y": 106, - "w": 76, - "h": 51 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 76, - "h": 51 - }, - "frame": { - "x": 0, - "y": 106, - "w": 76, - "h": 51 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 74, - "h": 51 - }, - "frame": { - "x": 76, - "y": 106, - "w": 74, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:9a8eaa95a1aa10ec56d71049f5970748:df23578a39b2aa0947e5b54998000c85:791c04bd94958ea464eaa02b1a2ef466$" - } -} diff --git a/public/images/pokemon/exp/back/844.png b/public/images/pokemon/exp/back/844.png deleted file mode 100644 index 46370c35b6c3c95a53d973ac11cef04dd084dc8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2682 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 diff --git a/public/images/pokemon/exp/back/902.json b/public/images/pokemon/exp/back/902.json deleted file mode 100644 index b1b8498b3c1..00000000000 --- a/public/images/pokemon/exp/back/902.json +++ /dev/null @@ -1,1364 +0,0 @@ -{ - "textures": [ - { - "image": "902.png", - "format": "RGBA8888", - "size": { - "w": 266, - "h": 266 - }, - "scale": 1, - "frames": [ - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 95, - "h": 53 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 95, - "h": 53 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 95, - "h": 53 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 95, - "h": 53 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 95, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 95, - "h": 53 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 95, - "h": 53 - }, - "frame": { - "x": 95, - "y": 0, - "w": 95, - "h": 53 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 95, - "h": 53 - }, - "frame": { - "x": 95, - "y": 0, - "w": 95, - "h": 53 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 0, - "y": 2, - "w": 95, - "h": 53 - }, - "frame": { - "x": 95, - "y": 0, - "w": 95, - "h": 53 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 54 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 54 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 54 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 54 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 93, - "h": 54 - }, - "frame": { - "x": 0, - "y": 106, - "w": 93, - "h": 54 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 93, - "h": 53 - }, - "frame": { - "x": 95, - "y": 53, - "w": 93, - "h": 53 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 93, - "h": 53 - }, - "frame": { - "x": 95, - "y": 53, - "w": 93, - "h": 53 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 93, - "h": 53 - }, - "frame": { - "x": 95, - "y": 53, - "w": 93, - "h": 53 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 93, - "h": 53 - }, - "frame": { - "x": 95, - "y": 53, - "w": 93, - "h": 53 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 93, - "h": 53 - }, - "frame": { - "x": 95, - "y": 53, - "w": 93, - "h": 53 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 93, - "h": 53 - }, - "frame": { - "x": 95, - "y": 53, - "w": 93, - "h": 53 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 93, - "h": 53 - }, - "frame": { - "x": 95, - "y": 53, - "w": 93, - "h": 53 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 93, - "h": 53 - }, - "frame": { - "x": 95, - "y": 53, - "w": 93, - "h": 53 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 94, - "h": 52 - }, - "frame": { - "x": 93, - "y": 106, - "w": 94, - "h": 52 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 94, - "h": 52 - }, - "frame": { - "x": 93, - "y": 106, - "w": 94, - "h": 52 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 94, - "h": 52 - }, - "frame": { - "x": 93, - "y": 106, - "w": 94, - "h": 52 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 94, - "h": 52 - }, - "frame": { - "x": 93, - "y": 106, - "w": 94, - "h": 52 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 94, - "h": 52 - }, - "frame": { - "x": 93, - "y": 106, - "w": 94, - "h": 52 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 94, - "h": 52 - }, - "frame": { - "x": 93, - "y": 106, - "w": 94, - "h": 52 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 94, - "h": 52 - }, - "frame": { - "x": 93, - "y": 106, - "w": 94, - "h": 52 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 92, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 92, - "h": 53 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 92, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 92, - "h": 53 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 92, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 92, - "h": 53 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 92, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 92, - "h": 53 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 92, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 92, - "h": 53 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 92, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 92, - "h": 53 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 92, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 92, - "h": 53 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 3, - "y": 2, - "w": 92, - "h": 53 - }, - "frame": { - "x": 0, - "y": 160, - "w": 92, - "h": 53 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 52 - }, - "frame": { - "x": 0, - "y": 213, - "w": 93, - "h": 52 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 52 - }, - "frame": { - "x": 0, - "y": 213, - "w": 93, - "h": 52 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 52 - }, - "frame": { - "x": 0, - "y": 213, - "w": 93, - "h": 52 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 52 - }, - "frame": { - "x": 0, - "y": 213, - "w": 93, - "h": 52 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 52 - }, - "frame": { - "x": 0, - "y": 213, - "w": 93, - "h": 52 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 52 - }, - "frame": { - "x": 0, - "y": 213, - "w": 93, - "h": 52 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 52 - }, - "frame": { - "x": 0, - "y": 213, - "w": 93, - "h": 52 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 93, - "h": 52 - }, - "frame": { - "x": 0, - "y": 213, - "w": 93, - "h": 52 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 12, - "y": 0, - "w": 87, - "h": 58 - }, - "frame": { - "x": 93, - "y": 158, - "w": 87, - "h": 58 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 12, - "y": 0, - "w": 87, - "h": 58 - }, - "frame": { - "x": 93, - "y": 158, - "w": 87, - "h": 58 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 12, - "y": 0, - "w": 87, - "h": 58 - }, - "frame": { - "x": 93, - "y": 158, - "w": 87, - "h": 58 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 12, - "y": 0, - "w": 87, - "h": 58 - }, - "frame": { - "x": 93, - "y": 158, - "w": 87, - "h": 58 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 89, - "h": 50 - }, - "frame": { - "x": 93, - "y": 216, - "w": 89, - "h": 50 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 89, - "h": 50 - }, - "frame": { - "x": 93, - "y": 216, - "w": 89, - "h": 50 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 89, - "h": 50 - }, - "frame": { - "x": 93, - "y": 216, - "w": 89, - "h": 50 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 99, - "h": 58 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 89, - "h": 50 - }, - "frame": { - "x": 93, - "y": 216, - "w": 89, - "h": 50 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ad774fe1463b06aea50bcdcfb8593161:00be66ffe58b669a968e6b18b9b99dac:7d196ae78ad956c5eb9131e145b5922f$" - } -} diff --git a/public/images/pokemon/exp/back/902.png b/public/images/pokemon/exp/back/902.png deleted file mode 100644 index adca91304f469287d76b1f336d0a6b215943564f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6423 zcmV+y8R+JTP)!K~#9!?VSyKqqq)*Q37QZ#rgj~_r|tt%U?hU#`I2kb~-!lj`mcR zWJvwy48z}b%r*b&@JC&se?8}48vanJT4p<~jl&IdO)RuSVXgi@OV7t_XnqSzGV1gTUMcw>a;rD zTI>7L%D>UtIQ+q>a2JaO{TW17YQBKqq@ro~<8wh?DA%e7nk^*Nf!l=G5{cVVG!&5PyDt9(Qx~41auO*p_u# z(FrnQd6DdA6xq-5e?f1>Kg)U>hi|i+yxv+#SFhjBywq?XfD>O%ve(-;{K1`~#qyf* zcE)0ZT$sg5rTjFC!M!%MLDbTCG@O{chQm`G`0Xq5k%)-0XR?arncB zrXFbTU#PV@siB0OTr{75YgJ1B(qd65G#~7e8nqywHyejPI2AnG-%@Q2Yq6L}B_cv4 zweqq}VE$WlC9l;=v5mtYzklfUGSAI!*^tDD4_b8<<2XkB3`&9i3)3{3{qW}plsYYZ zitJe-duiZ4^gtnG{vUO`5zSSn8#TucpQWncMM`N^h1m?y7 zx#-O@_6UD$bvUWTE8Guiv7;Ak)VZ%r)2Ns6-Yoo74S#SdUWxz+Dr!}t)m)^P&HOFB zUeoxTCWSxuR^g{=_@iIgH4jJwB+Dh#nzh3qbksEqa2sJXm3(`u8vvEW9uj_j+AJ`KIT^G~P}R-{`e}uusrlCs@h)Gf0H8m%UV@l@#bFi6yCx!yj53T9gqu z3`F)807d`+U8UwTtTWL%n!7?EwWzgm_~UcIT7lad+%iGurSpZUEB_p3ncFXZS{` zn9WbD>~2P>*8BbaB{S=9=AXCN5r$!&`-VS07jD(8+P7S?b4)5VTFtuY?*{(cxL%FJ zH%Wz)YUK*8MEB=Y|KNKRT1WF&`iDO_7hn#+JfiC+i`V?D`vEMUZ-U-Zp8(y%w@C;9 z%wpwiTaU9l0s&*x=5_>LBz%*MJfcDdn4huMF?p7}RQQ8)F-Mgwwd$38UtTGa!VxYN zzF{(i)LGQ}%_>!Uv^Eaks!QfUtXkaq_EooCQX7YFl8ad{(L5Kln#EHJ_s#gm;alXw z7A=&d4#PJ;vS}Rt&};TeO?Q{I;#I>RUKO(}*C+g<@JE-$ob>K*3V(1}%)dB%tCxX) zWB9-8?>cpe{^IDzHg!XGZ1^?kSYyuZH&JwrIk#Uz(KY7Wu1e9J&$(TdqT9l`&Bx}t zD@CX38Y9k4J~17}x%pgQfugGs8yV-uhwLE6-1du&a-C3gS4&02xkXw9=C)sLoNGzZ zbpr~iDphiBPAjCC+ZU;DS4`2xnLd4R77IgiZeDAKxvh#-!&Ja{C!T* zy|VU`iFUM<1PZ(Hgo5KCL3aswC1U-%j^m-1r&k2%R%HHEnvONjjfuiE(NT0N z=f=dJ?G~HDC>L@Pp-n_F(LQ*ICp-nM%v0g$t{ile%wNccCH`pQn}v}%w|jXKsaGY@ zB6!Xdo`+UOuPa%)tIWAY%wNa{xEljI_6$Z>ydNM_74<~>;3-ddI$CL~0tA|{%KUlG zO&Qe9VRSWi>|GW0M5n>smTFq$WVF&gJIjZqb>`2&T^9Kh7+sYed#NnZp+HnE&yGv2b%-d0S>b6cV47@}jK z5SMvE7o96kqm?I6rm`X&^9KvaUzKxPhPwhpH;{wq3c(A_M+zo7AEWaxVQohK0_V02 zcL{RLRt6M;r)lm&R_1bR$e;e42Hi5wZQdB$GISDj@PAq&E4!s)t|Na8x@DZ(uss!3 zhK>wP*qN-X%Z)j=0J?q1xuxWoXXtX8ut-+k&fiNV^OqujL?eT4pL1?DcESclX_ho$ zSF*CSa-0pZ%>~fyW6lligH8mF-9(xlO*nQZD}&sW`Gb&-yQI64nfi%l5V3QbaO_Q1 zMhS_SKjz%vHrGKnqVc0#%n@BV$C0l=Rz?|F0^Ppl+(PgYO?V-)GGDw01iWhw>0W;O?V-)G6)XSp+vgv<=g}~R-p;6Lsq7Ot-9k#w>hMu3=>|5taO4~k!}(k ztE3pNl!=z4TND|70Y(PDF!JB^ckR4LT~*onr&rCPwBcF_=|j=ks(7g@tzIXJj>N~$ zAKVXLJ#eYG97TuX;~A?L(6P&<0xZIVm2O^LJ+(U(-6*^VV86>dyLxkn(jt5W97_(`XiTv(VoF=+0<JD_<=YFCmI-E^^R~ zL@MUhOVo<9B@Ap{wc|e6rOJPNdSjE#_`HDqB?nrZNE~)H|RkCnK=e&Jy5;M1sRw{<* zHq(l2UZMbiflu)2e;nmT75tIB%xx1nv|a)$a%@l0q3xLkTJfxeBnQz+Fd0@Y6qOx?5k)XIx70f+QfuVEUrp(4vrWH@$OBPb$ z#F|cl#ALHB)&8^qYOtc`HrHsyd+(}1_Y4-Vn_0NHoj)%)M@k89bAeXu!3f1j6Tinq zx^84WHccXQH?J3PITty%S)&zCUdkgv z$?b)Ee=}(T#iLAspj!qTte}-EwBm`F5I9;2Vw})DM#k%=K%t$21S1Tt+1 zP+mCE%^Cj4gKcHT=d5A@+mu#x8LfEcQ9h7wD+s{gnAM8Dol7LBB7Qho_V8pD%dm<9 z(G$#rAoM<>6&pOHhkth%9e?9Qh{$U1aW{jRYie!AyPAUtN{ea5Ks5 zP``3i+<@mAZLl*1F1G~H6BwO^$NIbSB`<4%2fF|W?7%eo#~1`v3T|6wynnxt*orQU z2|-L24Y@)K`S=RMWul4yK#IKx=!d_ zjU9ss1vM6WvVKj8?2T=(G?NNgbmbc^a?KKob*iFXrf})>MMkAv9Uq%@QNUa$kN1zY-^PxCW~FU2LyriI1fzbWsmaK8njnax;c*ZD=arBlg(5c-YPX){XdT zvr8=|0Ub{$z_INNojv()GN7qV@vI^^I)6mBFMPc0h9zh}K0vYqfaDZJ)TYGf0=Bu8 zU+s|!w{}drArA04|EM7d@@Pz!3W(C&lek?n2JjZ&{h%}Q+p zA5nRCsi^tvU!l zpo&TFso<2V*wj^``KLq2Ssi0SSMu@&`cWwW0B|JeqMf3%Gt0P2N&!~KqkERO+d(WW zc?b&pG4c?cyon&&DK1TlQo*T&V72qu`rA5|cL{55SQ_j^SHm9#{pjoz9Xh6&*d>b2 zv5Ik$(Gsi)z-kCZes2icf;Bg}yP(8Fu!=tliq7y-nu%SY=v)dsPKW|w#ROpGoylZ> zq%Bx;le$Pf1X1FTHWki8FlS=x6rG0&D+Fr{utM<8X2`iiBD~WUS4M$ehrT90`^8DfRVCT7q?nDvFYqq9oooYTKFLUCXml`!P zL^qC;aZ}t%j?EBIQeAIuZ=!pK@@}D;PfCW?ES(xH23jOy=V7C<^z+8FVxehQhN zwx9jZ6>C#YS_qmuj|1EkrHN;OU)4iM2YsIV#uY17VGzQYmO6xp^&`}wyukBP4xxD- zF67B)reba(_%%hBqP+8QC~u>(h%E$mraGyH6I<(X8^JpbV4Tfy`X-sVVpT)-aHlcqr4YN#W@#!O1Uw;vSvAUM7Nxs z=;c%(R^8W{X5v~!hYSZ{mJ0anZ2l)@2mFJ4^WHHXQW3lIg{h57LQS}jURm!z6s4CS zQ(ZwJ@+41W4VJj19hnM`r415S?Bv%dJ+K1Q1WI^=S$@N3!UIzqQb7w1I5;#!-hM+z zHYRe!l0IqP9L%$0kJK=3zglNhh~Y6VWAysdeuh zVE!n9ngq%th^fU>#}pdFkk}NA`MCLXbxac#>eEA|{ zKAsM;^@Kg)JH6PkKlttkBX1ja<}<&hh?oMU0Qi<*5fegJ6R9O8#r}l81r?|tbF{nH z3)$eFCowTeBR4=2VhUg~RbiLcSm#x5GNdJD;CIPeq{?!eh`uSO0SlMGMjPY%O`I)WmPbjhFwf6Wpz}DDd)hJS_yh=##rZJZF6E9$i$b=?J1NH zdK1`F-rYpcBv1CFjN#>TYV3@p^sw6azf1@AoXJ7x$w%WsV3 zv)K4jQ0u*tStC=~`m^?}PF4ZEcAH6&{KJTs^1fpLBbal|3dh=6Y;S~7^q~u_7Xx~h z(6eKx2O5KkF<9G3~Y$nQg5*OhtU2ywQ@WC<1zTyY*mWLMrCR z!&$^p>YYcC#gqnx*iCWaEVif89G@3jFYrX1tUH^w?Ow2OE?5#W{M6fY1B0+ZL5Mp`|p7w7>%%q4N~`+>r?{ z0X=hX0nmkw0e8?rRo#W|Yi3+Fsx?G_n$>O9{Cpl5*)y-RmI`XBklWp;5ee(9WN zV|!o#p8Z{Og?;4EIEbZc!o%22l z%#6@zU{im}+t1^;@!&dW3}-{w#g&}%VCTFL=7dl90?<1x6|r610nT|I&;xnK`+Am@ zndGuv+*h0sCwWd%@hza&@@nOrH@m>WvT{BK&}(+h-Y#z0IS+PLTY{xs)UwiRp2Pln zm~-AN!XDXpZOdX#?!K~A;Jy_5RLmu3w`*BevgS5hnhaaCCj17_Yn6*u_iyq~B|`5~ lmX&AT<`+KqPiCUi^*?Pl?d+``&Vc{`002ovPDHLkV1jF)B(4Ae diff --git a/public/images/pokemon/exp/back/shiny/769.json b/public/images/pokemon/exp/back/shiny/769.json deleted file mode 100644 index 62cbee813e4..00000000000 --- a/public/images/pokemon/exp/back/shiny/769.json +++ /dev/null @@ -1,1217 +0,0 @@ -{ - "textures": [ - { - "image": "769.png", - "format": "RGBA8888", - "size": { - "w": 219, - "h": 219 - }, - "scale": 1, - "frames": [ - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 57, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 57, - "h": 48 - }, - "frame": { - "x": 0, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 57, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 113, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 48, - "w": 56, - "h": 48 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 56, - "h": 48 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 96, - "w": 56, - "h": 48 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 144, - "w": 56, - "h": 48 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 25, - "w": 73, - "h": 27 - }, - "frame": { - "x": 0, - "y": 192, - "w": 73, - "h": 27 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 144, - "w": 55, - "h": 48 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 56, - "y": 144, - "w": 55, - "h": 48 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 111, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 111, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 64, - "h": 41 - }, - "frame": { - "x": 111, - "y": 144, - "w": 64, - "h": 41 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 5, - "y": 9, - "w": 64, - "h": 41 - }, - "frame": { - "x": 111, - "y": 144, - "w": 64, - "h": 41 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 73, - "h": 28 - }, - "frame": { - "x": 111, - "y": 185, - "w": 73, - "h": 28 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 73, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 24, - "w": 73, - "h": 28 - }, - "frame": { - "x": 111, - "y": 185, - "w": 73, - "h": 28 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:922ee7114272dbc4670881968061d085:a259b23e31738d576c8d5ad691bec34b:ba2e5a01352778ce94d84746368de8fc$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/769.png b/public/images/pokemon/exp/back/shiny/769.png deleted file mode 100644 index 1d557d1ce12d7f4a17cf32331f9eac2235200951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2107 zcmZvddo&Y%AIBGdEpl0z5|xT6*R98Ba*fHxLauFYLo>wV@{>&FH-4H3xvqvRm(YIk zAU~H?>X=Hd4JCNobx^3WCuHI87ULinQuwn-)EqF*Rw4y~Kqe;U=Eg8gJ;%etpAsUUl0vWK47HS= z*xK6Kn^aG2B3FrW`yw6foB-y$aen{+_zsP{@-iyk)n5YPuVu8z*iKw+t{J4S=@PG&lzQ3VML3Rm)XinyMO+I&W9Hj2A9a#BQ4LE z)$iSPnfI7d-zWN97MbMC|7K({zMy@yI~+j;jmHNkcZ@1qt{aN3;NQku^WBW;{cYqVNS-%*v3a59($T0v=0=~altH8P`!A&s9MkA*^NmIe&IeV}#jMzb2PecSRcxIIQlHh}v2P22Yi?m^QBYj;@- z>!LYVF7&&(@DXEopF(i-y(!e9anMlRHNG(0FYZ`Xw3(wVTr+4D+Az2CXf*$pPySlm zS(+y<*V~!?2d6;Ao%fAe+fJ&4I`%l1*sO^YcGIa*42D~%?skCoweiCI=UxAJu&DZy zZgR{AyNz^jX)%{y;eA<5iW-660Be(@XhDWbkn|n_w`>l!i)UR-hmW2c3swke4t;?O z(is`vJ!8Y6SFq+|MMM@?g~TSA-G4GB0jwPfo72Vk~2ca&`3I zkfvN6K(b^N2e1DhfU^$4idk7F{t6AXgLq^%#0Za+S5w7f^s%+#m*JQGCf4CB4>7@m z^|4v(EYmynuvG3fqzp^q#zOY**i4jb>s=!AeVBG;4iT+Vs3W8F*`m?AqNC>5cj(r; zXK|(R6bmLF5mk)>_(`cKD;;REb=45`P8SozzZE}0iL>Pnzthw=mbWz?MEsuPSYwk( zEPE@*&Yl>H7EcZrV<&F;a1!nhwB8=@oKVjVeI!LoJ`4Z)$gz)2!GhAZUv|no9=;LyV;|V%X9>aVcpof_*Nd!-UOJu_S;=XkA(>>rX zIfPP=PB=*B^+VKL<4EmB8uctSjF3`)l5&1R8>jVFzVE_w02x(>o-a-lz-FC){kdKW z?fuMDho+0#YqDtw=F`REl}{vJF_R6EC^TID@isFb)Cn-#U=muDU25NNJ3&$>M|chO z>n&spvZ4yn3{&Vr>X!3gjbT2-J1yRx_22Bg>AEPZ@%>+2P4}Bi-sJh3QOB=YEw zxS(i3udzT)WTCvWqIq&Mcn@hVy+9FZU?vMQSi_9_kt%s~@K%m>cOx#i#@eBrMs%EU zYCtI9F`N<_vF!Lpp-d?Wt;fdfRI5Q*jl_962>aMWt1ysH*Law!bow28}8To=mzlj8L;J%e5F`QS`I zcI>|6Az4sLN!spDVOVjXT^3scm|n<6PPOwd_Y>RrWh@cYf8c*^7LsLMMBQ7UM9Fpf z=|t#D%M(yWlk~{$XCa0StG|FVeSV;3{9|xktom@p951Ljw(MZ%yKpn2Y4)vCvTJ>0 zPB@97&ya*oCRXcIabcTgmraLt*3Tu9u4=be1m~MND^a9z--_H47;uq0jQ@l^zwB&SlA1{3G~P$`AaF55X%k3x7EDg z==1ajTVtMY(DzwN3o$9N>eZ47keLfkrh2c<)|R@uB!{(yz1P;3&V-5q(z4mkxh9OK z8n;cI)z3Yt8pNRPsFzrr1GV&&Sww(2aYOCQMPLq3xm7mYQ$(-aMd(JuuwxFLDp$74SP@E9hxu*EQ8ju*=jZ z=@jJ;g98HU`OvdoH5`5Jml=y0#P(G6jC=X97>|Hy&1D%uT)SK!qbz1LB9639U2gPc zyRWFf@-doC!3Md0ici^7zX!XlV5_^a)3ephxiUZPZtJz8(Vb?r;GKV{_$Fw2nkD+( N0ca~bWR(Rz;h%o28=wFH diff --git a/public/images/pokemon/exp/back/shiny/770.json b/public/images/pokemon/exp/back/shiny/770.json deleted file mode 100644 index 887f1bbc383..00000000000 --- a/public/images/pokemon/exp/back/shiny/770.json +++ /dev/null @@ -1,1364 +0,0 @@ -{ - "textures": [ - { - "image": "770.png", - "format": "RGBA8888", - "size": { - "w": 380, - "h": 380 - }, - "scale": 1, - "frames": [ - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 86, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 55 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 86, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 55 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 86, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 55 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 86, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 55 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 86, - "h": 55 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 55 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 86, - "h": 55 - }, - "frame": { - "x": 86, - "y": 0, - "w": 86, - "h": 55 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 84, - "h": 56 - }, - "frame": { - "x": 172, - "y": 0, - "w": 84, - "h": 56 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 84, - "h": 56 - }, - "frame": { - "x": 172, - "y": 0, - "w": 84, - "h": 56 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 84, - "h": 56 - }, - "frame": { - "x": 172, - "y": 0, - "w": 84, - "h": 56 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 84, - "h": 56 - }, - "frame": { - "x": 172, - "y": 0, - "w": 84, - "h": 56 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 84, - "h": 56 - }, - "frame": { - "x": 172, - "y": 0, - "w": 84, - "h": 56 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 1, - "w": 84, - "h": 56 - }, - "frame": { - "x": 256, - "y": 0, - "w": 84, - "h": 56 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 82, - "h": 57 - }, - "frame": { - "x": 0, - "y": 55, - "w": 82, - "h": 57 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 82, - "h": 57 - }, - "frame": { - "x": 0, - "y": 55, - "w": 82, - "h": 57 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 82, - "h": 57 - }, - "frame": { - "x": 0, - "y": 55, - "w": 82, - "h": 57 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 82, - "h": 57 - }, - "frame": { - "x": 0, - "y": 55, - "w": 82, - "h": 57 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 82, - "h": 57 - }, - "frame": { - "x": 0, - "y": 55, - "w": 82, - "h": 57 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 0, - "w": 82, - "h": 57 - }, - "frame": { - "x": 82, - "y": 55, - "w": 82, - "h": 57 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 84, - "h": 55 - }, - "frame": { - "x": 164, - "y": 56, - "w": 84, - "h": 55 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 84, - "h": 55 - }, - "frame": { - "x": 164, - "y": 56, - "w": 84, - "h": 55 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 84, - "h": 55 - }, - "frame": { - "x": 164, - "y": 56, - "w": 84, - "h": 55 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 84, - "h": 55 - }, - "frame": { - "x": 164, - "y": 56, - "w": 84, - "h": 55 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 84, - "h": 55 - }, - "frame": { - "x": 164, - "y": 56, - "w": 84, - "h": 55 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 6, - "y": 2, - "w": 84, - "h": 55 - }, - "frame": { - "x": 248, - "y": 56, - "w": 84, - "h": 55 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 82, - "h": 56 - }, - "frame": { - "x": 164, - "y": 111, - "w": 82, - "h": 56 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 82, - "h": 56 - }, - "frame": { - "x": 164, - "y": 111, - "w": 82, - "h": 56 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 82, - "h": 56 - }, - "frame": { - "x": 164, - "y": 111, - "w": 82, - "h": 56 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 82, - "h": 56 - }, - "frame": { - "x": 164, - "y": 111, - "w": 82, - "h": 56 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 82, - "h": 56 - }, - "frame": { - "x": 164, - "y": 111, - "w": 82, - "h": 56 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 82, - "h": 56 - }, - "frame": { - "x": 164, - "y": 111, - "w": 82, - "h": 56 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 82, - "h": 56 - }, - "frame": { - "x": 246, - "y": 111, - "w": 82, - "h": 56 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 7, - "y": 1, - "w": 82, - "h": 56 - }, - "frame": { - "x": 0, - "y": 112, - "w": 82, - "h": 56 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 82, - "y": 112, - "w": 80, - "h": 57 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 82, - "y": 112, - "w": 80, - "h": 57 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 82, - "y": 112, - "w": 80, - "h": 57 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 82, - "y": 112, - "w": 80, - "h": 57 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 82, - "y": 112, - "w": 80, - "h": 57 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 0, - "y": 168, - "w": 80, - "h": 57 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 0, - "y": 168, - "w": 80, - "h": 57 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 0, - "y": 168, - "w": 80, - "h": 57 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 0, - "y": 168, - "w": 80, - "h": 57 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 0, - "y": 168, - "w": 80, - "h": 57 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 162, - "y": 167, - "w": 80, - "h": 57 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 80, - "y": 169, - "w": 80, - "h": 57 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 0, - "y": 225, - "w": 80, - "h": 57 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 8, - "y": 0, - "w": 80, - "h": 57 - }, - "frame": { - "x": 242, - "y": 167, - "w": 80, - "h": 57 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 78, - "h": 57 - }, - "frame": { - "x": 160, - "y": 224, - "w": 78, - "h": 57 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 78, - "h": 57 - }, - "frame": { - "x": 160, - "y": 224, - "w": 78, - "h": 57 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 78, - "h": 57 - }, - "frame": { - "x": 160, - "y": 224, - "w": 78, - "h": 57 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 78, - "h": 57 - }, - "frame": { - "x": 160, - "y": 224, - "w": 78, - "h": 57 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 78, - "h": 57 - }, - "frame": { - "x": 160, - "y": 224, - "w": 78, - "h": 57 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 78, - "h": 57 - }, - "frame": { - "x": 160, - "y": 224, - "w": 78, - "h": 57 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 78, - "h": 57 - }, - "frame": { - "x": 80, - "y": 226, - "w": 78, - "h": 57 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 78, - "h": 57 - }, - "frame": { - "x": 0, - "y": 282, - "w": 78, - "h": 57 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 19, - "w": 96, - "h": 38 - }, - "frame": { - "x": 0, - "y": 339, - "w": 96, - "h": 38 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 85, - "h": 51 - }, - "frame": { - "x": 78, - "y": 283, - "w": 85, - "h": 51 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 2, - "y": 13, - "w": 92, - "h": 44 - }, - "frame": { - "x": 96, - "y": 334, - "w": 92, - "h": 44 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 85, - "h": 51 - }, - "frame": { - "x": 163, - "y": 281, - "w": 85, - "h": 51 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 2, - "y": 13, - "w": 92, - "h": 44 - }, - "frame": { - "x": 238, - "y": 224, - "w": 92, - "h": 44 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 19, - "w": 96, - "h": 38 - }, - "frame": { - "x": 188, - "y": 332, - "w": 96, - "h": 38 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 19, - "w": 96, - "h": 38 - }, - "frame": { - "x": 188, - "y": 332, - "w": 96, - "h": 38 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 19, - "w": 96, - "h": 38 - }, - "frame": { - "x": 248, - "y": 268, - "w": 96, - "h": 38 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 19, - "w": 96, - "h": 38 - }, - "frame": { - "x": 248, - "y": 268, - "w": 96, - "h": 38 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 19, - "w": 96, - "h": 38 - }, - "frame": { - "x": 284, - "y": 306, - "w": 96, - "h": 38 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:55ae04ada6f829288ce7164dade3ea4b:cc59d4502a219eb4351f2cd3327463ac:9a5e6a86eb0697afa19bc4a32f422cc1$" - } -} diff --git a/public/images/pokemon/exp/back/shiny/770.png b/public/images/pokemon/exp/back/shiny/770.png deleted file mode 100644 index 97099a7a5e4f362a47ae049e8d401ba9de57ff7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5669 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 diff --git a/public/images/pokemon/exp/shiny/769.json b/public/images/pokemon/exp/shiny/769.json deleted file mode 100644 index 640351de7af..00000000000 --- a/public/images/pokemon/exp/shiny/769.json +++ /dev/null @@ -1,1217 +0,0 @@ -{ - "textures": [ - { - "image": "769.png", - "format": "RGBA8888", - "size": { - "w": 222, - "h": 222 - }, - "scale": 1, - "frames": [ - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 61, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 46 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 2, - "y": 5, - "w": 61, - "h": 46 - }, - "frame": { - "x": 0, - "y": 0, - "w": 61, - "h": 46 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 57, - "h": 48 - }, - "frame": { - "x": 61, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 4, - "y": 1, - "w": 57, - "h": 48 - }, - "frame": { - "x": 61, - "y": 0, - "w": 57, - "h": 48 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 46, - "w": 56, - "h": 48 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 118, - "y": 0, - "w": 56, - "h": 48 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 94, - "w": 56, - "h": 48 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 0, - "y": 142, - "w": 56, - "h": 48 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 21, - "w": 65, - "h": 32 - }, - "frame": { - "x": 0, - "y": 190, - "w": 65, - "h": 32 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 56, - "h": 48 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 56, - "y": 48, - "w": 56, - "h": 48 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 56, - "h": 48 - }, - "frame": { - "x": 56, - "y": 96, - "w": 56, - "h": 48 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 20, - "w": 65, - "h": 33 - }, - "frame": { - "x": 56, - "y": 144, - "w": 65, - "h": 33 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 0, - "y": 20, - "w": 65, - "h": 33 - }, - "frame": { - "x": 56, - "y": 144, - "w": 65, - "h": 33 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 112, - "y": 96, - "w": 55, - "h": 48 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 121, - "y": 144, - "w": 55, - "h": 48 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 121, - "y": 144, - "w": 55, - "h": 48 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 167, - "y": 48, - "w": 55, - "h": 48 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 65, - "h": 53 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 55, - "h": 48 - }, - "frame": { - "x": 167, - "y": 96, - "w": 55, - "h": 48 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:66382a2034cf2f2852005e2fca1334ac:1df2264887f3adb24b5dd820c7e95284:ba2e5a01352778ce94d84746368de8fc$" - } -} diff --git a/public/images/pokemon/exp/shiny/769.png b/public/images/pokemon/exp/shiny/769.png deleted file mode 100644 index d5689d881c6b3b259c677e926bde4e5a58792209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2353 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 diff --git a/public/images/pokemon/exp/shiny/844.json b/public/images/pokemon/exp/shiny/844.json deleted file mode 100644 index 09aa143cb67..00000000000 --- a/public/images/pokemon/exp/shiny/844.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "textures": [ - { - "image": "844.png", - "format": "RGBA8888", - "size": { - "w": 216, - "h": 216 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 4, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 54 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 86, - "y": 0, - "w": 86, - "h": 54 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 3, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 86, - "y": 0, - "w": 86, - "h": 54 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 0, - "y": 54, - "w": 86, - "h": 54 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 2, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 0, - "y": 54, - "w": 86, - "h": 54 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 54 - }, - "frame": { - "x": 86, - "y": 54, - "w": 85, - "h": 54 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 85, - "h": 54 - }, - "frame": { - "x": 86, - "y": 54, - "w": 85, - "h": 54 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 84, - "h": 54 - }, - "frame": { - "x": 0, - "y": 108, - "w": 84, - "h": 54 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 84, - "h": 54 - }, - "frame": { - "x": 0, - "y": 108, - "w": 84, - "h": 54 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 84, - "h": 54 - }, - "frame": { - "x": 0, - "y": 162, - "w": 84, - "h": 54 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 84, - "h": 54 - }, - "frame": { - "x": 0, - "y": 162, - "w": 84, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 82, - "h": 54 - }, - "frame": { - "x": 84, - "y": 108, - "w": 82, - "h": 54 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 82, - "h": 54 - }, - "frame": { - "x": 84, - "y": 108, - "w": 82, - "h": 54 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 90, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 81, - "h": 54 - }, - "frame": { - "x": 84, - "y": 162, - "w": 81, - "h": 54 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:05e465c32fe20d63f626950aec04b8b3:439b1bdbab19f47195d6524787ecf409:791c04bd94958ea464eaa02b1a2ef466$" - } -} diff --git a/public/images/pokemon/exp/shiny/844.png b/public/images/pokemon/exp/shiny/844.png deleted file mode 100644 index 252aa8b8df9ed0339048c04e435d71d525f734fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4739 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 RpuqqD002ovPDHLkV1oW^YIXns diff --git a/public/images/pokemon/exp/shiny/902-female.json b/public/images/pokemon/exp/shiny/902-female.json deleted file mode 100644 index b2acc243003..00000000000 --- a/public/images/pokemon/exp/shiny/902-female.json +++ /dev/null @@ -1,1343 +0,0 @@ -{ - "textures": [ - { - "image": "902-female.png", - "format": "RGBA8888", - "size": { - "w": 256, - "h": 256 - }, - "scale": 1, - "frames": [ - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 87, - "h": 53 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 6, - "w": 89, - "h": 53 - }, - "frame": { - "x": 87, - "y": 0, - "w": 89, - "h": 53 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 3, - "w": 78, - "h": 65 - }, - "frame": { - "x": 176, - "y": 0, - "w": 78, - "h": 65 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 2, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 0, - "y": 53, - "w": 91, - "h": 53 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 84, - "h": 54 - }, - "frame": { - "x": 91, - "y": 53, - "w": 84, - "h": 54 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 81, - "h": 64 - }, - "frame": { - "x": 175, - "y": 65, - "w": 81, - "h": 64 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 81, - "h": 64 - }, - "frame": { - "x": 175, - "y": 65, - "w": 81, - "h": 64 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 106, - "w": 87, - "h": 53 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 0, - "y": 8, - "w": 87, - "h": 53 - }, - "frame": { - "x": 0, - "y": 106, - "w": 87, - "h": 53 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 1, - "y": 5, - "w": 83, - "h": 58 - }, - "frame": { - "x": 87, - "y": 107, - "w": 83, - "h": 58 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 81, - "h": 64 - }, - "frame": { - "x": 170, - "y": 129, - "w": 81, - "h": 64 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 81, - "h": 64 - }, - "frame": { - "x": 170, - "y": 129, - "w": 81, - "h": 64 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 5, - "y": 0, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 165, - "w": 92, - "h": 54 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 94, - "h": 55 - }, - "frame": { - "x": 92, - "y": 193, - "w": 94, - "h": 55 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 94, - "h": 55 - }, - "frame": { - "x": 92, - "y": 193, - "w": 94, - "h": 55 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 94, - "h": 55 - }, - "frame": { - "x": 92, - "y": 193, - "w": 94, - "h": 55 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 100, - "h": 68 - }, - "spriteSourceSize": { - "x": 6, - "y": 0, - "w": 94, - "h": 55 - }, - "frame": { - "x": 92, - "y": 193, - "w": 94, - "h": 55 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ab9ce73c2d4f4722486455dc17452993:ab5c13c3b6e8c1e1332cefd93d4723ce:16072dc598107c41afadd9df4d7c27da$" - } -} diff --git a/public/images/pokemon/exp/shiny/902-female.png b/public/images/pokemon/exp/shiny/902-female.png deleted file mode 100644 index c51e2ca5481aed239d2c540e4d588a895373de35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7346 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 Y4?@WkZnk<0DgXcg07*qoM6N<$f?FZ%5dZ)H diff --git a/public/images/pokemon/exp/shiny/902.json b/public/images/pokemon/exp/shiny/902.json deleted file mode 100644 index 13b0678dbe7..00000000000 --- a/public/images/pokemon/exp/shiny/902.json +++ /dev/null @@ -1,1364 +0,0 @@ -{ - "textures": [ - { - "image": "902.png", - "format": "RGBA8888", - "size": { - "w": 256, - "h": 256 - }, - "scale": 1, - "frames": [ - { - "filename": "0013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 88, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 53 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 88, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 53 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 88, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 53 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 88, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 53 - } - }, - { - "filename": "0045.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 88, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 53 - } - }, - { - "filename": "0046.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 88, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 53 - } - }, - { - "filename": "0053.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 88, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 53 - } - }, - { - "filename": "0054.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 4, - "w": 88, - "h": 53 - }, - "frame": { - "x": 0, - "y": 0, - "w": 88, - "h": 53 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 88, - "y": 0, - "w": 91, - "h": 53 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 88, - "y": 0, - "w": 91, - "h": 53 - } - }, - { - "filename": "0049.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 88, - "y": 0, - "w": 91, - "h": 53 - } - }, - { - "filename": "0050.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 5, - "y": 2, - "w": 91, - "h": 53 - }, - "frame": { - "x": 88, - "y": 0, - "w": 91, - "h": 53 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 77, - "h": 71 - }, - "frame": { - "x": 179, - "y": 0, - "w": 77, - "h": 71 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 77, - "h": 71 - }, - "frame": { - "x": 179, - "y": 0, - "w": 77, - "h": 71 - } - }, - { - "filename": "0033.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 77, - "h": 71 - }, - "frame": { - "x": 179, - "y": 0, - "w": 77, - "h": 71 - } - }, - { - "filename": "0034.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 1, - "y": 0, - "w": 77, - "h": 71 - }, - "frame": { - "x": 179, - "y": 0, - "w": 77, - "h": 71 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 88, - "h": 54 - }, - "frame": { - "x": 0, - "y": 53, - "w": 88, - "h": 54 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 88, - "h": 54 - }, - "frame": { - "x": 0, - "y": 53, - "w": 88, - "h": 54 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 88, - "h": 54 - }, - "frame": { - "x": 0, - "y": 53, - "w": 88, - "h": 54 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 88, - "h": 54 - }, - "frame": { - "x": 0, - "y": 53, - "w": 88, - "h": 54 - } - }, - { - "filename": "0043.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 88, - "h": 54 - }, - "frame": { - "x": 0, - "y": 53, - "w": 88, - "h": 54 - } - }, - { - "filename": "0044.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 88, - "h": 54 - }, - "frame": { - "x": 0, - "y": 53, - "w": 88, - "h": 54 - } - }, - { - "filename": "0055.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 88, - "h": 54 - }, - "frame": { - "x": 0, - "y": 53, - "w": 88, - "h": 54 - } - }, - { - "filename": "0056.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 6, - "w": 88, - "h": 54 - }, - "frame": { - "x": 0, - "y": 53, - "w": 88, - "h": 54 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 88, - "h": 56 - }, - "frame": { - "x": 88, - "y": 53, - "w": 88, - "h": 56 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 88, - "h": 56 - }, - "frame": { - "x": 88, - "y": 53, - "w": 88, - "h": 56 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 88, - "h": 56 - }, - "frame": { - "x": 88, - "y": 53, - "w": 88, - "h": 56 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 88, - "h": 56 - }, - "frame": { - "x": 88, - "y": 53, - "w": 88, - "h": 56 - } - }, - { - "filename": "0041.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 88, - "h": 56 - }, - "frame": { - "x": 88, - "y": 53, - "w": 88, - "h": 56 - } - }, - { - "filename": "0042.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 88, - "h": 56 - }, - "frame": { - "x": 88, - "y": 53, - "w": 88, - "h": 56 - } - }, - { - "filename": "0057.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 88, - "h": 56 - }, - "frame": { - "x": 88, - "y": 53, - "w": 88, - "h": 56 - } - }, - { - "filename": "0058.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 88, - "h": 56 - }, - "frame": { - "x": 88, - "y": 53, - "w": 88, - "h": 56 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 109, - "w": 92, - "h": 54 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 109, - "w": 92, - "h": 54 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 109, - "w": 92, - "h": 54 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 109, - "w": 92, - "h": 54 - } - }, - { - "filename": "0047.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 109, - "w": 92, - "h": 54 - } - }, - { - "filename": "0048.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 92, - "h": 54 - }, - "frame": { - "x": 0, - "y": 109, - "w": 92, - "h": 54 - } - }, - { - "filename": "0051.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 92, - "h": 54 - }, - "frame": { - "x": 92, - "y": 109, - "w": 92, - "h": 54 - } - }, - { - "filename": "0052.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 3, - "y": 1, - "w": 92, - "h": 54 - }, - "frame": { - "x": 92, - "y": 109, - "w": 92, - "h": 54 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0039.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0040.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0059.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0060.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0061.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 7, - "w": 86, - "h": 59 - }, - "frame": { - "x": 0, - "y": 163, - "w": 86, - "h": 59 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 83, - "h": 61 - }, - "frame": { - "x": 86, - "y": 163, - "w": 83, - "h": 61 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 83, - "h": 61 - }, - "frame": { - "x": 86, - "y": 163, - "w": 83, - "h": 61 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 83, - "h": 61 - }, - "frame": { - "x": 86, - "y": 163, - "w": 83, - "h": 61 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 83, - "h": 61 - }, - "frame": { - "x": 86, - "y": 163, - "w": 83, - "h": 61 - } - }, - { - "filename": "0037.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 83, - "h": 61 - }, - "frame": { - "x": 86, - "y": 163, - "w": 83, - "h": 61 - } - }, - { - "filename": "0038.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 83, - "h": 61 - }, - "frame": { - "x": 86, - "y": 163, - "w": 83, - "h": 61 - } - }, - { - "filename": "0062.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 2, - "y": 6, - "w": 83, - "h": 61 - }, - "frame": { - "x": 86, - "y": 163, - "w": 83, - "h": 61 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 169, - "y": 163, - "w": 81, - "h": 67 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 169, - "y": 163, - "w": 81, - "h": 67 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 169, - "y": 163, - "w": 81, - "h": 67 - } - }, - { - "filename": "0032.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 169, - "y": 163, - "w": 81, - "h": 67 - } - }, - { - "filename": "0035.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 169, - "y": 163, - "w": 81, - "h": 67 - } - }, - { - "filename": "0036.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 169, - "y": 163, - "w": 81, - "h": 67 - } - }, - { - "filename": "0063.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 169, - "y": 163, - "w": 81, - "h": 67 - } - }, - { - "filename": "0064.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 96, - "h": 71 - }, - "spriteSourceSize": { - "x": 0, - "y": 4, - "w": 81, - "h": 67 - }, - "frame": { - "x": 169, - "y": 163, - "w": 81, - "h": 67 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dd520ee67a5337a030aa8818dad70dc7:1454ab42db203380c904afffd4339145:7d196ae78ad956c5eb9131e145b5922f$" - } -} diff --git a/public/images/pokemon/exp/shiny/902.png b/public/images/pokemon/exp/shiny/902.png deleted file mode 100644 index 495de913823549195d6afebb0eb0a01d9066a354..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6875 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 z z7QT>qMw8Ev9v{X*N76LbVxY0`NlBdKMCS=MCeaBj}*3MWsg{_F4GuPk_!5#zD8tTi~GU3Bva$N82OY zLAQqnHf`Z+=S1fUyMqqu`Elp__qBLDG1?y44mz~(kq*dELXd6eMCS{;gATsXL1zqy zxzYKtD??p zK{!7;e~6SZ>37f(mv}kR6Gqu&fHHWKqx1J6C;B&vzv*Q`jx)~ucN5Nx6`+iNZDx$u zk0$k;9MF)qn?Yd8vH90#UdENa;wgC{C^&)6IGv#tc)~04b9O-jF$+ZFZAasB!6E(*`zUZDp#&K@DkShP0 zGSJxxFyIhNB%V^kF}ZVSDOK=AKxnK8G&ow~vI%sAgDwdo3AyOF4T!OV?HUf-FSE9D0*`nV;Ck<@cYi1{aZ0}IUG}BP; zdKLoMDo%S$t)gYWgKi%UYzqCdT7Aa3p_*|_?aGy{ZIKz4xJLbrK?j|_L(ZNS$s$-& zMI@TSvL<%t18qx81yfU1;~*Sx&?y6()oT_2UW1PWRgGlCP5`SF9H~;-nHC;u2i-o( z4_q49m@RD~guB*stu)nCAX^zmR?N+hq^gsOl-@`O#Q6C5YxmGQ)HAR(Ag!fXx>lO1 z4T)ij#neTXHl|nrHGU{8d=|5tiRrtGs#bxaYC)>d#oF+NtdzmDfH}Fe@C}*W$Pl_9 z?2eyduVN#X2;^ML(g0nojia80ac3dkE`!7RTRI`@Ews?dqPDFDT`*iG zN!ou$r%kO13gTWoAE=V6MSU?Jq;1=8jsiJcT;8=%jrPz&CmeiR_KU`DG3b`M>#f3Y zu3ETqoUS-qjKC{v<=NHql_Hct84l4xx3hy;?FQXd?3TFe?cqo0O|;5Y^sbmK0sXPB zS!M}ZEtf&uR<3dFmn zTZko4ETC##uXr!spL-Yc!IOzvZDm_7wc(H`_tZ|tbkW_?#R3MFHE>tli^tORN71ak z%7@pgX1BCjF16v%(-K76K3#OTbg}GQ@2Y$87!s&PmCmC_ADL-ow_FM-@UnDI2?qA* zqPvB~(pP;c!b4I40w|)n6>)+3&?$=v~aG znI6B)a%ryKbiwtS6}nsf#mbnjdTrkzTc%c7axnApn$D6UaO`C|bWOMH#TvdBPgq$s z0jyQV^{Wx{grjtvBs6cjW#?+9tDY^eU71?h1LR=ocpM+Ird#7|U*CW~7wxeh%VLoe z@J41^F46J$ic&o#sKHQ?eobH-#Wrn$!4@LHun=>1s z(IQP`dQPQsJf7;dzL;<4$^W!-hbRC7K@^5(lVEbdAKU)yixUbDE_iRk-Tu$-Qmh~%6JhWMS1KmA)1-jq&>M9JzJQ_npL_|bHL@%?I Vk@*b%irN4G002ovPDHLkV1ho*2K)d3 diff --git a/public/images/pokemon/shiny/550-white-striped.json b/public/images/pokemon/shiny/550-white-striped.json index 83d6d8ff942..f667f112133 100644 --- a/public/images/pokemon/shiny/550-white-striped.json +++ b/public/images/pokemon/shiny/550-white-striped.json @@ -1,41 +1,810 @@ -{ - "textures": [ - { - "image": "550-white-striped.png", - "format": "RGBA8888", - "size": { - "w": 38, - "h": 38 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 38, - "h": 35 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 38, - "h": 35 - }, - "frame": { - "x": 0, - "y": 0, - "w": 38, - "h": 35 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:592de4969ade5134b1be515df3b8d4a7:457dbd40f7a620a5fcd261957e7fda29:f97864a794849ea9866466461e0e9a7f$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 37, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 111, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 219, "y": 102, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 199, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 166, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 133, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 100, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 67, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 34, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 170, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 34, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 36, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 136, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 183, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 147, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 153, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 68, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 123, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 42, "y": 0, "w": 41, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 41, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 83, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 195, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 156, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 117, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 115, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 37, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 111, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 219, "y": 102, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 199, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 166, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 133, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 100, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 67, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 34, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 170, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 34, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 36, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 0, "y": 136, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 183, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 147, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 153, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 68, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 123, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 42, "y": 0, "w": 41, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 41, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 83, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 195, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 156, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 117, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 115, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 37, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 111, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 219, "y": 102, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 199, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 166, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 133, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 100, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 67, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 34, "y": 170, "w": 33, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 33, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 0, "y": 170, "w": 34, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 34, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 36, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 136, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 183, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 147, "y": 102, "w": 36, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 36, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 153, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 0, "y": 68, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 123, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 0, "y": 0, "w": 42, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 5, "w": 42, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 42, "y": 0, "w": 41, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 41, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 83, "y": 0, "w": 40, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 4, "w": 40, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 195, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 156, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 3, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 117, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 115, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 37, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 71, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 78, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 106, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 2, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 39, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 13, "y": 2, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 141, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 0, "y": 34, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 176, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 202, "y": 0, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 0, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 74, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 0, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 211, "y": 136, "w": 35, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 0, "w": 35, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 191, "y": 68, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 0, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 163, "y": 0, "w": 39, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 1, "w": 39, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 77, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 1, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 39, "y": 68, "w": 38, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 1, "w": 38, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 0, "y": 102, "w": 37, "h": 34 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 1, "w": 37, "h": 34 }, + "sourceSize": { "w": 52, "h": 39 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "550-white-striped.png", + "format": "I8", + "size": { "w": 252, "h": 204 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/shiny/550-white-striped.png b/public/images/pokemon/shiny/550-white-striped.png index 183fd1823d5b62b498dacdd70d9a7baa99136e2e..157594248937a4e2e00a15168f7b83738ddfe4a4 100644 GIT binary patch literal 4938 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 IM6N<$g4zW0?f?J) literal 482 zcmV<80UiE{P)lq=oQbj~6Q8u(lcW_>dMTtk zMco|X4x9KJVnY5Iv z5;xeIE+tG?4_0*=ajXrq?l_g0BDE#hUAM92y$#Q2m?352@OTV|?S1va2-MBhE zz_USDpn7SltpTVU=H0v+gpBo3$jeKB{>K?GSnQ1(>*btSdm-QP@i7w8=tzR2t;fJPqBL zCJs?F`_&OVc4T6FVvks|18xVBxkgnv^Dd{+sBh zbSauk`F-ERK0sozGMX&TmWphb@(%lALM|@<098zn?6a3RlSdaH?iyRYdTW?(YA9Zk z(aT=AoBPFtkkanQ4;)tB@Ag(%Q$?!|2bEW0eJFRN*#kDa?cr3V=40vHEuznCLh|as zH+vZRbK=Y785V-)?OJ$(JOw=n=@@;!oh03ysx-; zQ^s^P(3+H}{Ho}$o-sYvBM;Bl%{}br%7k@xRy&7x>dOoIYkowd1&xZA{+FR!;-Bv*!XeX}= zdT3j~eQlVXvg|wTg0Ejz%LfvFnd{8+bN`HJNztO+QWu2vl19(ot~AzOOx*~r00!eE z)xbCvM2f`sQWDJ|$vI$&dy+)spYIM8@jW?lPGUYjrC!+<#@RVAfqUC}g!E&B->Ii_ z{^G|8%1$xn*FQ~@Ihed6CQXUw`P7YT;d(Rb?)F>b+3JDJu)Et4*Fxb&?|UB&h#O@! zi)wk0ER?Lc!y?vu`kUhaPxc*_-?P{?t1I4>jEc>!GRa1|xgltj#wxX=WM8<7KFrG6z6^L$ZUK=1J(oO*Gs(wJk<7==$_^ymLtblyywN*%EVrgWI zCU^77gAV3{&T%YND{$P=)eit$*5lssrlo5OYW?VXyCy2k&lwX9yVWv}X0BJ7s(C~< zbs2}PcWFx%!D*uq2yfdzfeicmHtn4`4?+!NMr8xsFIOv;y1JM4W|d7svtuv}S1I16$7xQA4!) zP+&)X8ss{yaP{_et>veJ>1YFblPixsAETYPufoGC8{S7XB-?V*s*hLWS_frQRw6V3 z2FX$?dN0J-eWpt~^Ef*vlwec)Nn0W9BcW9ITc*Do;%vpCH%G!@H3aP{)<$lnDJMeS znhlaKYRG2h-XP&Qf%Bcif(lb+O|2dp1U8?@=QU7Gp%n6Zqd*2L-Eq=A>lVe9bGqG5 z5=e%+Ill3Ai_{@}N8il|e?`i@!5_$Y%f@p5%>zlSe2ouE4DrHzV<4PoSva%I!FA%= z%Y&~L5n3hLNEZ^k*K|yMA%C@sqRE`XoK{t{XVE+Kw9!4OKJ>@q{ZCiuMj#fVU2Kne zpONS~AdL5POe^WA5-k0#gfh|zy2|GIDVeAwONUbnkOBC$D^*~0Y1C+frOrXEKrrXe z#C5JYXs>;gV)R>uDxv^`8jH8U$M|lIOp7^2&XGQMG+#6gCV4AFhJ-L-736fht>pyK z)OTbwIB+7?3)s`cjrD!vk)m4toqZtM^4dQlOcKLJTTA}thXi4z1AW4^PVvL9Rb@K* zPcFGs;T`=n7uWa`bheDi5_ApsrL;Z%wTn@CIF|9yxZ~&KEUU7^dm&e9E1E1h)kOgE zS$L9UdK^c6t`VeS^r);M?vWsj3YNclh6oJrdKBBZ$J6smX`J>#E<4xRP_R^}2zbuF zUo|rf&s}c1w5oe5hZO3VVX#idU?geN=Jl4`d8uigdh$Ovd@ca))dpOows{YKr@Ab;IylEDn3E_`+gK1U zS6D@?@;YHDIJy`H{=hdCqriP1`qoT_#pHI`CLoY*`cf4HH`A_lUvR!P{-r_vEqcXw4yUs8=%q*Kzh{kX2aY5-lNA)->_Y50EueZ1LJ literal 415 zcmV;Q0bu@#P)p;r}w-_-tMBNK7;KAz3)S+8~qJL(oDmEU0t;$nkyN9eO zz7B|uf2#HA{)>|qvrwU?{QRBW*4OOM*X>``shd%?)$zPn?QkAzrSf$6xMp94X2(&p z)yY??HmXJsY9*t8e9uz_pl|b?20qT_$JV^T;BteeXJ&6UH^y7u8eFwZsX=eR$dy)* zC`J@)UTT1jc?lqE3+DT1c2?PO)~FT>rPGBKx=SVBiItRgL98e*rAt>Q+o0oQI}BDT zp8*7uhZ!7_HNkq0fls<*#n7xWa^%*zwH)4>XpyAH?I8BjT8|}#-y2NRv@T#lWS%A# z@Bj1aOfw_$N&mi%7A)p0O}+w!dNy&)uS(%4a@j!+^T?k6kZ&~iq}Wd`<+}g?002ov JPDHLkV1gh;ynO%w diff --git a/public/images/pokemon/shiny/770.json b/public/images/pokemon/shiny/770.json index 36d47eca80b..2170fc02cbc 100644 --- a/public/images/pokemon/shiny/770.json +++ b/public/images/pokemon/shiny/770.json @@ -1,41 +1,594 @@ -{ - "textures": [ - { - "image": "770.png", - "format": "RGBA8888", - "size": { - "w": 76, - "h": 76 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 76, - "h": 57 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 76, - "h": 57 - }, - "frame": { - "x": 0, - "y": 0, - "w": 76, - "h": 57 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e1343105f8aae6ed43401fdba2ce5ba4:cc12a6c56da88f7b185b8fb2fc3409fa:9a5e6a86eb0697afa19bc4a32f422cc1$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 78, "y": 110, "w": 76, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 76, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0002.png", + "frame": { "x": 160, "y": 55, "w": 78, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0003.png", + "frame": { "x": 492, "y": 54, "w": 80, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0004.png", + "frame": { "x": 336, "y": 0, "w": 83, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0005.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 85, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0006.png", + "frame": { "x": 170, "y": 0, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 83, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 54, "w": 80, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 80, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0008.png", + "frame": { "x": 336, "y": 54, "w": 78, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 78, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0009.png", + "frame": { "x": 78, "y": 110, "w": 76, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 76, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0010.png", + "frame": { "x": 160, "y": 55, "w": 78, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0011.png", + "frame": { "x": 492, "y": 54, "w": 80, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0012.png", + "frame": { "x": 336, "y": 0, "w": 83, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 85, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0014.png", + "frame": { "x": 170, "y": 0, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 83, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 54, "w": 80, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 80, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0016.png", + "frame": { "x": 336, "y": 54, "w": 78, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 78, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0017.png", + "frame": { "x": 78, "y": 110, "w": 76, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 76, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0018.png", + "frame": { "x": 160, "y": 55, "w": 78, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0019.png", + "frame": { "x": 492, "y": 54, "w": 80, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0020.png", + "frame": { "x": 419, "y": 0, "w": 83, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0021.png", + "frame": { "x": 85, "y": 0, "w": 85, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 85, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0022.png", + "frame": { "x": 253, "y": 0, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 83, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0023.png", + "frame": { "x": 80, "y": 54, "w": 80, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 80, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0024.png", + "frame": { "x": 414, "y": 54, "w": 78, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 78, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0025.png", + "frame": { "x": 154, "y": 111, "w": 76, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 76, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0026.png", + "frame": { "x": 238, "y": 55, "w": 78, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0027.png", + "frame": { "x": 492, "y": 54, "w": 80, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0028.png", + "frame": { "x": 336, "y": 0, "w": 83, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 85, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0030.png", + "frame": { "x": 170, "y": 0, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 83, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 54, "w": 80, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 80, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0032.png", + "frame": { "x": 336, "y": 54, "w": 78, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 78, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0033.png", + "frame": { "x": 78, "y": 110, "w": 76, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 76, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0034.png", + "frame": { "x": 160, "y": 55, "w": 78, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0035.png", + "frame": { "x": 492, "y": 54, "w": 80, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0036.png", + "frame": { "x": 336, "y": 0, "w": 83, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0037.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 85, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0038.png", + "frame": { "x": 170, "y": 0, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 83, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0039.png", + "frame": { "x": 0, "y": 54, "w": 80, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 80, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0040.png", + "frame": { "x": 336, "y": 54, "w": 78, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 78, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0041.png", + "frame": { "x": 78, "y": 110, "w": 76, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 76, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0042.png", + "frame": { "x": 160, "y": 55, "w": 78, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0043.png", + "frame": { "x": 492, "y": 54, "w": 80, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 2, "w": 80, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0044.png", + "frame": { "x": 336, "y": 0, "w": 83, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 83, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 85, "h": 54 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0046.png", + "frame": { "x": 170, "y": 0, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 2, "w": 83, "h": 55 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 54, "w": 80, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 1, "w": 80, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0048.png", + "frame": { "x": 336, "y": 54, "w": 78, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 0, "w": 78, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0049.png", + "frame": { "x": 78, "y": 110, "w": 76, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 76, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0050.png", + "frame": { "x": 492, "y": 109, "w": 78, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0051.png", + "frame": { "x": 306, "y": 111, "w": 80, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 80, "h": 53 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0052.png", + "frame": { "x": 306, "y": 164, "w": 83, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 83, "h": 47 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0053.png", + "frame": { "x": 472, "y": 201, "w": 90, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 19, "w": 90, "h": 38 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0054.png", + "frame": { "x": 472, "y": 165, "w": 96, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 21, "w": 96, "h": 36 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 167, "w": 96, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 21, "w": 96, "h": 36 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0056.png", + "frame": { "x": 96, "y": 168, "w": 96, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 21, "w": 96, "h": 36 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0057.png", + "frame": { "x": 192, "y": 168, "w": 96, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 21, "w": 96, "h": 36 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0058.png", + "frame": { "x": 96, "y": 168, "w": 96, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 21, "w": 96, "h": 36 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0059.png", + "frame": { "x": 0, "y": 167, "w": 96, "h": 36 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 21, "w": 96, "h": 36 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 203, "w": 90, "h": 38 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 19, "w": 90, "h": 38 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0061.png", + "frame": { "x": 389, "y": 164, "w": 83, "h": 47 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 10, "w": 83, "h": 47 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0062.png", + "frame": { "x": 386, "y": 111, "w": 80, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 4, "w": 80, "h": 53 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0063.png", + "frame": { "x": 0, "y": 110, "w": 78, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 1, "w": 78, "h": 56 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + }, + { + "filename": "0064.png", + "frame": { "x": 230, "y": 111, "w": 76, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 76, "h": 57 }, + "sourceSize": { "w": 96, "h": 57 }, + "duration": 110 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "770.png", + "format": "I8", + "size": { "w": 572, "h": 241 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/shiny/770.png b/public/images/pokemon/shiny/770.png index 826658c19d2b0d1d3831871bb648d155161c8f11..c3ad31767cde1d1d5786ff0ad89b2506be2b3a35 100644 GIT binary patch literal 6234 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 literal 615 zcmV-t0+{`YP)FMIw`f*bq?r(r8kD#of_W* zD@BHHM8NeQdbgERuj{rFLcm;u->FjxEKHYL8? z&VaD098%*Qv~NPs$eHt;u-veo>azkxOpb?#pxH`U5>nvLCX5{8 zM#QuYoc1P62no7iq0S#(O?jjOS#W*H|JqA0{RN&0k?;AvmXiPg002ovPDHLkV1fj~ B9GL(B diff --git a/public/images/pokemon/shiny/843.json b/public/images/pokemon/shiny/843.json index 3d34ff92111..40f78f893d9 100644 --- a/public/images/pokemon/shiny/843.json +++ b/public/images/pokemon/shiny/843.json @@ -1,41 +1,648 @@ -{ - "textures": [ - { - "image": "843.png", - "format": "RGBA8888", - "size": { - "w": 42, - "h": 42 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 42, - "h": 40 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 42, - "h": 40 - }, - "frame": { - "x": 0, - "y": 0, - "w": 42, - "h": 40 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ac9209a149736e9deaf853869a248b2f:493730b1c2a96026a56d9b5052c92814:1ad579f7e215608104284deec571c282$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 172, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 214, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 256, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 128, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 128, "y": 166, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 44, "h": 39 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 86, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 0, "y": 43, "w": 46, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 46, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 193, "y": 42, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 45, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 130, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 225, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 216, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 42, "y": 128, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 172, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 214, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 256, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 128, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 128, "y": 166, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 44, "h": 39 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 86, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 43, "w": 46, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 46, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 193, "y": 42, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 45, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 130, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 225, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 216, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 42, "y": 128, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 172, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 214, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 256, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 128, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 128, "y": 166, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 44, "h": 39 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 86, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 0, "y": 43, "w": 46, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 46, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 193, "y": 42, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 45, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 130, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 225, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 216, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 42, "y": 128, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 172, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 214, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 256, "y": 166, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 4, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 128, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 4, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 128, "y": 166, "w": 44, "h": 39 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 4, "w": 44, "h": 39 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 86, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 43, "w": 46, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 3, "w": 46, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 193, "y": 42, "w": 45, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 2, "w": 45, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 130, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 225, "y": 86, "w": 44, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 3, "w": 44, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 216, "y": 126, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 42, "y": 128, "w": 43, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 43, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 0, "y": 165, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 0, "y": 83, "w": 44, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 44, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 193, "y": 0, "w": 46, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 1, "w": 46, "h": 42 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 99, "y": 0, "w": 48, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 1, "w": 48, "h": 42 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 0, "y": 0, "w": 50, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 0, "w": 50, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 50, "y": 0, "w": 49, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 1, "w": 49, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 147, "y": 0, "w": 46, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 2, "w": 46, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 239, "y": 0, "w": 44, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 4, "w": 44, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 99, "y": 42, "w": 42, "h": 44 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 44 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 46, "y": 43, "w": 42, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 141, "y": 43, "w": 42, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 238, "y": 43, "w": 42, "h": 43 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 43 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 183, "y": 83, "w": 42, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 42 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 44, "y": 86, "w": 42, "h": 42 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 42 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 0, "y": 124, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 3, "w": 42, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 174, "y": 125, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 86, "y": 126, "w": 42, "h": 41 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 41 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 85, "y": 167, "w": 42, "h": 40 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 3, "w": 42, "h": 40 }, + "sourceSize": { "w": 50, "h": 47 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "843.png", + "format": "I8", + "size": { "w": 298, "h": 207 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/shiny/843.png b/public/images/pokemon/shiny/843.png index a76dce8e74dfc6281bb0dff73d515ebaca2f537f..01efdd67f0c578b2390ec5343b6100e1ebc87739 100644 GIT binary patch literal 8039 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 delta 479 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 Xm5GZU>txL9M_AhG`f8ObcA@_R0Y4!8 literal 937 zcmV;a16KTrP)jJh^Afv>dX< z&K^4e0nL7FUfbzMdyCjqyZ^E;+0w)7l*sz1Z|#t6bM+VxQc4CS{T=!6^)@(WOhN0B zrAvY9D2mNJ^sXA%uAK7U?~~=MzvSUBjWOeowi(1@BHWkl)b@I_0Zm$EyJ(F26vXA> zOFOl8Mjz&?HG-epm1CN;Xq=U-|EuK&ALgIW|3p2v1hLMzQ?kE_ovmNZ*{Xt#+2YNz zWOY|?|J|$kw}7A90AfwEQ?j}zmfn4*kPnN??6Pd-iW!lu16$o9TGV9Q^!M6_pEdH> zHrY1J8|sv-95Gw=673c3kIfYvGkR=qdAMimdRVm7ByjY7>Hm|5D&s`!e7K#`YC+_Q ztrqPq;8pFkcC*92ZrhX=`~x5@S>QYjQ42$z=eDg)Y`Rdic#qF=dol#VtQ-%m%MZZ3 zNz=qB*Z?Zrb(7h^Dl0s3ZO>~|i?+t9I32bv+Ecr+E*fq($DY`7?gT1f3$d}A=2t*& zxGwr@n*gp@HGL1`5_Zc_P}imHU;+nBCjj`vQowq{PaF>@Sp{6kthZT*O;@Z*4ta4g z0&rfi9xg_0p-R@7r}P)CH#WKhP&|Ptl+cLX#N}n8byAToBCoj1X5@MR(~-P4`*lSQ z;#tn&;T#KsYZIY=hynPKdi;e=ClTX9A||q`WHuuZC^-czZ$Lsc0?Aheu{I8R0+xegE{zZmStl2>^;Y^N*F3S8xX>e#Vk$Bz92nnDJp+8n{I00000 LNkvXXu0mjfWqQau diff --git a/public/images/pokemon/shiny/902-female.json b/public/images/pokemon/shiny/902-female.json index 33d636029a9..aec0bdbcc05 100644 --- a/public/images/pokemon/shiny/902-female.json +++ b/public/images/pokemon/shiny/902-female.json @@ -1,41 +1,828 @@ -{ - "textures": [ - { - "image": "902-female.png", - "format": "RGBA8888", - "size": { - "w": 86, - "h": 86 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 86, - "h": 51 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 51 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 51 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:dad3964d81332e0c087ab5f0cb6deb8b:32e49e3ce0a6dfd7f659f430e882003a:16072dc598107c41afadd9df4d7c27da$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 582, "y": 294, "w": 86, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 170, "y": 341, "w": 83, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 83, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 253, "y": 341, "w": 79, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 21, "w": 79, "h": 54 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 413, "y": 343, "w": 73, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 22, "w": 73, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 347, "y": 68, "w": 76, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 23, "w": 76, "h": 58 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 503, "y": 289, "w": 79, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 25, "w": 79, "h": 57 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 594, "y": 238, "w": 81, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 28, "w": 81, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 87, "y": 77, "w": 84, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 30, "w": 84, "h": 55 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 77, "y": 189, "w": 88, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 31, "w": 88, "h": 53 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 242, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 29, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 438, "y": 185, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 28, "w": 94, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 535, "y": 133, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 323, "y": 188, "w": 94, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 25, "w": 94, "h": 50 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 503, "y": 238, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 22, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 91, "y": 257, "w": 90, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 90, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 582, "y": 294, "w": 86, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 170, "y": 341, "w": 83, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 83, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 253, "y": 341, "w": 79, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 21, "w": 79, "h": 54 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 413, "y": 343, "w": 73, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 22, "w": 73, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 347, "y": 68, "w": 76, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 23, "w": 76, "h": 58 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 503, "y": 289, "w": 79, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 25, "w": 79, "h": 57 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 594, "y": 238, "w": 81, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 28, "w": 81, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 87, "y": 77, "w": 84, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 30, "w": 84, "h": 55 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 77, "y": 189, "w": 88, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 31, "w": 88, "h": 53 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 0, "y": 242, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 29, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 438, "y": 185, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 28, "w": 94, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 535, "y": 133, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 323, "y": 188, "w": 94, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 25, "w": 94, "h": 50 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 503, "y": 238, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 22, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 91, "y": 257, "w": 90, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 90, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 582, "y": 294, "w": 86, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 170, "y": 341, "w": 83, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 83, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 253, "y": 341, "w": 79, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 21, "w": 79, "h": 54 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 413, "y": 343, "w": 73, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 22, "w": 73, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 347, "y": 68, "w": 76, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 23, "w": 76, "h": 58 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 503, "y": 289, "w": 79, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 25, "w": 79, "h": 57 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 594, "y": 238, "w": 81, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 28, "w": 81, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 87, "y": 77, "w": 84, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 30, "w": 84, "h": 55 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 77, "y": 189, "w": 88, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 31, "w": 88, "h": 53 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 0, "y": 242, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 29, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 438, "y": 185, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 28, "w": 94, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 535, "y": 133, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 323, "y": 188, "w": 94, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 25, "w": 94, "h": 50 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 503, "y": 238, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 22, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 91, "y": 257, "w": 90, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 90, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 582, "y": 294, "w": 86, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 170, "y": 341, "w": 83, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 83, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 253, "y": 341, "w": 79, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 21, "w": 79, "h": 54 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 413, "y": 343, "w": 73, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 22, "w": 73, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 347, "y": 68, "w": 76, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 23, "w": 76, "h": 58 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 503, "y": 289, "w": 79, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 25, "w": 79, "h": 57 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 594, "y": 238, "w": 81, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 28, "w": 81, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 87, "y": 77, "w": 84, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 30, "w": 84, "h": 55 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 77, "y": 189, "w": 88, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 31, "w": 88, "h": 53 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 0, "y": 242, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 29, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 438, "y": 185, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 28, "w": 94, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 535, "y": 133, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 323, "y": 188, "w": 94, "h": 50 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 25, "w": 94, "h": 50 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 503, "y": 238, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 22, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 91, "y": 257, "w": 90, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 90, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 0, "y": 293, "w": 86, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 253, "y": 238, "w": 91, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 91, "h": 51 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 438, "y": 133, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 17, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 181, "y": 289, "w": 88, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 88, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 332, "y": 343, "w": 81, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 11, "w": 81, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 86, "y": 308, "w": 84, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 8, "w": 84, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 357, "y": 290, "w": 84, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 84, "h": 53 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 417, "y": 236, "w": 86, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 86, "h": 54 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 0, "y": 76, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 2, "w": 87, "h": 60 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 340, "y": 0, "w": 85, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 0, "w": 85, "h": 68 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 87, "y": 0, "w": 85, "h": 77 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 85, "h": 77 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 262, "y": 0, "w": 78, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 78, "h": 76 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 178, "y": 133, "w": 71, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 71, "h": 71 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 518, "y": 0, "w": 80, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 80, "h": 72 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 0, "w": 87, "h": 76 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 87, "h": 76 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 598, "y": 0, "w": 80, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 80, "h": 71 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 249, "y": 134, "w": 74, "h": 67 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 74, "h": 67 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 425, "y": 62, "w": 82, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 82, "h": 69 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 172, "y": 0, "w": 90, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 90, "h": 68 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 172, "y": 68, "w": 84, "h": 65 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 84, "h": 65 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 0, "y": 136, "w": 77, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 14, "w": 77, "h": 64 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 598, "y": 71, "w": 81, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 16, "w": 81, "h": 61 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 507, "y": 72, "w": 88, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 15, "w": 88, "h": 61 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 425, "y": 0, "w": 93, "h": 62 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 14, "w": 93, "h": 62 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 256, "y": 76, "w": 91, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 17, "w": 91, "h": 58 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 347, "y": 131, "w": 91, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 17, "w": 91, "h": 57 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 87, "y": 133, "w": 91, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 18, "w": 91, "h": 56 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 532, "y": 185, "w": 89, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 19, "w": 89, "h": 53 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 165, "y": 204, "w": 88, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 19, "w": 88, "h": 53 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 269, "y": 289, "w": 88, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 19, "w": 88, "h": 52 }, + "sourceSize": { "w": 110, "h": 85 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "902-female.png", + "format": "I8", + "size": { "w": 679, "h": 399 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/shiny/902-female.png b/public/images/pokemon/shiny/902-female.png index 45d3f157f3151e974b8047fe198d30f68d47f722..97fa6f5cb71643dea74b4bb45792f10d13d1f0b9 100644 GIT binary patch literal 32467 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 C7|-4S diff --git a/public/images/pokemon/shiny/902.json b/public/images/pokemon/shiny/902.json index a7ad9b6677a..2e788b240c8 100644 --- a/public/images/pokemon/shiny/902.json +++ b/public/images/pokemon/shiny/902.json @@ -1,41 +1,828 @@ -{ - "textures": [ - { - "image": "902.png", - "format": "RGBA8888", - "size": { - "w": 86, - "h": 86 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 86, - "h": 54 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 54 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 54 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f03a04a2fab39b77fb2f965828a1e018:c346d0483fc16c34aa0d7aa89d007f98:7d196ae78ad956c5eb9131e145b5922f$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 510, "y": 305, "w": 86, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 306, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 83, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 422, "y": 353, "w": 79, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 21, "w": 79, "h": 56 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 257, "y": 356, "w": 73, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 22, "w": 73, "h": 59 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 596, "y": 305, "w": 76, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 23, "w": 76, "h": 61 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 178, "y": 298, "w": 79, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 25, "w": 79, "h": 60 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 257, "y": 298, "w": 81, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 28, "w": 81, "h": 58 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 594, "y": 194, "w": 84, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 30, "w": 84, "h": 57 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 165, "y": 204, "w": 88, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 31, "w": 88, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 74, "y": 199, "w": 91, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 29, "w": 91, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 409, "y": 190, "w": 94, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 28, "w": 94, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 448, "y": 138, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 497, "y": 248, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 25, "w": 94, "h": 51 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 253, "y": 245, "w": 91, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 22, "w": 91, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 253, "w": 90, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 90, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 510, "y": 305, "w": 86, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 306, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 83, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 422, "y": 353, "w": 79, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 21, "w": 79, "h": 56 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 257, "y": 356, "w": 73, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 22, "w": 73, "h": 59 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 596, "y": 305, "w": 76, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 23, "w": 76, "h": 61 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 178, "y": 298, "w": 79, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 25, "w": 79, "h": 60 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 257, "y": 298, "w": 81, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 28, "w": 81, "h": 58 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 594, "y": 194, "w": 84, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 30, "w": 84, "h": 57 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 165, "y": 204, "w": 88, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 31, "w": 88, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 74, "y": 199, "w": 91, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 29, "w": 91, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 409, "y": 190, "w": 94, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 28, "w": 94, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 448, "y": 138, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 497, "y": 248, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 25, "w": 94, "h": 51 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 253, "y": 245, "w": 91, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 22, "w": 91, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 253, "w": 90, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 90, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 510, "y": 305, "w": 86, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 306, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 83, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0033.png", + "frame": { "x": 422, "y": 353, "w": 79, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 21, "w": 79, "h": 56 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0034.png", + "frame": { "x": 257, "y": 356, "w": 73, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 22, "w": 73, "h": 59 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0035.png", + "frame": { "x": 596, "y": 305, "w": 76, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 23, "w": 76, "h": 61 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0036.png", + "frame": { "x": 178, "y": 298, "w": 79, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 25, "w": 79, "h": 60 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0037.png", + "frame": { "x": 257, "y": 298, "w": 81, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 28, "w": 81, "h": 58 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0038.png", + "frame": { "x": 594, "y": 194, "w": 84, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 30, "w": 84, "h": 57 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0039.png", + "frame": { "x": 165, "y": 204, "w": 88, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 31, "w": 88, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0040.png", + "frame": { "x": 74, "y": 199, "w": 91, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 29, "w": 91, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0041.png", + "frame": { "x": 409, "y": 190, "w": 94, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 28, "w": 94, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0042.png", + "frame": { "x": 448, "y": 138, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0043.png", + "frame": { "x": 497, "y": 248, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 25, "w": 94, "h": 51 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0044.png", + "frame": { "x": 253, "y": 245, "w": 91, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 22, "w": 91, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0045.png", + "frame": { "x": 0, "y": 253, "w": 90, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 90, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0046.png", + "frame": { "x": 510, "y": 305, "w": 86, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0047.png", + "frame": { "x": 0, "y": 306, "w": 83, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 83, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0048.png", + "frame": { "x": 422, "y": 353, "w": 79, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 21, "w": 79, "h": 56 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0049.png", + "frame": { "x": 257, "y": 356, "w": 73, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 22, "w": 73, "h": 59 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0050.png", + "frame": { "x": 596, "y": 305, "w": 76, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 23, "w": 76, "h": 61 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0051.png", + "frame": { "x": 178, "y": 298, "w": 79, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 25, "w": 79, "h": 60 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0052.png", + "frame": { "x": 257, "y": 298, "w": 81, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 28, "w": 81, "h": 58 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0053.png", + "frame": { "x": 594, "y": 194, "w": 84, "h": 57 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 30, "w": 84, "h": 57 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0054.png", + "frame": { "x": 165, "y": 204, "w": 88, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 31, "w": 88, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0055.png", + "frame": { "x": 74, "y": 199, "w": 91, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 29, "w": 91, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0056.png", + "frame": { "x": 409, "y": 190, "w": 94, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 28, "w": 94, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0057.png", + "frame": { "x": 448, "y": 138, "w": 97, "h": 52 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 26, "w": 97, "h": 52 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0058.png", + "frame": { "x": 497, "y": 248, "w": 94, "h": 51 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 25, "w": 94, "h": 51 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0059.png", + "frame": { "x": 253, "y": 245, "w": 91, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 22, "w": 91, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0060.png", + "frame": { "x": 0, "y": 253, "w": 90, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 21, "w": 90, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0061.png", + "frame": { "x": 424, "y": 299, "w": 86, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 8, "y": 19, "w": 86, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0062.png", + "frame": { "x": 503, "y": 194, "w": 91, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 9, "y": 18, "w": 91, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0063.png", + "frame": { "x": 351, "y": 136, "w": 97, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 17, "w": 97, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0064.png", + "frame": { "x": 591, "y": 251, "w": 88, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 14, "y": 14, "w": 88, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0065.png", + "frame": { "x": 167, "y": 358, "w": 81, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 18, "y": 11, "w": 81, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0066.png", + "frame": { "x": 338, "y": 352, "w": 84, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 21, "y": 8, "w": 84, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0067.png", + "frame": { "x": 83, "y": 313, "w": 84, "h": 53 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 23, "y": 7, "w": 84, "h": 53 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0068.png", + "frame": { "x": 338, "y": 298, "w": 86, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 24, "y": 6, "w": 86, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0069.png", + "frame": { "x": 586, "y": 134, "w": 87, "h": 60 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 22, "y": 2, "w": 87, "h": 60 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0070.png", + "frame": { "x": 513, "y": 0, "w": 85, "h": 70 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 16, "y": 0, "w": 85, "h": 70 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0071.png", + "frame": { "x": 87, "y": 0, "w": 85, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 0, "w": 85, "h": 80 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0072.png", + "frame": { "x": 262, "y": 0, "w": 78, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 2, "w": 78, "h": 79 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0073.png", + "frame": { "x": 91, "y": 80, "w": 71, "h": 74 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 8, "w": 71, "h": 74 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0074.png", + "frame": { "x": 340, "y": 0, "w": 80, "h": 75 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 7, "w": 80, "h": 75 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0075.png", + "frame": { "x": 0, "y": 0, "w": 87, "h": 79 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 3, "w": 87, "h": 79 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0076.png", + "frame": { "x": 598, "y": 0, "w": 80, "h": 73 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 8, "w": 80, "h": 73 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0077.png", + "frame": { "x": 0, "y": 138, "w": 74, "h": 69 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 13, "w": 74, "h": 69 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0078.png", + "frame": { "x": 420, "y": 64, "w": 82, "h": 72 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 10, "w": 82, "h": 72 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0079.png", + "frame": { "x": 172, "y": 0, "w": 90, "h": 71 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 0, "y": 11, "w": 90, "h": 71 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0080.png", + "frame": { "x": 502, "y": 70, "w": 84, "h": 68 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 1, "y": 14, "w": 84, "h": 68 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0081.png", + "frame": { "x": 243, "y": 138, "w": 77, "h": 66 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 14, "w": 77, "h": 66 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0082.png", + "frame": { "x": 162, "y": 135, "w": 81, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 2, "y": 16, "w": 81, "h": 64 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0083.png", + "frame": { "x": 172, "y": 71, "w": 88, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 3, "y": 15, "w": 88, "h": 64 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0084.png", + "frame": { "x": 420, "y": 0, "w": 93, "h": 64 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 4, "y": 14, "w": 93, "h": 64 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0085.png", + "frame": { "x": 586, "y": 73, "w": 91, "h": 61 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 17, "w": 91, "h": 61 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0086.png", + "frame": { "x": 260, "y": 79, "w": 91, "h": 59 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 17, "w": 91, "h": 59 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0087.png", + "frame": { "x": 0, "y": 80, "w": 91, "h": 58 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 5, "y": 18, "w": 91, "h": 58 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0088.png", + "frame": { "x": 320, "y": 189, "w": 89, "h": 56 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 6, "y": 19, "w": 89, "h": 56 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0089.png", + "frame": { "x": 409, "y": 243, "w": 88, "h": 55 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 19, "w": 88, "h": 55 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + }, + { + "filename": "0090.png", + "frame": { "x": 90, "y": 259, "w": 88, "h": 54 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 7, "y": 19, "w": 88, "h": 54 }, + "sourceSize": { "w": 110, "h": 87 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.13-x64", + "image": "902.png", + "format": "I8", + "size": { "w": 679, "h": 415 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } } diff --git a/public/images/pokemon/shiny/902.png b/public/images/pokemon/shiny/902.png index 32f71756ae28a136ac544f93de92e003908485b5..a5e39bf4a8b63ef8a5694520557469343332deaf 100644 GIT binary patch literal 34233 zcmV(|K+(U6P)Px#El^BUMF0Q*5D*Y3I2a%?Ib%L4J!L0eBy&MhQet9aM~57=Bj=CJqX z=H|%ug3JE8o;09cZtqbRR<-Art;NnlXd_Pg(J^Qez>PiEcuT*^|`X_+waOo#pr>2`> zdaYG~JXrdC-F{vzFB`Xbg6qBi;!iG@dA;(_4)3>q_tM#3t@pbl$}Ot;Ib~L;EbpE9 z>AwT1bu^uHC*IF~5$@|Ba2g3#>ec)Cui1RVI2Zr@9JRIl)8Z7J^!)|P{y;R<#(d7{ zFKb>#zVcA~qFXLZx7g4)PVJ|!2>ka)xF|Q7X{1dEQS=-^FrV|(O5%yXOw*J3g`dE` zJ~uhXD|dSBrvoa$-x_{g{~R%T%t?D38StZbx;p#^MAdO~0;i%4DsE_S7g!iEBBNDu3Kj?(`Jsp095z~fYoHWjzcs7 zHLl#VjUFD(Q!?Rk!o2>&!4K>yh$|t1Ctay5+c}9RfT>fj{Ud| zJntwnqW=U=_3}NeKH~m(k_tc#Jij)Ua#Ml*G%GzGFkic#QCeB9hkO=6>AxpT0x28EvFq=RzePUfVjs3~_Un2?PUPQm=~vs(UkbSm^u zO4ZQOQ+Rd`wH3p4bp4CA+;Q`Fw0;KG0@KGSH9;00a|w?Eqo}rpj}fN7?**+36yHAL zl;%OX{<84Ei3;XAu2D~GrthPP#tFlAdbBKnf9rDVAE#Uin(A4cK0GQ)&<`&98vL{E zi@Mszh|zD1|9HP4O+&w;wFTMKVyPtg46e{V+5g23*OATyS<<5T2ig%%uP4z%oGt^C zrMH*78Ghk>0Gz_gNpkBS5@L#xoIQb)NG6nMVbgT7A!=}*`CH>C!c zX-JE28;H{fW@(V7kzeszT^?{6=8HDK&+JdyJV`3dS?^>}Av&o*X4KV;(=bgX6XP_d zCt*gQE;*m+%{7UJ#Mfcs8wEaSLmx0<+|VfZr*X=NdNcss0qC4)08?DlyW5DEtoqY5>WudrP4}iNN(oi8e8Rscx$QD(3mE#21p-V1WYwLz zUl~+K3i<*5r^U{2lrxk|X^^FHo`!Cd)dkuL;etahI*v%|Z`2cZkjCWlliu0! zfzo^CqH!8H6H%Qgz3@&QCDV@^`gYdxX9Q}eVD!;g^QkQWA04d>^xmg?{O}Rn^Z0nk zWd=`;F3$Mc^|Ug$+?fGW?DP(*OTwS0O3&x&>Vm(Ws8nWgav1k8M`;auQklQ0GFN)% z3Hn&4G|!0^{^m}80n!B1wL1jcqTj#VCWLuHMimb4C~iTV?^{EkW*p`NDxw4${4~W; z?sqJ*o!5T9SN8(`Wr$P3;3sqSUFsT@TaoZr^D2JtvYQ?*Z9&=r%6K`GXt&bj^JjGV zbL#G^3Hn|K1@-=$&q-#BQU%k48HLGw>xSQ)Nh$ZAps!MtLpY^W!ZA*{-{HyYi`Wj= zhkq1Jz@-c&Ih9lDGU0F4t+XR6WmDtZc6^fYw>v76OO}(Ayrg5@?pJX7CJ2QJPJQ== zrsxI;OxR9Zs|lr{$LVB0zciN2fo< zDQ-Z&L;1fcjfPx;vXinf=}9J~eFTX#!C##iSezd4r|j&j;m>s%0Av$RDhcYy6mxCO zP_&X}>TA?zxOoLi|HtdKc#-dKL}dumGWh(NbG}BgYqR}TQ!Fjt^=+uy0)c)F`8^Wf zI*sPOT(vOi$RuH&QS(@rd*^GepZ#9<`YHT@!@_?C*QNT-9gtH# z(fXVXt*!Ri>i7q{IoYxzdH$~1zVmH0ThP0$rZ(rf8B5xqAa~VX0@82l4KEO#4N!dw zqbK~SWWJP8NCK>Pw5NXxGTGXLb|!~R%4B?@R++Tfeu2wp(yUU?!(~t6| zNl#bJw?}Xd`&Q&Jjab>+jkn5X@cYoYkZpOIw|J#x!*s+ensp=O#l ziYGBU5(vyM>Kmk)RuBilIiYkJp6&?u#}XN44-}%bNd@pIEz%NBd7c!aTk~=3fD%mOnXS|7 zRRg^o_O_GIzV(Cce;d=ENcH{ogUHm_*E^5_slS4LOQgffg!7Y-Jl{co%Esw)lWLIW zRXO2bI!}}Mhno;Dpyc{$-vjoi+?ouXfsp7sn)#j(tBJrJ5&5ZRj9!fF9~8} z|L`SqYx;3JV@Bb4y2o}@W1qc=KZX2i1+9^##P$bLsv@O~P(?-CToX)R^DKG`Z1qWF z==6`C?T)esV6KywEoe8XG)PONd5qCf^PbQ3_JsMML;kYuHD5Zh8$p~Ng=w;el=`9# zcy`q-JDTEN`~`wPl-T!lQKtXyMVUsUk1q3*o*_6T&6B18tsOQc?sQqWcj8`3$CCWY zp(_ZZ-h)6}pdA6PeikhXo<(;(Ar zfvK#?J1v!<&+Z>#ddT_PWC~~Nvh?I|#-}u&q{8Bx%#>lefHa;F!P3hJNbMio0k~Det(OXTb5nTOeZfnd8|fU z+~~2>MqimTwU)1@yDv7yJ?~I#1^a3T4&zkIC0q59@*Qwd74&n#BLR9>2;wxZ8UI+I?bdX3+lOmQv|eYEp}s4jsp_}&C%(j;}F zYK+Zv+@36zy^y83Z#Ns1>iEZ(cpWLM+gx=*IdO^xk-8=MTwp3F?SQGWh85GNEp4#?34GC=xT;X)O`4pE&(4jFlU7C``3ZRG z%J)0Bhl|%*z6n~hBxw^i63C`@=Nddm(fFl@Nw3}JX>pdKux^;9j8g9b+dm}}t5fxi zQ}Fq9)q4ukZrFn9>`daSsEC!kZS$nDUiN8HvS%3i|CZH7Bvf zp2BQlOGE3Ha(=cBFWRlN zx~V(kb|A2^5wCbGSxmMFeS2q|tfU2|Q$RcZ4hg5-&NTVb zs_nC{cH;W>ghPV%0{dE|R=`j0L_vRFBtH`BF-Uz^8a*aIX@h@dC(2r4&Z6JeWL4SA z$C$}W@xdX?^_arET=ZDBx3UREq~4I^(V4)8R<$&dF|jSJ2x4c--|wfd5@-{`c@A+n zmypy`KPi-=U>|qU7wT`{(q*66!rWZJ)0EuF_6}%~^zRvQx>oLCeloP>C)KT}RD8ME z?WL>z^mH_o6ra*a#%Z6z^hFQM94Z^DBlYG~Jr{c`TADm1lbcb5q%3Qlf}iEG%2XKq zAmiD&YX5Ceiir(oPm{{e*!0^HzD1=eKXaL$6!!ObK<%l@rCjFoW|d2TlMdZZ>LCVO zg?}*7Z^K1#-HYF-34sh%iIf01com}B6$bYDDv!@iq?Srz)AI+u)nq4WyuLD~)j6^| zUH<$tdS}AqG#N7jd`8s_-CjhDpRQYz3vh7@Xio`LDnjiZo+X$D5S9X;2EPxgh-#QA zx)BNb)0D$$PCbtUu{1RhY?LPWYu~>ihYMe-CcFd`Q&6zd1~)YBsojUyi#&kKccC>> zKeRLX=4h?ftXqVCqxy6LiLt;NRr?7ll*0lkV4r+@Wf< z9dIn-zFg%vW@?Po_^s)bMSJzV5ThkDrsviqDXCxL{4m4y@`TeVhbg9~ZyIe&7TZVl z`Y4UhyPUH9lv6ZqX>z8BQa7#o6W)QQb6CoFF_Ea_bh4#MyYf?x4h@wRvHQBGx>sMV zj%iw+r-^6jbS!$VXbKy9urpVQq;P2sL2uKO1h3~NtSAnJVF?{?Kg<3-1*baVKLw?Y zZY0@0CQ{Lj452)ijUS;+e@ChUzsIg`8Tb_SDH}TsGmimRB7~W9q)%JKbK9W-?XI!{_pgr-LeBk-N$;`F;u;;MJ|;mQ)vEp z7V+$Hr(WG^h{qDN&AK#)w8!no6RCTlo(QI%kPT2;6NR--Rpv@%gf5~~q#n59U6V_p zlrm@p=&+`xy?*?2_@2-lpKuy7r?9_(^!0wnTjDUQ=i}i<{2p(+8+j#|as>iW&+9y; z+|wPY5c%lpCg^?9Zyxw^?6A%pxfW@3%q^>0GS;*r?K#Nb!7phHPjRR8mw)3I*asFc@>kBA zRxJlzQy3;rr@T4tN{Zi|EN_5--_LweHu@7?MiC7f{h5flEXOgrut+;(r{kqeC$}-^!qyvaP zvE0FR;@zHcZb*ze1G(UQ%h zE2>|gB;pj&j`8TZ{2xq(Htv^4LTamZ8r%2OosHKmTyFbM*PK-N1pX;G6l1Cb_s|-# z?{zMEvLqyK++dUbsPtr5i`0iH?Ui#QpJF@M&#W%<2+2qT*&NLGS z%zhte{ku3#kuM5ecA)5_iByrek5lgTa4uD5yegMyO(yd0F;q*CoR=`wVR{><_(k;@ zA7P^=L`>I0tS8>av7{K-a04aPr@Aw1&9ymD>HMV763AQXo~WJp!Xi#|-12|%dxBqI zzsvs?q&~qqp90f(x6}ajx9h5Z&cD)##HN7(1pI@ryWu0(ZcdH3`g$Nvzg(J)VA8ohVQR9O?a!I*zp60Z6Z%a@ znq|kg2z;%IQguO9)e~ruJE8ICbusYFT#>rdiV~ZU8pDmJh&Q0=U%PuPhDU z-=^d1(smXb&^GDKTq?noiWAAvcXK||mcxu9WGP=YqHKo0CnD6Pe_`P(1%-15^bgx0 z)>`j)K|a+e8@vf=$w6QKnQQ4FPDjQmXJBcwTxX)gBe#8QPtm4g{Cstzzv%cX@MA`0 zaM~iWE#s9$qWMz1c2E;~C`$S2Zn|mwIxc)2_i1#0#_0gqEL3(ub!KhHD<1lEgsCU& z;XrB%jMGJVL(HrOqo$5|e!1TW)FSj6y51EhXSVuyy-(Xy{fiPq?DaPsp2K<&soP8zj4sD1C&cm8@W`6 zC&>j%`*@!7Kq@HhbplfON}?82LGeJKb_z}PDLx)_GNVMGqL%0iXP%$1=Wm`U_)^FD z2;|4vQOhB3x@Y@Nj=H*pKJlS~YF)MZdhx?o|t{HW_odYj|R zIkl%SRhp;7=dO?XjiHIaKWXp>t#a2cR%N`HOHC%1%2M9ud9EHEJ@p-*_H5SCC2WkX~hT zpu$+nT2lE*uBINGMltwuO6TI5MrQkiqq|`4fR_@HELFgtMZS&=(7Dt~#>+)?4;Efq z4octgIg+J+xzwPE)4Kqt%3MuGIjD@XD^O)xqWr`iuu2>rj$nxV_@Iof5sNh2^rD#_ zbEqQKCTPbs^~6l~J*kYhl1ueYbH_oMJ3if85chPX%W}1f;=m}oGnK^u(G#d_EQS2! zgyYBWdD1hv7f{sN;YQU=m~4o0N3|4(jeL14t!uI6rt;1VY;lFwL6@#-Kz|{pG3bz>`#UCi1Q3QpZ!N zICdSB25MKHruXzRmDRg5dEwJJw3grk+i^7|Vg=Vmq24DQpHN}bFHgEg?4)%I#-j-* z9_6G%X~=kc$1@!riJP8GXX4-yXWY{-I^Mn5vq)z)ZNu}-#x8mE_+`{|B0;&{i)!I; zf(FNgXiuZY>6sn)eZNzJ7Ns4HC@iterB2~A-Y=sL+Lv`u*~wA=-HBmvRQVofD6fv9 zJM%tQqNxKUxz}`6C+X;@)?nV7W`Z@R!}c+b5czb1c79ZHsZ(1D^Qt(gSo6xCIh34x zFn*%)Iy1%E$adjOq=wpr^OI|5d3?-2mA94S7rnXQjkbT$0YYpbU!I`lxzzbyPZV0~ zOq{(t;hk*i<*`ti6=tS31ojM@M_)Y8QjxTju%G!w4z`tWGd6jQzFx}GoQQYn>i z*BI4T^3$~jT1T6QhsQ^=U{|kKf7%9anH~+*@KA1it0nwPFn!cqs)J@i{Kd7Vk4B0_ zPFF=f%%!Hwb1CY{PxYgt1Dk?x^TS`h1*b8i)G6ih{A}Rw16-e;oEdZJQiW#Z+AY-? z+9h&t%%!yA8=nr`9*X+%>adTy@E$Ho{8N5%hv&a^+|o?Y>BKeiF_#*yQji*;_(@8> z3r>#i>(InTcHD-GtQB53x+#xt_;d)hI^2dM^fbF;;|w>xeTa9iu5#0GX)J!n^jdd{ z_s`8`wCk?;oF3&4L*6@GgwuG^DJMv0h4p_rKfWVB2?6rbtM3NX`Uf-xm)Nx~+W=-|OMG`98bAVqg^9wQiI6U$75>zmgsJ~I2h-MVJR+I6cFYfH zu4>AhOI?@ovfNbi{z34QfnUzuoq`u8k$=8G-ye=LRK%%YVCsL)!SvzsTq2EgX)p5K zJgj6&QFNx_B$v80r4Vk>TP~yZOayV7z?Vv2y}{v6Q_4dFr&-PU=}t91^6~Q%z0l9O zRe7R9VJS;xM!!6p_Rcg{^J7wymh5iHrS5IX7h@e;@J!+o1079g*|GV(ZYCc+FD^PPTL`<^h*MC{Zw;pi)WGjLVoCu?^?WY%#hI`9k_%*` z)1QBu|NMwA%tV#Zldt%_OniELiGdjO;|9kKXy4$?;cGp&MgCd2jRP0G`~$kA_=u%U zE4~sLh}yeHCIQMlWFO(L!+Q>}j{?*mzW}T)GL7`r;$QJ2>^mcc4gxiiSU|wTE?O%D z)-93Jlp0vW>D+>#-VP+(2vFJk9h-d0x4K@6rxEKRr8(@QD6@=Z1MKuuc`pgTI zRQW5ef>Tb+F38aO1n}FJ+>671J8sUwqb!)J1)gzh7L7U8qyE){;t1hWt`vsCX_$HC z^PJbAz zVdGPTQF9@s_aP|PA|ViKitZ@*P+PE8sm5*QJy1FCot3JZ8ZMgot~5+JJB|N5B9nG7 zuFya9K8DVeH&0Lk&yx}goIbef5SwV2Q5?l-?9iDbSUhKP+)jHyWAY$Qi57_e6WV8R zzo%oKtg^Y{T6lX8JkJDjAF2Y#D&SbCqAM`H?<*?Ry&*w_^AEjZSTls`E>w-B!TU-s z;kx>9nH%v*uB6g)U{B)dslXojSrzR~amz<@q$IjKcF2)X3PJxBeh8zzIDIRG8koxd zK6)FTvISTH#2-lo{KyK`*!W9%)%_^|uloI_^ai>cL03_|IIS9dZ6CXv2$YtEs@UX6 z4n<^Drg`opLzSkF=3x9h=uQrlYuz7&4#Dx&nE=UjXxFu9Y~8g4HrOK}>-~;i3;8p+ z0-%mp3S%?1WYop5g22h_~qb9Y9=*a&pe*~)O0~R4C60m|tfLmxC8<8}IK?<{S$y8^hvrZJ{jRf8C!Y%OB zQUn|QfkO2IF+UDjH7pUoG)E-0GsowHIDLBoR1PQKouKmDH=rL5KE{tEoF3Q)%FQ_c z<)k|P2I>f_G-@Wqcn9tCV=6LdatlsfS6@PT7F;!ebv_jWVb}^FR;qdrOvek(x_)A3 zw);~K4hI|`NS=tV?$A-WSLKfDx?kf|Dgk?FQi(b3W6u(kP!KEn5jT?XA1k)*&8t?? zs+$l*NpL;^SH})J63X=G$S5`@HvhOWJb0a&2(M9Pq_8=KK;GZJZ78-Nb<+dIFl;HN z*0(!(A9-W=eAU8oj9-?VsF%v5ZU6uv07*naRH9?=ByX%Ye}Xdj_e^mq1TGcZ_pzd$ z-#24unz&o2@z1@9lQx zBPrE6oTjYTn+ka5j#uD5YR7qR-%t%E?_O!q0ZHPQ|96a2e;{}~q6V>M6d$cpiMf3r zjdos&Fh0s)^`!8B+>gNEw89pDDgjnk9h$E~*RJDmsz=_rAvcwch}+oMJwJ!F?jLOG`3{Y zL|+P|DLWCV#*ZAxCupc#W#)sqOi87Vc88qqjC3900c|PHcJUtCp0u+ ze)^E6u$TS?)-|Yp#vO zFU3~2gP=UZ%zH4~LbW4xJ2RHKyhQtz)D(-8NYDjO#KI$gQTxY?s&AebCSkwoi9R@)QH)j9 zpaKC9Uyh(eZ7%}Wwtz|iwFO*P03Rl&rfjRX0@eGhGO4T^73Rd9?v_!}MKku-T{PV{ zZP>_V&l5_cYU|n&Hxdy2UGx$*1N}yaV zGbKcMdd7QiBbPs>wG*n^Np8eL9vyJ9Eq;VPLi@ z38%y0)1n)?d&xzkj}EpWm3Gp({f$)00i`a}(Je#mtV=iYZnSe{T4=DYR!4j9991W_ znQ#E7Z@G_SkB`wsui^AXD5Y+}l%;B1RuS5p^EBE5om}?#<(b2wk zx{-sRl0J`eq;=f;8B0@ddIU}%%gn4W3V_WOR9OL-9Z23lZuSsScrL4UN~^SVMuj8lmSR8s9X z4#-|rf(9We1hc*3S6piV?A!t`$!Scj?tdYB`N)^7n`{#(e=JZ3A`W)X7MPNY7Uvgn zT8m6*@hv+k+OhVeTe6a!pirsI8pGX#^9nk48C0ESNMDgI_rl9YawsrQu8UjO^W zryp=>5*m`~{CGqBRQ(L z>|mD7>lV{YliCzHE9WOToeE5e)O{b#w=LYJc9avLG`iKyCH+NzP3iAkSk@$^pVd*r zNAQU`y!a%yd$nZ8wb?FAaVLIZCx}S}(G&D8=+vj7iKr@oSt!v#$I+fUgE-UDTS?BWemhJfKkar6Of;^Y3ZQwFsbnJVDlTx+Hs={#4pqYSE*=2+Dx&jHil$j@VP zYFniVQEBTZ1bO9H?x0U*a5s$#lNBHR;=elJ*+7QV*Guhe@+(a^P375;Du7V00K5+R zpJ2l>2$<99%M-jGT)%w%MtH_Mz3?~qrM+#DyDl1&{Ab%vqIQOwc497(l#{aE9(Ss$ zwBP5%=`W-!wIbRn9W{Oc;}q`W5KL{uN3M))_dZ_3H|^yU(u6r}?gG-+@;Bqx8ixUy z|In*6O;Z)BX$xYuW^rnEx^D|k4TFFn_YH<8tQ+R>o5l!O9k-A6#YIQo7gL-Zr?pIC z8&c0<+SE?8Ci41PW-CsuWu-E0GC0*LA_HqL9_ZdPeW3@g_p<6|_SZq3%&iH24gwiG z8i<-AcS;!pL z@Kf}I9ajhY8aHBqzpnJ9klL!XNO87a0hm4DsP!3`W(bgVKc@k#+gY5pC3eIFR+t8me@lY5YQ(gcy(4z=@yh8ZcR>P1>{I@ua#u>AHR$ zq_bk$vijC!IziqL^ov{Yc2D^CWOf3K$i%olU%&3_>uXVz*$GhA!;&yB{t30U&2ua&fT>ae3|Lf*NA}?C&H1jxD{ zwDe}}KPQRKvW($5t=}mSOs#gs`z*n-*K^tRSdAsg^ zdBn7$ty%pzzK+W<$RRKu;KYkvkH3U3u{^dGwT6fWeQu-rDw$f;4$hC98 ziO68fQpJhN(Vfeyw5C=M4RZ}0k0N6;rG9I&Iq}VR!u&PZ-OiYjDuA6WP?hRmFrnIY zzg@Op{fJ^0Et!N4O^B-QWq!F40zWwsqts)_r@t$fP6HoH^4hMsQs#_(D_ z<>|RQgIj?+;fiKfk6S6XV5)3^POQYGc7DbM!`i1CPxr>Ya+4oSXaZOr!0E5jPUd_L zI1wY;CO?CY07gmJpJ>PF>y^rU3ar&@lX7dME$&C(hr*UWU*PnRx$+h~pXC-*_TVqZ z*Vm{J@W|ciF_G3qpEdar>fASKCvINh^UuJvp8QCjqN}tnsr;p$85tKQDOZ9z<_YTb zpaG{Y>T21FiD3%a;sw~*ssPLu{6WB{8KQkUS@?ON(vsIgQ!m?n{G!G(OTN!VlRWQ4 z${DBhS7M6kP;`Bam-`)F?l_kBCPyA^IEC;$;8u{gyQt^BQ31GvJ8Tv4XN;Fheh+pKr7B#R1U-d1ZF8bfWG{zAp271jrNbMT>?xgqgj=#Hd z$D74ap*fva6iPZ^6nqs6uXm(Jfbik(IO1#Q8bx1flD?oUw~Coqt! zy6k;*Tr+81dhus)3U`PnekbmVIhp}k#YXn)I_oDKat&#~=l#s}j@SEbf!YjH*a~<7 z@k%!FWec*fnpG)(81i`rFuD0U1C48r{p{;JG=Ezh$%!u!X-3pMO}Lu<9{NbQh7|C6 zhlA@KbPF%yw75Lh`faZG1%KL#OLxMhw3lPxC$B{94{zChtWO6=A)>z1M^bMnU zwdDqwdXHH}On=4ypH|XSz9s@+C*@0y>3(njbu_gV4|kzAeMmY1TX1~^aKWI59j`Rd zltNtd$8b&GOn;Fm}#q+FQ(@;#*Den+}I_Be2gd`F__{XJW7-AIAtvK^pr_}&$zPmei! z!zr@hJ#fC)PMGc?z11bh1XHI%#JR(?#xbjZ=0m5w|EAI&eSG%~!zbiloI_nRmeM=> zNqQ0a+WFEwBetZgMjAr#R%Lj!M&lz3>D&q9W;t}l?^SlbD%UI;Y_nkbSGk9JF z(G+uJ2tS==#;9>xd~L>mqp;PmHY>~|*blRewP>DBjpWsm|S zW@0-Ed=M@^syHI_C$9hK$LC36xGH;)TjCyd^p23kk0HDoUjtF`r?<+W&p?pmiITtY z0@m&v-V`+;&e5mGB&f1EoEQz~biPV^s_lw{&g1&N;RK~yNN27)4FFkBS&e8&5oc1gj~x%HO9g+uHS zM!b&fXqBL_z^aNsjjR4~XFY+_fv5$j>MJw%;B+z57&HCb;uIG@BL(JCBArC`CT zjH53k`j_-$jXNdoOvWj$1ziohR0@i7b87l1Qj0tV_VmG(g6+>*Ar&ST+&R>2O6F z04qO7DzZ#0O&`AQ5QG~5*I-l#VPS@#h@ahzQ{%EDQbDr17dIo1Yq>cWo(5Ta)Ygb> zT{Eo`9^&hi4XxoU>rP3pN26ZCY5eDw9Jt&{w;Zo_sJWSPbv&oldm?ym6-Xr+6s5F) z2c?O#_G#yPdfZqZZTt6Sn`*ccmMqKq^JfWi&5fW^7;PfAzW+ zo}NTVtU5$(ixiKds$S8y-v!HduD^g!lZ2szrcckW5MgT9 zxlOFgV!;vPBY7RFXV9%-rvEsd=fiLe(>HrmRW#VoYk6xiTV1qVRY4Fz=^ zbXnw=TF!Ia_cfRv$qd1@pvvN6xQ`IsDP{J{#-X;htj;HQcEe4iqyticUVcAJaX;U& z;&?-VOf{+J3<{NebS=pJ@_Gq@I(&&Nq$&Fxry-34U*>ovm#xh}7u(nuA)r36iNh+p zD)OsYuu0Sw>3x^BU>KF@N;=@zvwhd0!blK>!v+Rf}HEIfBrH9LLBr1D|8)%N&JduO> z2nD%TnU66Ly$Xn(iPgJtlD!|@Jk0XJ8)d6U0>N$8R6R!O--yLycW+Kr*?~-7Msybj zq(ML`-y_3w6j?-qX-7Ztgkkz*@eoXl;7d6?UPuw_LFmA#<%O!}; z{DsGm;$mP=6MX9@7Z?R=NXA=az!9jNGW|f~%l(`@U0<1zdi0)_>3ycDqc}yCpdO!OtLr9iNgwoQkZef0)(rS{OK%@-uSf3u647kIR!e=lv#KcE!4^&O$~Ht`Qt7_sR93%V^z zp>befYMwgq>|V5|+5BAn3Ex1-Jx?%cC3#k+9I|y0Sn#Xr{R^xOWj6Rp95{fI36J=c z$LmxTk5QG)h+R(ucf>*hsgx^b@Q*SZR3PnM*XA(sLz#=jKD|zQ$@T!Aw9aNCs^e3x za6IijHK@H7!^z@IiQdmHpH}a+zi*$Usmt(vcD3eXOBT|XR7t>jJ@esAhMCaA8%MH& zfOn=gJx#n;l0cEXNlZm2_#g%<{7;{XsMvV%l_?wXEk8H|l|J^IzZ0Ay7L*n0X!KE> zddQky$n!k|4P|8m(DV7m0Bw{5?*^;7%q5KmG0x5Z6v0zjs)xNj+%-)DaSA;RDy4(2Q1BhI z&%0BiN)2$wClniymhan20i_(u`c+-#*!hLyw#g{+*rSZzZI}{HZFKemQ(S=}$=QG@ z?FoJYsA~utsRi9QRS_Z_O=#-Fpw#3a@*h5}vm2&9@A-&5&}XRB?@t=1Uiy!qkrjW0 z-pIEF6R!%hZ|`jTgsM`XDw%$VN+|MpiG`3lL<~`0opgxP_nfx0>d*7L-RMO;e85Ci z8hcZ-S#$^`iRsadW@SDPn-8F?Yso2|a(ar&eLS40HR)p|&2D>QoKlH`rg+7Yx<*`9+5yk* zsJ8s5;lVW#r|H5h_77(5OxgDwuFBvOUJTPI3{yI|bn25hW|5b1!41q1@ZNoGojKzp zD#J91CGZwmoJs38g zA@%H%dPkz2=B|sIv+NX0Sz5kpTD&UEP-G>UIJstpq9@GHAr-L;6`W$7tqNv0al817vR)ZjI@>HPfUI8?g^=1hK z0drqS{XPiQ*x6Hty6gab??vo%mKOG`mcO5!260E#!i>u@D29)4i8AMln}+%KnMhwE ztgOF-=e2z>+G~mW7-5!_0zZH(fulo?Q*466rLXLI#s#e#Q!+-FLPZA+6F7aFV0vhg zV30lJ%km){0x3DI!4wkkXnB2!@9Cip6-JzmO7PNA3;Cng2}=JR>TiY9IjvcjW&PKb z8AiZO6xCO7y$MM9A^7BE8ua%X;3R*M1|JZ}5Wr)b3|Q;XK>{C(m`jx?B_qKx{wmTg z2W*jfNvzN!UAvz2hw$CVML3*kRCES4ip129;dJ?AO_WMQ2hNGt?-fjU#d>v2ZG^5sbMRJk{eHHs-wJ{k6BshQKwkbvJS5S*sq9urkM#tnpN1(`PxhyD*zlT^4j%c4Y1eModjaC>nt3 zjgU(5{)m%PoH7sxr(_6)!v>&gl(z86whmJ=@|Uk1Ub*oGrp6+BJ|e+1sNkxKY1COr zx$kAGYZ;1m8gN>cBHCfJ=sDgEv4xqR^TI5x`HX2kiRX=g3SCs>CYpl)^^wv=22k?{ z5Ld@rJ|N=siH2YucAo!U+_K3^MylwLKqh(ikeOslt(XSKzoDk=hF(IMAh@b&QV`Dk5#wJ;k@VJ3N22|~M3}9BIv&DMPJN_KdtNL~Bb$L3l)`j+mYNQ`Fb1yq7NxWg(`ICLI#0~+J3w<&;S`a& zyL{?M#ii~PW~nSaF@HBALxE;`bL6324XC{+8iA=}Gazeih;fQ90vdZAOJ~3K~z=WVyl!7UzVaXol0v5YZ0e#%1GUk$Bn*Jm<=l7 zjcew@%r(|!+k;+ye@_fkmxzhnZw07_(sK3{dI&C47p&_jwdfV?jOg_CI% zc+)^_I0lSM#%k>8JRFHT#wizOF{{%{KBrmm*8VolvT-%+L7)Tc-7L2}MX(xZjgXQR{5%a95h@!Q_O%A2)mbs<7A;p>d{Cek=S!Y>V z86I0+_(f|+bc7{NkE=1W1C>zM(%-uW;WVWn&qpl*=^QJk2vK!Ge2dNhJ`U74zQj;d zY4=p$8YXAjBr9Dp(uLVm6=tR~JGtU`q(vq{FOH0=E`y1?-xJ?4_qiP?cl~Lca>?l6 zcnorowM4mdyuR6&JmDRV*(K+ab$vRJaLdTq(Vfaby7r;3FpIBhpI9}XHq+w{_{|>8 z>b?{~i}>^Ml^u-9U0+eA^$aN)$(iJRjpMVhrwDT2<~fjaaR#SB2*P-RG9^?%&s&|7r%D~U%q0XI{j_+vs)U!f%kCQ4&0?xTHjcZsmK@8m8H|u zcowG!%DLp#^k2f1*?gY~rlzauI`-f<>U9aWOI1o|;%ddVGP@vvkOmE5ydmIyX`tn0}KFowa;jTB$ z8~9#OZea%sr;t@d6@CP#K2WM07^b7?JDd&taEcIJX{GD)5Uu?weLE)TWU26zbEiaQ zVHQkb21~xAhqEe!9>}w=j~#y$f6ER&^AcDp8RwpPKEG8;~*-oX0-loh_gdVI!r-SId{cr z#si7RRW*$<(3oKSq?4;SH5?@98Jlm{<5`uFT@G^GRd%MUv7{g41u?mDitxxe>*(B96*`R1p?{5Cg06=5#;7jC-4CP~2!hm| zjQ@SI?Q`vj0(eahFK^s6 zH2dZPRmU979wCHO&GC1Ce!Rlz22p$=o1AsN3Zf>=e%jpdqSUtvD$KqPN*>oz>Wb97 z?=hC$$$xEJ4kpKMhTM~E;ShH^v(uav2Q`tU!-F9ULc>pF!G(3U_|uVv!|NmHPZhUL z4X1N+!^@<;mHMv~-66T2QdgwTnM@r7Z-wck&3G@hF z{_&PC*6IilrEbj^V?J8;fe&w=H%*Q-4VfmxC>19(2hY=vbN=$$oYW0{#RO(o-|x0Gi0M z-U_BO`cvT;dUS~%HU1+|$+S2EkW?cyc}~@yyu0{a&7mnE-uLO*_y8Bi%e@4r??jef zfoVSn?n`(*wP5ebM-j^_z4P|tp_#xRvL7;aUQIa#`91K}3!*X;Xcesm+xCZ*3Qao1 zVye(Q_*m$Z-0Dv0HKo|@%iGedI8*I)$o_ZoUa>U%esv@@AOq->XSQI@f zp5&DIGAYhXy#y%HLex6~wV~+O?v!#0cGaHxY5dL;_0z}(c17zxok~?O0yr=%?9xH= z1BHsn6a;ToxXH~kd#JTKXw6M??8RD+2y!{0%p=8I46l*yX+6cAsg zw;26Sj#+$lmQ{FQi~0e#SJiuUIGy{>rcV*rSF;JEep-uYF@UW9f$u}o88R5w&(Fg} zuljlBN8Rs3pz;}_6nnLfT;A(llU*;+B=OCD-hRWgV|XApQfT5Z56u+*vSct+=|tAN z%QEH*N2(z@5t&~GQ)axxQ!Y0*>fK513xEoxvqqps+0;)1(fhJfQqB0+a)r(kkL4Dj zZ3lDL4wITtTbg`6_IE&uZRZx$0k8*pxJI-#%zP{_>;>mF~i zGi+`iqjAciv4opB&El&=U5C+hc!GD5GNO!Ab3K*%$JfHt8;P7G*P&qbfyhV!r4`;;w1TMzfU17T#SX&);YyI2aBgDcdt#66_#H0KSZu-+mT`Y zAyTv4JU{AA?LN6WgzmHfr=!Yz<0)S{KI8&Ty2pKoCmqAG`vF0P!lq*3a#Ak%R6MPu zjY9Du*r8sgk2X*k0e#yc;mC>4-kbZYmRYE&n>NL)ZD3Ed*M%i=%BTnRi}r^PP0f#M z2glmiN^WjWx&vLwz^;Vjt3wS1mA#N*j=A|RGUF85-4XtmCZ~%BuqcHJs$evnxPOX_ z&3?beCyI~A@xg@lKo%P4Nf1No4rtnJ<*0lq5s1XR!sHa*=e}BOU{kX2#(yKF zT+X0Zv_BfBeCZ%#vZ;AWaw;Vx5Z(XuUL8{IG`~CN@Bt<|KZJht;;7rNVYaPPl)>%A zA$Xxm%wg&&7Pr8Zc*1e|fSqC81mdx`(=csoB|NgcaWc8D$|*=?)>rSk(^Of`X67^W zKayN)TAdm=HDHpa>6h}5wGxuM5)ogmI8_&i(tQlRCZS6XZ$|!U@THKFx}C4~2zA0t{{y6owyi5wp_5w(Zns9$oY|xuAL{jAy-l%) zQ_(*p>_+TdliO%o*A1T~J!NigPr9>C2b33$ALS|qT9NpI0%AT9PdQpT(j7}>w+ESH z{AgI6pA7*QEgAWzU3ye~W0i@CW(w4J_0xbcGRGPO6#lj648ef_0gx;&@uV`xVWKn-ve8U6I7g_KYH zTYNVIU*nl)%R-s>r!}wm7EalnB2PFQU}*uEKYA(eRfV>3Z83JRUmB&DDSCbt&z66V ze6<%GxlJ3;o_e0wl9kDE`@@L+7)75Vy` z3@JK`*Tc-Cf>Utr8m1eQd0C!tIJI+`GK!_GH5d ztf$Td8|HX9ElpzkG;nZ~IZu}IKnXcd)e^F)c}5+As5Gw%in*p97)^ zfTU=B2~7j)IKg!DIY7e`4mfp8zZ_~fg^$E|yyO)7D;2&_FRAaKlHVFksZG&vWhS+K zsj!6fw6FlL}zuqT|!EBLQZve8}PQrT4UONY3@Wq(KeXa$W4MKqNAH< ztr=pX3oMpKTImP>$|rl z+EZhaLRqzujAbP?Og{_LXh=T84yMp$R~nr|t%TgEA+y^a-|Ro-?i`{tWH7zyy8_I* zjs#p@*it8p)5P${d~thfd43y)56`l4$rJIfqX{(Ae3@nfe}`l+$?t5+KS+8(J$tWk z8BYxbE!CCA0+az@nE4<-NtyG6waf&8T6U#dyr~KIx?7C{y>Gwf59XaFGY8_D5R`xN7)$ zeyN-XRJPjk_AYDpJ$Ac&_#yiA#3v8N>&L{mJmlCr;yX47rxTF-`5aA5LYZ*to^3GI z>_HeHkcdXZbkM`;X4iY4LWSKa5Hes|4H2kJekG}Bb=HY8S8!TLCY-|Os(F6|s5<3A zhYul1QXbRq(lshlr;m(|joH|cfG%i= z2Kp}{plx_?iO*xDnE*wa%gR5r21zPXGi}ohlnDeXETiPa?94dj_J?Z{d)ZJakLSzU zwZ8N`WhJD(kg+w@ypsSIGAfxb;xtcuZ`lLOYm~_S1|*@3L%BS0M-50K_MpUaMQm)5 z*o(ymh1V{hWSa>oC>7-&SAQC&dj%lFU?OT~l#CSQ>Ld*fK!X0qqJFiLn0LI{oz4eJ zy|R;FE+uK8W``X2;k3fK4({~10D$z0kWwIRdkGO}U1N0tELTF91gwD|)<*rt@`;8` zt7qZ0wMAN%R5Z>#^?m1zHa^T*VvX?sXm0wjDbK)XL-mwr)+Jfo8z>BCj9A`&K_YJNG<~Pxum?>2HI9BbfJTx3su># z$*NOQu`k}ZYHx5V^tlPol6slzvS-62YdWQCvmQ& zJha-IVf}L#$NX6j66u>zD43AA+=p{K^OXD z3!9zf)SR1kdF#SeCl~~N$|W2q{jM6&p_!?ZsO%`iDI1fn^xnI=Gp8rDrnEXd;l$Uq zoSj@VEU%H_pe%q|XD3+~?JN-uktF5>%$Pm~q3pPgJY9K=tq z9~^N|8l1XA1_Lq^4UJR9%moz8kD{9(S#=@3yG!A8LybLkE*yaRX`IRdN=$j!-&ay| zr!wfaJ#Ife;fBWt6VnIKa45eQe_~nU4l+-BPo%DKh0r^wWfO;i>c(1?X3I3y`s#yI zh1q#X-`UbY{S$)cO3E|nhPOGEX|EugPfvnE=?4uJxu^np(+42RP^2FbiW!U{A1;## z7zZc4UZq{(u5;FS_q-ruzigCtB#mivfOw#SoG9@vPfub(QCyw-wZuR#|@VhE#3j2Pp2D^}EHR zcAWCX;Z?R$61%g@JLa!PWR2&PBCjl?^uI+ZHxfBD zPmj~&8PC{ZPYtIh=%>fedsFdyz-4_;zI6*sL*Q(smQ*|FQ5^kT%zZUuZdO_TEy**L zkjaj!o$3BS(sFu&Nd1#Dj*$G`CqH(5G<>&~t2CFYw1+b|J%c15%(cYM&VBfRbYmDZ znzF3qWNN-~dXkPf#{L@_SB$$a4_3!|Jn{|s2XHav*~(>Jj#%Td^yQy@@GkVuKvKV( zQuFoG6YHwSi*fpo_{d_clf~k<@$J0J7hm}X`FuyVLagzB{D}GL$PQ4hOwAwbrze@K zzV?V?JlLMRdyGi$Qkz|kA-sI@)!mq_5NrIbl8S$6q(&mUdv{rC{;0H$SK577c09%n zF7`iFfg+2|eX6hEbc2rIdT+{|y1R*;4-P6JO~&J{O3fe8>WD45^7Q0_cHi0{roVc4 z{Y#)Sk^NY9P8>1Wp8&|Ywo&{p1t-7%97=&QooT02B7YTZ@>W8ve=A_DA8~CKTEt3L|VpDr2T6x5Iv-kc!RgMtpu0VXnewP^`;<|%J`_#r(WLI z?-{}t3uLiz-5x6?=6DH0MpUJ;-xa=Aq_vHIFWBp$tmx`_Mo0bShV{$Ud@WF$pJ3>YG~L#dV^G*pdsXCFd@< zJGV0u$MstddNs#&S+3l}L%ljNMx%QqGNSmTT%dQ@nKZ7M(j0_CKblhWeE5?ge&*f$EJxXk^>iC zjgOf~;OsO2P=PhhHFMh1s;NfHvK=SiNk2C6aV?{uJ+^k=6P?yA;DZfBI*z{KQqsoA zf@_SfUQtpyDp#be{>-f6uv|onjA%}b2*B|Yh%_#G)lQs36rr;{rD%RM%>0!;W^Y%m zOI<0LqEnmnRSS6d&z&|nphBUJ+^5{TqPV6fs#A20-_3q-RZYyPp98AmBH{<+8~`#7?UpGYe4Dqb$AzPU9!6ADnm1 z@X|qa@fpRnB!2X$JHEgQQNL1E-(jb#oLK?Mh-NDM4Nm=m3PPv8@Ww0_Hvk|cHf9EH zlnwJDzt@aY{OeMeVlxe?z0K)FJFmA*s-110k*7Ww`B(c0s|V+|Hz${r&JtWB8djM8 zsH`R`_8*tpl-JL!;LIYBn(sFT1ykmw?uBpe6RT?1 z?g2VymMHGjv?4?cB74nb-$rHcy$K?t1QABQSJ{qEcNk8MJui*Ztm{h@^yI$jbOLI? zMl5LyK!VxFL-GnIJ_cie7+0g{>J1N0d&`39W|&$}Dx7{Hkl!K-6`KXBsv5gLH%v04 zb_<%-cur(Qnv1B1$^KQuknf;MG{z)nJF_B+M>tVkzWYJ!tJP!^PAT7K$uW;YciM|n zHdvEUsEQX3k~@O{^%2Tm^2*8ijgj9Ze!?ag)LYdyxGE}kuBzwu?oZcHejd%l(8b~- zaE_uh&xlzxc4g-fH9h{Oozy$-0<)=@0}s<<)3xs69!06vZQ>b3@8%C^H~?Hdf!K-28yDf&n*BFDLS2Kw)#~3DGPA^ zVLLNy06*UUfQ_|?&iV+_N;Y{f*OWc^ME_8PKR^~A$Apx=g3~#txK>o`w;pzQZ%_&t zt-v&6;dD*(h8dUfw*V%nck1Po!`LSg#YZ?%n`1{cIRpJ_*Ow{iT@OxE3sI74;BlA( zEhmM5C0X$F3e^$MIA(hE*2bJ9!1hw*FKz98R+X>U&*63<+68p z)h(d()DfpYn3}ofLz%3T=BVf4G4bUV9pE&Co_wNn%-%*-&EdNeTvHO*Ra74u-k>z+ z%rZU?+(sLF2J|O&u%{S;K_n$RP@z$_!)jMpVl-`jT-acsm;JV)o5GV1J~IGq0X0tz zHr#4jJk-TBMn5+aB=N-yls*QR_I#pmFyGI&SG-in^v8^p8x+@fGE!>JtZy~9Do{Pc z6v>F%1*Z^#LBvl*5b;H}(+;L0wLlrl>=OfhH%zl8g)S@BJ#~YlHp5(?B=1F==yc)> z8Ff!S(KUP`xJDlONF6-cdRn1@DJavT?*wYHAv_hD;@qMgtB2mF3K`MvSHyDTq-Gmr zzLk}$Y)6@A%c-HSgnP{(YFxEQ_WP3aPPYhG#H68;t8^<$`UpPRs+SgpPJDl2LIL^2 z9qu%t6#oZkh{^&m7+0#egEL0TdvLmZoFa)Qqz=d!pUn+75fB=jb33oVWyXnIG#o@K z2Fmo?N!u7jcNL-;=q1<_Ok*}|T(!!hb}8shmxBEqNmogA>8ZObUfW104kZbw0Xh_2 z`9$A%CBC1TsDr&%RP1$_qTNfaa#MQh6}1~>>o7N$0_VI&!@2n)Od{i=7~+ZaE83=0 z?oNPevmMULch;>L=;K6#Nmu5?K(D&KB6)LX6iR1<(W#zPv#0jW*@_I+NuzU)YT_H9 zLvi07sl;#{O9-060MN*H6$?I^m8n(kN>2^_Hf;-brE*$hj6sSxZj0;X3 zwq^}Xaq4$o<5PS;z)Lj;zEoaffn)2Z2r0F%NBV92GDD5lm|!DMzHg$G7d^XVoPJsh zB4x7Ez!UF%#y}4f4hB!+t4-H;52ppUJvK$lteTUR%u_e0&97WcLsX*39H#faqLui5 zA}^Jv)+8JxHjv?Ml;wwIN zHZUc3N1dn*mBXbLjir#{CE#hUbbT2_ZcDUobqiGBz^QB@I!EEpcZDQ+nd{W*DEy^*Zt)a1Samx_LSg)Vk*$(wFZOVN5S zaw&*74kAJpD{Qek+0pdd>tL!e(AVL_Mvx`^t&-`Rwo5RWDlJ4;^VIvd9iZQ(Fq-GT zYl-ijZj1STmLeh`FBQ#YDt(rUtsh~kDCoCqoLQ45BO->wokE20cadeJ`iX3-<{tai7m^RXkv&SA> z``Kh={~m(LNn_z>PUobRRwllC`+jC5olP-J5G@t*Qq5J0Yu8e#TsXHWg&N|_0^&2_ zHMX;AVIVYe3;ZjbN)XYFg#FJj4D{@LVx8{`XN{GqYWi-UP9&I$WauZS@-HRT81TDN zN1wOSQsHNZO?*Fs)0{aNxY^_Xf+Hjl6oN_sKlJ*4Nxuz~d&WcnX7MWdVq457$%T?& zSmoeEM{UWs-@EU28U}j02#HtEYDqezSx$Tfm|$T6lYu| zh7bv-M(MsG6b$qLmN~1^;1fyFnt^`ra6;O2B)Jf*TZr0G@8%Q_U$oM&@-v-Of>UtHD$^!UU9{;$@cyyKt^wOtT5&N=`Q+Rg9t9$bh@3K7Zm%B#iyGT=3<&^B$!s3OMUdudM!6vS}H?uZGrk>oEApJ zD1B6b+B3Hd{>;G1F(isgF{E7`I}G&NllC-yAKa$M1=kFKnsx1>Ypt}RK$8kBJCyto zAc&DQF>qr}hQFs1!0UPb+6K{svk|?koLT*EzAM`lYD0-3{D&B*9c98c1N|#yzt7I& z=jYQ1o+o1f*iB9r(0V!t!?e;LnXD3!v&MwWbmov-SCcEiTiA>Px4Q*Qt z^qBp=aJFM71-)*kv0!Zg@AA~6tu<3`r4<*`ox z1w9FVKCJU^BG?&4D?wCzK!(p zZj=m{SXAg8wv6B!iP-PG61_IG70vRD_t}{+!%-01bk~LuF4I)gm+vg)9hCmkH1Bo0 zr^_TWP@4sBx6)E8!97!r);H-328UBcwV`nO@#&c16g&8JWJDqr(2qY#KKcrrVwv`y z7^an0-yz}DPtyia6o8VX_TqHCl@=?s(H&@|T{+~&%fHFLt*q!Wsr02wmu%D7OeYeC zok?}v5W5Ms)tBcLhsr;s3>O2aOJ<-pi~SweTWNz_OaqyJb9ipXKM2!wU+h{dVxcvu zE(T)EbPj){ZS|R+@2ULP(fyL0CStGX%~qP+OHczAy1{^r}sEoR{ z=&n}rTk|gO5s?sA{$?(5Zl#P}E+tM8$J>dv1`#378~ zs!3;Ydaer3Zsyc4rd?L(*JyqoC1tkIr|ioE8g7>(0H1F$pA(eeeUTMjV`5CMF?)AO zErjN-|6X20-Ri?%U8CKy*L|I6>Ub@}pIfbj>wrqys!&@8MQ|CK=~I3gr@6b&$c;N_ zvoby+D>KJwv*1RrNpA>0&1%nijWeOnA5!lI`hDU0duZ)XjJpcE8+zSC{9farF8tJR zdf}&zq^&n7D`TYceEx{Mfi3hY0;)*K;+Qqa8%h?<8QUOJ@evUNJrQWoES(g5JrBJX z=+7+5?r{gL{fD{;=hNr4i8e`&iSIN7I+=P@FQ#3&6QhEaaJvf=E8z4eqAK#I>?fy* z?ZVG2@gbzKj8i80MDE0f!VE>uGs{Gn##zEQay%WpA7f%B^z+&iul+Gv`%iTdVwbhbt-hJYaI%WI||WMTyjAa7t33N(9AWK0H8p2>}cI!JNG z_DGx)vo{gOI!&9k%#ikeS7|HgXQ4UzduZ*i?jo!;4lSO#ladh{vUT$DY?8&|y1+!a4S(R6{k#MUQT>-Cj`lhO}eoBLI`;>g599s}%{ zic_Gf&~TGP-*H;E&+HAx#KhhaS1p$i_Rz0L<9cZAZ|EXKk;^|Kp6n7-rz3Pz+HFr% zS-^^5{_W3Ph)?9!Yp@D^6e>&7|IkZkT6%rhIPbE6n?P&G)9SF=L#ZxcHKIZSz;Zl{FG*|>Jl&!llb9klj0bP*Dus2>fB^pG0z`?yd*;^N!pY4Y=Y zqD=8EMI?^4Dzg6b{w|048%bSrf>p`%vnemZPGB`t@SK7w(E4CnW8V%!?Y%{twW@oZ z=`r+oy3;GW2qH3izSNV8xX11Z5QK99+3fsCtW0#)1{F-7d(Zxj&}wgjdvdLlGq8HR zyiX4T0|*cUN_qQXntm76@0~n?9pw9nf_xI_iN9@QZ1E9Q`C|RP#TIN_UFdHdH*^uG z()Aghpf}{H9n(=ju1qva=Xv@x&8`-T+?A{JCg!3iw><fkXaZlpBbUJ)%0cmHdC+eMU zNctH|${q`Vsk#UBC+w%uzN#P1n=LtZr;ExKU%KElIX?nH39C(7&M1%hKau)CKdC)W zvJt5H2I`=7YVVl{W7FOmnOj0DY+Nnq@6D_3=prPXN@2hQ~~YvOR)*KS)mG`il-ZvKY3$6 zH>tgmHmlC;y{)5?jVpM+kN)15y6@;BtTzsc?}-S)yADoW-stgqqR{ID$=pI|E6;SV zYquu{V`aw5{e=ZnP7%{9dUqjX^?MLd!4x8!vyAcNs1ms=5ht$;T%qx}{8*lI?Ta>QhG-vkSwx)uOYlGJN0BPLaU4*Q2c%r=>3ik0d zQRDUt!Ht)2R8x-c%DI)E+)kUrhvfd^U#fzDjfn`kw-6vJ2F2H4W!PQmsI4Y&h1xqw z++ggKT)H~7ys5!6pT9ar<`OHjN%0%?ReGSQSWOtg(UAfeg zug*Zt#^&rejlf|bP*~Y=|FpeWcJEm_O(=A;Da;MUf&KuI)Mosb>z?2fc zZwe`zeB4Yl^x$6)-9lLJ$-%LNbL%ZRhAGC7i6&)m#UMb|?2R|p#8G*iijS&xdOunH z@vbyduf8{E6f_{@dJj9A9Q16+ zgF@mFSj%+{9})c3NI{=~IxC5WFm~&^Vg>#DT(WWXqn|hQo-TriobZ+8rdA(1zP`pG zPBj@6Sxu#kH2uStUY{M@>e6?b%4SFE_PT0E)&@ZIfwLx2N&M~$2!>r)&CJKEkMe+8a%Y zaT@<)sZkOgk>F`NI z*_2bWO|1#jliL(Xz*_$HbNO5RDv)x39k8;FDgvOysj#vz!||Rx!$*X!FHRTAGsy9m zG(hNxnwY)2*tnX}e`gmV{@E0wgO?DRJHCd-A&gn3s%(nu$hC zv-dt5*8%k3)kRR9L)DVbJBQ3>-{kxy+jANFc*@Ubte?5hKt4y@;nE<AGE zdMWejGaWM8s?~XJUTn*7+IzDn!bG?o#=Tq$?+woD`U_|C;P1}R->@}aLK zO9>_63UR8a*rVMmnC@>u@>GrkYZ4c6?)q>a$GFBv6!G-Zf3Sy+sDX`3$hbO^iOahP zdFQY^I>`{#Qb#8CaUTkcQZp5l?lVT07u(>%Q0-z{@6Db#Wnd9-gPERqG4`ey|O8@F{4 zxO3=YE}60k?i}hCciYM4FJ*fZ&eT*TIMrWnn73xpSyK*cdT^+4pBc=-6*uJ?qkbBj zz}o*h(2BSU9~(&PftCj*S~?^)Es}FM#cX1Qjq4C=+$~*%=a8%vj!w$Xp>D~v(L2K> z>Sd;`I#Zz^7pOL-C-!0+vi(8)j|T|QiQ}ZVwI^2$gHu$RS#d8;F`_zzz{BORZrGo92-RenCU zk&hQmIV7T{3q!gor<3Vklty5U;s7BNRs7ip28C3DDT+HLDSo;8;U;<^_MyGrfzYf4 z14OZ90{dm==pcpe-^a_l2n5uD&bH>AmUPFIo7l$zs0}h#nsN^Bwq&iYo{}%0baa3O zEck(QN0DU-E>DYtyXnjr3%uS1qw4|59@)4iuzQ-K#pz+nI5PRGx(IZ1vY5S8X>!0v zEos&2JKFD%OU7j(*~C4**6NCB=?gEm<*lxMn2vFCmz~hSI>DM9Q$NZ4j%r(pqkqBE z1PbnIFZ+dh%qGxHvp`ep9i8sgU4&Tl#7OMcJBI?)PCiDmC^4xj`*>r@yVjJ8he!5e zn=}!6rb@Gl4saMWOizrMFEhdAd1)dQUeHj+;}%Vii~f!{)OZ#GPFnMNU%>?~6NS(u>Y)SVIb$n8p>Jj^0z1Rjl-Xy!NC0h=U zH^HyU)ttN;a6e4P`h6BZ*Hhz`*N>~nuL>+4{l2e@0LA$)1K@%V_rp89Ypos!KHlQN zzdkZdvx{wyJSFeC*Oq1+_|?^`s8c^eYzbq9iI%?UnVL!85@X?9HMVq1B$?O0e*@5Ou!U_8#H!|+gXg@L=m6b_@6kgGtxtINwB z^gUgKh;?;za)n?@&N7oaIUpuWX@*}jg5NlMvrWcln0+fh^YB``+NVBpW6i+*(4fZ` zH!928i~NauKH7W|h%j~h1ByVogTASYU^?8_^rT%fsmpks&BeAs-P%5NV`%FG>pwo( zw5lb3_&tU68^m$dDiUxi4BV<&LA?fv)STJuM*f8Sia<20IGBTWP1@ClKe)kB)pHf7 zl1W`7&{M`+UTjM^y%wltzK0Vz7a%Y?SL3O|X@uw@25w|~(X2!cAM}fVFmW62iB`z3 z2;?BCxRO6KQs?l>vlA43i4?flHp#`dN4nT{?k2{@7+0x%&j1w@zbuo4Z)0ocbA(3& zCg$JF<_ccW&GHibqX$=l{CPosE^sD+ktsJclP6s<&{w&OT8DQG7pQHH7uz1H!Fv}@ zDMc%00!q@G)TO6iBx22KXOGMrtyB9_ZK8hCqbN!Ipm~PD%RdZjU?gLUuxf>W z#=y-PM9vhxz^WNnLT$@K1j6fz#2)kGBYVsTL%)YxxbC{n;T?mUP;ixhTodtV9t|Ki)OsYRr)@0t4eT0`=j3 zKANGrPoABe9MtPDH`|u~a`-)g>pmx^_I>D@*ZHINEY6PzE+2r?hh`0oWNeXtxD^2# z4BU#9D3TH(t{TKjb{cYt^Gu}nKgbv7K3hn2GU5E?*s!E4jm#9$j|W2P!6mP2CHAe0 z^_1fhzoi2~5TB8Z4PtYn=z@XUGA0u%5%LhaHe4ABW_)1A3XBiVAbU*T>d%k=ADn(@ zq^yrTAM6m7yus5+cjyg!I-sTk1p>6N1~M62%V=TX4hdFmViEc%Fys=`bDe!F|8Lwe zEVVD=6y9=GF&a8OsISJVN0;X4`yTi-2FKII@A*d?Ogk93_hD5hpGWQ(UkdyWr2ody zMf9vZUxcFz^i(Vm`y!?qyE7C~P2wl<6mq~21vdDq3N2B<$H3=V$X*&*i5`kHG<#Nl zM)u{?l-~c1dxii?sC_lFFA-29u`dF(F_}y?PslS#jL&|Zj7^OlTB3rLXctzR+cx>< zz~4U?iSm~Ge>nXo#;+=(xe!k^G(_kixnz5zKP7&?gei;`DQh(GiYnZvdTW{Rc)~NmOcRcy0~aoNnH(&J*@5yTCk=ch>H- zWp2im8d{xq$TQMB~qNB-#ncSiOrPu|Bc&5wTPaChSio5qN%O)6k#fIftX7u1rot! z@>AQK-dS3@N=qa#Wmcl?RVT6Z!dxjaQHA#~djB_W7!{D}8agX^o9;_5Fimtqkuty; z3MEeb8sh05Em2Mtp0N_G&(Lymd7_@qP?{t?n%pkcw!!dm^O-)zJI8 zitaQKanJR{FX*u*sE3v)Fpb78E0ND#wC40?3TCRz6jk_T-_iJQbdHT8+EV*!*Vlwo z7EE2()x?kD>6)NMS|ZO4i56C(cowF3!U5kUr@gO9{BQil*e#;b@p)52x2PP zk0W5|HmGb4AHa-aysY2S05#K0*o*;42)~*q)uHRvz-6{1n)@!0tNm0 zL_t(^LY1B1iJ9$f=hm=95u=3n8|DP=Xe!#Pc=K4foIYZWjt^-8d_D--R@n2Ql4$Sx z4do#klLVfB3dD_0Xy2y9niu#%r9wuTMCscTCD90K-KUT=LmOlRukIQv}$`C!_u0ZKzx(U(peeKuNo0{Znxm*I|s{LGDr)nic2i{^!okJZm zv~SHGz_%1p<}#uv$|bMTyF+eai2`GZ+NeY?YBZEn8t8VrDla&HS*NQTzdbC`Gs6eIEAMI!uspouF4C`U-JJg=h)9 zl`UGD0do;iV(ftx_14_@y=H|+MW>q9sYxeplHH zSQ0*tJebxmt*Lc`#tjPBu|$M>QAVvg(D{ zSMAh{!CYdA4wk&!r{O9abtj|xT~Z&^R)~gMLnxdyWM~pclyD7fSJV30N>y2^f&gP< zOqUX$20LWb6wk<}&zzRr#7lPljII#5u7 z84FD>y8lx8)Lq(x?m5w&Lv)s+51@TlBFfVHrC*1pbb^;|1xut)Xuadp9|a6${_>kx zZ`b)+4bc{w%0@l%g^^Er3KYFxJ?S`DERo^PzrlM!jypBI)RFil(*Cp>qR)e-%K6Tr zyg#6EP1RVU2no=RkBq+`Naw9b7;E%nz`L&bY}82va@UCpgV>bQiS_9_M*Tt%H%@_k zNo_=TBo`sj!g7iDcg;nAq^5V8d?WLYH5vwWxUZ#?<8)uuQgH8g27CR)mN7m|^B}P8 z-=mbe8kL3U%k!Lcg8v_)G)EM=5*hmH{d79(78vTHuL;XZ9(LcQQI=5}e%h5!18lS& zuXngjJ5~zOaJJ`Sv#!2mbZqn(%jm>>uO3JnPIk<-bzRbKo--QN`t(lJ)T5OKFCfib zM-+K)?$eH?LUf*@-_{5bg_t(y4eR=k^$Yg{joAC*^HyH0T%9WJ7Rk-8+tk&oLV}ig lMsf8lU+rE0gxse+>kn*~7WA3rMg9N)002ovPDHLkV1iu9TaEw# literal 1041 zcmV+s1n&EZP)oPBtFf(1u4Sc@xV{)YQ}X8Pr(ncNm|=v!cT zd3!$}5p$`CyXTE_1FHS6+Wjk_O#i?5Qu=x6^R-2zoDBT2&|Worh?v>Or)B&gP2Zd^ zjW73NJQ2AiK0h~2KU^G)^Ji6X;^g3veq}ZdUW|n@%sq4hdYmqQ8qvSeym07E$~qoK zX!?(4hq%BhM3dQxs963WJ3V~7z-kO|BC2Gy3UC_E&SuVZZtq%}UMPzS*`f@!QtIsV zud`E8ZcmVH5QJ!BtuUNUKg~XgN20_giLykIV{K%^vswRpr=S9o59;+-WKR?t%%gRn z--41+aVtSoXUV1Z7yvwrac-mAw5sdZ zr2x+}Yj{GWqiX+_&8Q|B004f(9>#`iM_PxYqRl9k2E7SzFSZd4QMOtZ#{PUsLsTy0 z@i5eska%(IB{eAV%C^7L99gtMbv>gtHU=awpzL{C2khj(ZPh&3-rfo6RGVgU40(Ep zaYO?gAyx}^eS1eK^DDI2VrCUuOO{#1xv{EF)F9!mnpm>DLYYv95!Dt$H&CdoLi3AK z7Jzk+7f3C~b9M*KZc8B=<>4_r$B$%jH1cJVyewK;i*BcfqgBM!D;wL@EXDUjO|>Nxp4lz$#Ml-RM$d0MG#1OLFtb_cxMcENrL7aCis8m*dTNyMqfND4OQ8P)?R~dFhNgfV{!*^u4)|a(3!wal6v8I2eoa3|^D%^80BMTbf*MpFA9#58sh(*50$ti(i)7wbz3S=>pMYpFi{B@+_|m zmI0voB)PU+T$)PLZ2@$h%8ixMDYttq&{QkL0nO#X=Ta<4Rl5-DHWk%!d+vxu3H35~ z7_iFiVk%@*krJ`b*ArjMh`Nv-bC*a09??67NB&=PpZnbBKKJ Date: Mon, 11 Aug 2025 00:51:58 +0200 Subject: [PATCH 104/106] Optimized PNGs sizes for sprites introduced in PR6244 (#6251) Optimized sprite PNGs sizes introduced in PR6244 --- public/images/pokemon/550-white-striped.png | Bin 4934 -> 4914 bytes public/images/pokemon/769.png | Bin 2578 -> 2290 bytes public/images/pokemon/770.png | Bin 6234 -> 5647 bytes public/images/pokemon/843.png | Bin 8039 -> 7714 bytes public/images/pokemon/844.png | Bin 9452 -> 9016 bytes public/images/pokemon/902-female.png | Bin 32467 -> 28310 bytes public/images/pokemon/902.png | Bin 34233 -> 30078 bytes .../images/pokemon/back/550-white-striped.png | Bin 5528 -> 5502 bytes public/images/pokemon/back/769.png | Bin 2122 -> 1933 bytes public/images/pokemon/back/770.png | Bin 6487 -> 5146 bytes public/images/pokemon/back/843.png | Bin 7359 -> 6731 bytes public/images/pokemon/back/844.png | Bin 9150 -> 8396 bytes public/images/pokemon/back/902-female.png | Bin 31585 -> 27796 bytes public/images/pokemon/back/902.png | Bin 30972 -> 28242 bytes .../pokemon/shiny/550-white-striped.png | Bin 4938 -> 4918 bytes public/images/pokemon/shiny/769.png | Bin 2578 -> 2290 bytes public/images/pokemon/shiny/770.png | Bin 6234 -> 5646 bytes public/images/pokemon/shiny/843.png | Bin 8039 -> 7715 bytes public/images/pokemon/shiny/844.png | Bin 9452 -> 9016 bytes public/images/pokemon/shiny/902-female.png | Bin 32467 -> 28304 bytes public/images/pokemon/shiny/902.png | Bin 34233 -> 30084 bytes 21 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/pokemon/550-white-striped.png b/public/images/pokemon/550-white-striped.png index 855b7041256e010ad51daca6bba717d4142df856..a7f4d1c12f6396d23abc797316e95e9d1e1002c7 100644 GIT binary patch delta 3803 zcmV<14kYo$CbA}wB#|*x0j05qM*)9`X#b#CmxY>_zerBg>Vuy=;sK5%?mKV+YoehT zul+O3$mzf1y!{%iM9qs@BJY{>z;70@)TDB2ley#Ke<@R>RH9)+?e~!N{&+ke^Bm{V zy0X`xNTT39E`^SAWG1FI8j7_yeVnmP__OX)!kFjp?`7e4o=V=o@5|ENeG*2v{Y332fp3X0`|3fY-T)fx97}e=_CVZ6ug83 z*GC-d#y;ocqt3}MyS5}wK3lR~s|7y0WvBtW%rf^<(vpKUBTV_&rp)0THy1z8b3aQa zPk<-5udgqf6|Q1mBY*Z9u&(%h$|GHS8cLdBl0cAZM1+e){V7~u{3KzdVO{Y&a#{n; zM9*QVUozQ)A2L`X!W^*$t^s4;ar(3=7{gu?Hq>4tr=;}U6F>P9G?JEO>Wlgk!5Y!w zmWCtRp;}bLUX`jCwb;H%J=WD8BGZGt$iqLXmuZ@wPd2HpVJ4oRjLhI{f;{3ej`lQ< z^bua}3EHtH?f&AfTuszxnP)P82%#WGalSakfc=US&CM67;k3~~TXWB#3BStMFxCxZsSdvTN+8c9p z9a>CFDybV1)^W+j(W2?a3);iX8C6^xSNL5wR& z=YLW{7fq;rmm!iNP<@7V&>r}mm7o0!m>^pSn3Oa-8C=PrQj+X~3|rYmTb52O5v$L` z^cg;KhK+lwm~3x=5=G%Mw*TP4v6%}8CEOg7YSGLm2UORg`wT>1McjE>*o;IQlFHl= zO~Ke!nudp5KA=6+1oSj8=6P7rq@+qXj(^2)0~bGbJPI0$&k)P1B88?sbe;!lN2uXI zthu|x7ac^J5CSPa19cg$wIdF=8=$#ys`!6pNBkovBhr_0zm<~5!3Gx&_FE}^GSwJf z5)b>Wlrm7Q0aGrHP<~m--nby6I1|(wFy-R6Qp#LZYrvF?!_?|iOYEreRz_iTT7QEg zKR^PSs;t{O@5jZAErNClE zo4|`D2Rqs*qn+Dn4XF_Z*^-2)TtJj;QWW1pk0sh0hZ|+EF=!3p8@$usLQ^hIQg@zG zp^Cj>TN!?%3|_nFQdCKTEX-3WaDOVe1g39sZ+(kH>oRNav<9HRg(z^Gr2^*p7Gkgy zjWT%gqDwJ<-vLP?Hl*lZeQw(d&7_Dj2$@uGZyaxw(O>xUl0@PFsxBBy`5v|J(&9BW ze8bELT>NT5lPmdsz0_vz?QoNytd*OAh!FDN%AYxEMcMCuU0qhMUR)1aCi)1B( z75}~@5izj4#T&6sWR$f8R{Xn?1lZjoDH4DTg4!Eiql~dlMl;Tu861PCiXkacd&A2( zo6l!$Gvi?2iYur?zJ*OuhK%apl_ajD4*C{QqYSI~N!J?YcDmEI0;6n`;-Hp+^wV%^ zkJf=i^&ggx`WzvBmNeC_lzg0C#>~7(B8G1%x zVRlBS_R?k}#T~Q;xo-v5-C__fG%q9j7ABP!W@LPoMj2l5ad!NyY+VY!Z^fWeI209X z?Wj4YbnT6HVNO2{r}m^Zgju83aI_)CJ5-%0+%_gc@r=l7tBDx&@1bWIM~uVL6F01c<6!K#eub(?purm=o!*F`gy? zxfHe}5%+OFO+HY9=~ zf!Tb4!`7jHvFl5ip+%pF{j&CK!PzAsZi#szem zh#l!bHh^(+?eD+7OaU1es3f67N3sEon+xl5aloa3Bnc%F!aVU6nGDN>2@sI~@HTWL z5XdOfNdZjd0)a?^`eq?CF-nOf29mScjGK%9TcZTJDmXsUq(0+?PpQT&fXGR5D3E@E2gWC7#`NNul>nA-jRx_nkT{NL5buTgO-Mst zra}CVAcaIV2wOWqO^M%u>;v*Cdfn~+Q%RwV$W&AIqUVvhM1Zy*QE3{$6w(TyC*@SvrM(j7fQBWyloZVJN=;v3~$jQbJdi@O6rK{2|EnM z_dgay5t%&2p{DB?YITZmlBM?N-V%hCw>%2$$f2p&Vm!XNrT2q}B_ofwYIA0R9KuN8=(5LP1z*@_{J%u#dPXIZAUFis^s& zNYh6HQ5;;ILJPy9$PP#W?kd6#FWC{@|ENt#+&&uZg?~$x&@2en;6g<*@i36pL&7$f zrX+qJji&gwRS6AA*&Z6gPJ_{r!l;SZL4O1LZD{w=;5|g%S0!8vLKP)=VdtZ;3lW72 zw~t0?qj7;MF>4mY%SLLD+tZJtBfNGsN@FgROMijl;2^iVhmen`QHI6HQ97hl|F+@) z*%ZKmD8OMTfd7FZb-bZUaK#m zM2QHgh!y3doM6G%@{-nKmXt_Camb&FmQEoexqU;2q%|d1Af5;#AvH>`E+i{K@juv7 zv_2Z`b+;4;o8kL296S=A5I);2{P^llI+^DlQ4d22NVXCx!Tk@Cm&^NTG{4a?6$i4J zJ|VRSkCbCf#Qiyk)SeS%E#W$F#DDCg!HZWEhtQdVYY?hVkr3hFkzz{lt4fs5-jI;( zT{>OXSwqsz+jPImyOp(fHx z>Yr2g4J=FzLe(jNV@#Sgoko(B5Z^02CByHdQ4NRqJB5=PM0fCrfN)DhLw^n&hBBE- z2B3(Dn*pj4;|2}LP#Ry7EK@W9Z_5DKNlFp-pqF3$OJ=2CS8>-qL>@ z5GR$+63RTc^+W-*#4bQ@1AlG`Ijm=0*sUiJUd zo|qa9B!4}IrRKuBz=r~emxuw)?wKis5sZOesp$GssI4bb+^T^zz|#hr-W5I2 zixh*h5i_v&J1>Pe<~j!Jq7ZWHiMBUI)hV7`fUy5;_oxSgN%E*63Q(?Er)&&>pF+9x ztoW=ksM3WD%pTxIIFmvxLyVx7?`aHf>xq~;15yCWZ&Vd}hD4kOoD|rQtP8jG1h*+v zpb-0~u=MjnXaTs>A*(Y+3TSv1gR41Q0yv_{HT^NfncmY54{%k9w==v8{0B-4j;7-f R=9~Zk002ovPDHLkV1h9~>23f3 delta 3821 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

5J9 zZI^RBD59(uvCA1A6uwJ2roL6y~l?@B(=%=4hiYQcB$*PCNK zC{m@ZmVUh{R?ALohN9MYDXZ1k{@0sjQ{(cv2L(dl(UfEAd%gK(6N#3c^&*lqf?rKL zChdQ-7Y-e_9oZSKf*|-+1imZ%dJ|Ux*$KgzMll1vtLOFR{-T?DKs^!^lJ;H6*PFNs z)o}RDskUaKwWrn!(T30%StJ zz;O2z@l2&P+s>tGaY+P?%s?#&(UxOZ$p5QqzCwOS&iR)3=kt%qJD%x?Sn;e!4Y2!^h@crTs=aQo$HrS0FboM8tMJ zBkjkQTM+?PVS-Tve@hj#)iF(NF#>l;uwgMPH3uRXp$+haB512NoBGgif&Wa$2Hu_$)TTGYPvu2uAiU){sTYc@h!vtOR3zh6N6#xJL07*qoM6N<$g0BBang9R* delta 2536 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 literal 6234 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 V`So7Bng9R*07(Z$PDHLkV1ns?;_Cna delta 8034 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 A0ssI2 literal 9452 zcmYjXbzIZk+orpfmJ*O|21q#?M&lUWFkmAD1qo4F>5x{WbBrFHN_USI1*Acx1O(pk zJip)jzWZa}v+KU@>%Pv}xzFeP@r^Rj(;z2dBEiDKBG=MXHNwKe!NtPDRwKfEW2x`6 zMqwV<&y6&cu`0(N>|lQI80di2Fi$TFk@^Dn)8lC>Dk^0K0ev~n*TyPUevqhGWmh}3 zR(8s?EtZ`pD?kjD{DqO;Q>@$n_YuNVLSkXDV`-@>f&D&iW>4Dhl~SnP`yk`)d~+M< z=_X1L3#3`pdiC~g=5xIdPBlq2?~BbEEqs=*OWznO2y3Exm2<1j-!y((uKi12cFqEe ziU58!+=I{CR;lP__?i-(u%Lv;p1!T2&xhuj+i^^s&$MvlJQ;T)3*_595(&AM+Gd6a z-L&;loej<0zp|Q;o^3f0dSX{vW0EiIRKW+)#^@Qt_Yu_lMWyk}RwrPh6Dt(7BrPpa zsQh_qYlTR7N8_BNDgGI325p5BqQz0OBQ0O*pC9y5C?6IF>|#6cl2{m=+vYq;qkbiE z%F62mCpY9UxPPWfe*2Sb{y?97cU>E1^_LhmQ>JKQhmV{C-bskU7zL;rYorucdRrfsIvv zV>hG71A!93usux7kbhUrnH#M4lNInSxDecVdVd}9!H-Uk00;o25&ug0=C8a$V_{_A zBwK&pb5Zw7=|D?=p?Y^q4!u^xJ%x1iswSU|%CiO+r zNy+4q!{wB@%{;U7`YLmpQjlFUg1flZDACY=qSJqLHs{;1gTu|W?(_+}Ec`n1G1PqZb*tYS1D8YIce^^yTc=~KRac}*bOSR+^$!edy(+#m7?6t#cDvKdaid~ zU{SVouqHgH?~zOB`5b@Q6Yb5JhrjqB9(2tOhpZ4ah9XU!hs!u3)izenx z4sxyqYFK`*R`bBz18Fhj0Oun1!r!@#OAfDf-Xt&_)^<*)8|DO7izr5=Dsk3DJm_lZ zuBr0_pTP!8kF(#0wm~5E2|K@9%1m#M8@)@M%*@*+^w8a=k<^sn2gTK*M#F%LVT&I zp(#VLz8BXY&VFr`-F6VDt>6$fPw6K+P7LfT92wcmtrgaR_#HT_^M4y98u?FluwH70 zX5U<#+a&Me2yE=Wwq8ocmK3)bz;+}2=nGN4?w@VipEWXI5mIqR~3r_K+uJc%~%#uE+Na#6(-usgS)0miOk3?snUG*JXWSJgqWrUDS+2t1U_EOifs~RB7z}LNM`( z^r~AW{W9H2hYEUW-T7J&b86MafgP^a_n)$`2 z^@zUPrR&)L)uj30g+7|9pvxK3QUYzN1-3nQ|7!dB{ek$r)0NmP{Br3wT@$Gw_gw|I zE&*)EqmJZ2Gf81zt@R>$^Y!k@;S;B_xwj=*%AbAv?g?NU^oRpon5zta6S!x_PrsXK zRY);h3c$0l)$g3m;_9MI)7~s$&nL-c_P$b0N3%8Dn&ftR5C?7T+&Dg;zRbYh?jA{+ z&6$8#ub4Z)H|Hh(9QGi33x&ZXoM7yki>KSxu^@+LKm5h{z2={nOMCf##kF~i5^9yV zu<(N!CJRK*kBzG!a^nVbOa9EyM8;S?=j$^t)hn1_Cv{WCo^QBQ(3=%k)cizj=EKHI z?MjNJG9OPQ(;0i`&4wf9bTHyGD8YWqAF>+N0V+6+Lm9D|RW4n**^oji>6o*`BsLlj zWJ%ph<|w2n*vbs6@l$m|WXNT}*e8$`YyB^}7Ps6>U3x*4cl3K%Vx)y%-H!tR^B%|% zOBP2IL{$KP(lybDd*XxK89E}|b1C?^G`pqk^Sm{W*Ve4PvII1KIbiKj-rxCd{wi>v z>Lm(xk~CfSLf}UNvT~x`zn)Y==S7pYOO5ggmg#=)PSK8Ih~6;h2o7Ub*ZVE1YMiAi zKs|(zS<2n4`oZoL2;;5=%yFU?)aQ&w(wTlrr6ZEFcS4y?g!wB+3i~Ng+8nigES;nG z{f2HqK`7;1Aqf4`5o#)LYTB^KV+o9DN1oJPX^j)B=aW=FPB9Ij13Hit> zVzlhLKAZS9TNQOV2ebQvF6{O$J-GjFI#+{M<-ILDj#d~~xZ$QRb}MYJk`CW0(`Q5K z)$|i(>4ECc=F}!S?G5N06JTr-gUy}P=-BkV zO1`3EPGKQsZzzu_O$oDrbi=trdBU#9MWS%m1s=AeCUKAxs%1i|R-7Gmi4g3y`m}2+ z2eztVDVGZ2QPa&>dXdvluI1l1XM!N4<*-Bb+3GJp!)JgaWsR)_-}CFPnH6}9SX_Xw znz$M>g-Yp&5vZ|KL{RIF1wxI5H?24xnC=|1BGBH8=EmWt?RixP2u=`UjWE~2Lr-RfSh|{&)7|S{)Id*Q zw9%NclHXI1*0nN{5ibAIC=FT-IYw_G9cD^b*-xaF>tVojhP8WlLSoH`dt5xnw9;`_VW!n=T;?M2&M#WQ`z)~Uq_?CQP8 z$tQQPj&0EXTNKp!JOw*N05BbP&I-&}5uIpwv^#BHCpVS~WmUq`$fWMsKf|_Kc1A(V zc!n2K3F?Yi#5uzk$Z_4_`HJNL?ail9gUT5lVm(K7s=6h@7hY_$SqHD#gYOJ$?=_aE zEttYe-;Xt-#rQf~O<-nzL2y)@vRKpY2PI<#Pv$j&zmNL+v}K|y)+)9@ul z>UjW9!@@>glrvVSCY%B#9Nk6!R?JoW7_9Xv^2x9(iRo2yYCt4;vJl_=lK6eng0;SclO_ zVg7l%m3HkCBE>QQDb&HD)ByGfhi8WS@pNA~awao=AR{pHA6k`Q6JzxTUK>Y;jqQ8-$o^J~u#n`Ju$Qbz752-(Rz1twDyUJMREB_#`SIpH ziK-1=KxcFisWYI}sQqjr@GOn%P3Hw$D9)rwh;@GleqEMTnKj;t?3qx;>^|u9VJ^DH zv%3OnQcjPp5ER?n&=@}6e#w7DhZlefpq|*9Z?uKf3CzX>S6aOw|1bKJvpD%8;!KF> z1a^v(XHxB{lxu>Z$8L`gB8A?SW#2a5w-7}vXzbB4HBogm4gaI^<^E|>fOC@Qn6>gt zmMgjuSlWktMZ=>Jx;_rB7yr6w=G)~wt@OlmE`Phv{eRfg)8Ew$#4Aqw77Rt{G^4hp zL0)aqv@|V>$Kq!~iBsB9hgVbK21l&okk*Uv1fg*C+xuPgXygh1Kdgkq z>LQplq!&bNRW*f}Z!`djD71{yDIZltqi9-uNiY^LiMZQR76jSQp14uX02WGBXud60}b$Ke?d2@wJe%y{tb4vrj$Vf{mHW2mQTfz}WIgZkd% zopf&?lRdVlQud#$OqhwOt;BVg3ZYqn4(DR>IZ`mU%iJ2?J?1>*BZK@UHw+MVe<)f? zUQb{M)?(K|vUr4DBZ|bB^%v93t8fvR@G_h;QC|A=6u;%mf5G#P$>>`1;Zv)L*OWx< zP?iR&p%^6+C(K1pL=1B))Z!W{&-&a!1JW9u*`}}{+U#YIAjw}L;=h7iYi&s@YvrX9 zD2UC!+Lo+wpaNb@RvO&0$MGU+ENuviilF?GVL~Cb4pd6blfqZbNps%{^94WOm!d%K zKq7PNXLO9O6C{{XIRa_Y3a~d&;T{n)gv1t_3gfz{ZAoqrb24ea^QZ-I zG+8(Bm&QKk8ZsZ)WQv#@(N+P8*uYj`k4~~?7rqww-jnE8HM>`1>2M~bk&&)0ZwGdW znvlHuFyrC<;~j5|btSb+t)%en2c|_ALFz0=xJq#8N{>!^5Q1;0He?P0S|=XXMs&E0 zDWA`mQ;EW)sh@HV*=Kz2z#Dp>RWqr4#xv{D;=-6O7{a&z#UOL0A`DXZ73s?yl_oF* zy7{wdP&T!9Z7mVIsLOT`f$7a6bm}gC1XT-PLpt_vkOBLp>;x8_NA9i3KSO5qjtJX_ zNN9C*oL3^&A=U+5XjFX`hd_gcqyg6XK8x0k?=f?xCSu_OKkJ#99Zs-cZRNw00C;af z3<2pH%O^q7M^mt~;%Gv8ayqQf?|m5a(1iSRB20q8(

E?M#YipuIsH(IiOSOJn&4 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 XfqKQ!@e1bkBP=a7J=IEO+tB|3X*VD4 diff --git a/public/images/pokemon/902-female.png b/public/images/pokemon/902-female.png index 24073edc097ca1a531ac288585a7188bbf7e60c0..6d3684bb6eeecda319ec557ff13a30304c2506f3 100644 GIT binary patch literal 28310 zcmV(_K-9m9P)JK~#8Nv{x}}!}vCM$=%P=Bo)ZbOAQx!qcfNZ zUh-hz1v81@HDWj?=3w5!DiLf`3^$3-UNBQ;wyx+e97w&(kTy}U%;}_jvy?;wj$0WcD>>tmExrOtW z#Kg|U$$S`eKNL1LFG}j5@+ZUDY@9Ie*6SzWMWGtMo%ZnJA$WU@US9ltJS!o zcCr@G-&Lw1gKUTmDWi@!^BU`4e=tt1YtYqksgB>EUW^*`uR0%Xiv9*&LeK8cMTt(w0A9)czJz_M|1}gy96%G=0zkX^H9Z$8h=zY8^XFe(+vXdp%Z$$4> zt9Y@&^6MeSn%1Z**^0V0(TUcmq(;a{R1f25tHef*q{zDY2c-HZ4II`zW}Ole@~=%3 z+Z4$;F33|Z-#d4}2Al#2vb48)i8Ua=a?v+D_f0sz6{&wCiLV8$gh zp7+VS?Pj#Sx{+zkU1j3jf!9BNogA9DSy(Z0zf|j8k5W=2!t%#P4iHtcQzy-&rz^lx z5pvxuvvZI9i4>zFHX~=PuJsz%Paoo<+J(DoGijJJ?kX^2qds`Ly4h~8xBt9RDP|(o zg-mQw10EVk;=Jyn)YYL$u!;5G*<^OTq9)ibpPDRf&U&i5@R3egf}g*S%7&kh?#nO5 zg-}LAjZKrOr>Ig?pY!)sevmPr(uGtOYGPbxA3TiH?RK?=i%H6hPgf!_MU8sBmdVb< z+fo*_MvCbe<3KDBsQeRq8b1?6Zff1^l0F9#v>G&`A2;2~>&<8-g|10dDb5UFZ4LyM zJ+9Uql(kUb`=rEFiYp%HPN&)+GkQhc-XmN9Di&4cra;V*M2(au`|Cwww9XCs=IPng zR4>F?QEQD&#~9CFjev*4PN-g}t*Lw&6!qN$iJEFD(zYvIn^N^J-x{@EH-5_LW^_v) zF{4PCF)w$%@}n&so;Zz_`=B${Fu3wI!XFAF_s^H&JT)3~vydLr4f}c}Qpj9P80hIf zkZMhq_F+LJNud!;p@d)5hw0

Q?Bss}fBCW+M7sEwrZYy_El&KHS_&9_bVn=>)*t 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

yZ8L)Vg=TUR86mqACx{ zeJoH!n*qb9^0g-oJEtjh4VMmaq%;~O+`oCDev&X_Qu*fn$F+XHUq`AYT{Xz^&+Z6= z`3agUm~y7JCA64Si+Lb$`U1!di~wkt>ToYPqT@Z{^E0vf*0mpI)!1g0^}kcAviz;8 zWlsB#GYx4XlZK>f7bre`ZK8C7^yAl*<$00v8@1Ki=BoQI%yD-cpk+zD?e%)dCv~;? zmemh4O=|hUA?Gjq%AtD9Y^-hoUK6Gx6%mov3gkNw|J|m-J(OH0$?qN=tDALq#2#f; zsU?%ew)*mF69?cvwBNpj5g&j<0tW?2jRne#)7K?MK$Lq;c~QvngMv%h0b&x8dO236 zFhszCx_v(3S?Lq2{bo(3(WO?&(tZC4!_o=$KQJxZ`&~j0azs&CfozK1ce~pHM;Zt9 zZeOfFGONC#hOBf>mQjCu*6%-ljWf{auKc|-#|0>zs=eOFSl934=idi`!s%;T!A@n! z>TAjra^UQ7wPCC^3ZVU4jBr&P4ro<8)mGM{Bj8pYGcK7QQ3Fzo@u2J$Q&e*A+aG#X zdIku7@>t*f?e6X$ko`p8C5T~1^__@*>p!z(jpt zf}QFEg_A;XOOdIjo1!BXYajakkW{UefE-uF-jNZVIjQfkAeLz=0#RpBBYgJMWn6h0C4nG+jX$%v0&N!)Bn#EP&FK9nh zfTO~1AFc3&vpsb6v6%ehSt8b=k0VulMhQXwj}-F+CJVBDaJFg&b(f?nXshb*xg%A? z17$gVaYi;Ns<@?Ks+GM{fO}8zf9me`MUG=l5PhW&Tc>Ha4jH4Dk*cfBoQ8wVE(6nO zfL&nV8jdfBy}TevFYi6@@O&dT^Dp0u+9wB<-h zS}Ly5QX$ry^K>q1&Gpy%dv^+2M^eI2i3G|Nd?x%R@r|gJ1ohuzP`C8G!!@Wp{-8ov z-f!w)d4t-PGTFNeQ-wx#B*gc=M16~@?{97OsuJ6`cKj9H`zs`b+^=^kqR^`||3w-qvLm)W9>KJX#st8*5Oo zuHVQmidFsf&Zs6b;ZfyGG40%fk~sy%CbfH;a;t#@V6PN6bpv<(y(+G7g%0_*XV33# zzr>5$D{u-Q^C@^T>LHr&86#TTF7<291+==@^iN0IGp)^t$q0C<808K8r;iP7p5 z=?nd)9HnYhp_yst7L+7cP;{Djf_lBD@2JT=x=!xZm2wtZ>iF)(FXcW^OHMpkuci*hPcdKgs-P#(eZUx>;8p#*6g9~*1^*{(;y#C@U z1r={OscTPP#DYG~J)9z|)j@qa5>Kx-M|@e!Q!fxj4+WjaQKhMZ&8XcIPwpo&6B7jm zdvwbaRJi=kBwc>@?ypj*IPO*iRTSPAb}ni&kqz!$zlW&;^G|r@3I!Fa&Z-XT6TfSa z^zOQS@GSrsEUH!dGEEfMH0%__9;ctp6mRvtVybW8T~a<$m*3mhVWOn{Rj$8XUr;Y! zy?UXy8Lmzd)J*D{hCvk=u})#9)~;^A-}Cg5!LzdY-;{fI3p-pAEUZ=Ub9eli!c)cR zlv91bqv~r53ZAO3RP5btCLe!*S^Z#hm4fPP{fmubfn{yU4XXROqABh57ggY*^y^$* z8#ecL#6AbLbpEHpO*Vh5bgkk$a}_m>uhhy53f_FM1;xLl@a4A@HmjfU5qg69BdxzR zQF@;CqSju2d7d5*j<1ST_V`C$4yxx=J@dCRSev)^A62%y2AN_qwYs2ehHjy7FTd?I z1>aH={)?KPGX*OyY7?qy-qlAmp{j@GucTXu7R-GdIKkQqm#Q)qx^)FIC2-e2fAy^> zet7vEk9wTdoGiY}&xY85MO{ppD0or(A8-kJzpPUYyiT|a*Pa|yPrqh`26+Ma5;7IK zv|1I^{U%Mn;L&uszg4wPpA$k~e(OJz{5OAsq?tL1T6s}BEX|YvuaiRE@%fX~WdZ3A zFbdY?vIul(`fbisQ2asFb#CLT&g%Eo-Jgy>t+L+qg-xA8w=$^0&8Ec-$;-dMKftOl z!Pd@;?69m?Zb5mw`mc|_FxM2^v9+h(rouVPic|Q@-j>i)+rOk^Hc^wskL=6>P#x4p zzk2%Fg0hi7QU_C{0A}hHxSmrP6+9_hR%Td%H@b9DTMI;|bgsOfqtO=<3rp1zq}9{U z78F%|FHbQ5kkvbzu*1XYDbGpN`TwTif`WH+rd&|O zcM>iYEB;I>H)mWHcMUJ={o`6)3}QL1=9AeaQ6}TbN;Vm+#%Q`=iD?UpXlA~G;{Hvu z(Kw{*xp{+Hmr-H;t-h#rAp;=PEFT(9!6yezv{O;aX4b5Ma>;v>i|RR`7DsnKav30>B0ojRFv{o|6ht0L7G(}u*}Qky$d6FJh* zvpwBLRvl9pTv$3@QVV7iNnT#l-O9T(DP4{wIg{@+s_WF$COY~wAvc|;pg>S7dS5*( zm&PO=_a{rBC_e{}_=4D3t&W5*NT&$B_T3ObHZNgVTP*EK;46<#M>R25o${mDqj`dn zsjQy0_fDx0a)d$aSDLtkt>dqjin5$F$OCyBqNse~-WHxbas)jMmzN4S2f;vVx-v3^Zr@5-4TOJf?YfB9M zhLG_Bl4>lEj$Q<;XO~m=GFDMaoR@+uX&NW2NdZA^r!QYLPflEsnw`W zoYNwbQET}WsoSjh+Jn=T>~NC4PmjWipvF?yUu?HrRc%B4ZNXpPpkLu6^& zC>_6qh{_XRveK)UCSYLh9K)Kr3vv2o>Qb9>Neh9s%*G#x3_>!{# z;I-095e@aNR#8zhfS`s2^XZOO$z){oz{sa_g-0+pV6prD^4UwEsZBruY7>F9oHsKL0kb&j-JEY zYn-6&N6K3BL$7yq>5ZhpJKMT}JENlgZPHuggE|CtoE#nf1jXO0(t>jz;`)~%T@LMv z1zj$`kxGXJA9$9Ghzs@2;(ou2oUt()=GE+lP&w2r9Fjr`srk%vm?gC2W|hAf(0a9y4?L-x~LO1 zoYw6mj`@8UyPo{Vait5TMjXZR^x>yaewGVzg`sVWvi56bGjP1ki<*ek%Ohw7a2da> zcL+gE$INH;J<=6b3Cw8b^R`QaigB78eP8iEm(LW2zWwpXK*f|OmlAx@!b=Eh=sN`* zSE|$;{)g|JHjAalD542yRopUXJH@w0@DqvnR)Q2(fairV?aBLxaXMCfW>_p;JtLGB zq{Wo=z(DxzREp?0w%Hfe{Cp+k|D;J;-}WX7KQRSCZBzM`?S~`pr>b#{Qe@2VPny$! zFF)J~xR20pl0}vzE}4ONrV}rZ7>KYIy584bkAm7Hl6Byj{%^4~$JS6=!KHrX7xY3y zXD8O9_g9sHOsMUE?eG$4m#Rue?*xe21L6JDZ%zJ_;Rn|gMVBAq_}PzyZs7!^s#Y4* z2526#A*AFz zcnv9x6VIrK->(q};VCMd(=7d}njUyM#WFTWDlQc1TPmiUruX3=&K2&xQ`p#$oGgEt zKd9?0gUW=5Dp7nmWkKHX1RLPD36^R0tJ*~P6~~D=R7$^Cvb5(56VH8K(nc^tDNvOY z00NK@$y?SbPQOc8YRYdvzfR;(avs((^`2Y0)~U5VV=|!uPxhuMcT9pdDJ7i%CP5PpKdIk6n=4~Bq4z!gVjK%+AWQRj2=np?3$qQt5W9wR70&jn z6i_e+aiG5Ep;5oIXVWAk*qY(%0BMQbJSvw1jer};rNxe@Q4|H7|$F7g1 zEUf)4GxseC9m$NAzplUW-kCm$9P_{2B9`j&$R+^O{SoGK(CFuK<*(16w1+eSIjh|9 zH-wm-fx!1u28gqpm_uIh zdir&5at0#bAD)Rl8=g6C@}edIU1-#>MC^=m%SyZcE4-l4Wy*EYzJUCX6IH2|^y|*P z<$)?dXb0Oq=}S}xC67mVK{HuXbW0bdm9ohTilnA}R~u|WPE$;Ep^$0@W|70^uPehd zvo_TOM8Sqdf=*k;qbn*=*tv6Cwp%r}>mx{MgZyUMHjBJx#|kd!{s}uZ;#E>zCX1p@ zwW(8MT__F}NgZ)jaZvIxNzV!9DPR3@{c&<7HYhDia|}&7i8|1DVr06-GY~#jtU4=S zyNBX{;wHB+sPB_r=Rl+5Q4(2b)PuscBev_~QIl2^BO+h4Wy~^Y+ zh2k@ee!fqM7~b?t&M$$l|TP`zc?fN)p*JGUA zAha>gB>YQ9AI+5UC*`v1y#@}n`H2DocB(eh#stb z+ODS+O`vk@L&>mHI0S}dFSPy;P>gk__>CB;>XUP>=7NTT3ZZHvh>o-0i_-E0+|tsb z!{TYYlp1pNudh^Ew$H~Ky<5*p{o#Oa& zTTiFrk8P*;&lGIypyc*~Mn{S&s>7`iN*mi;!BhQR5jDEb)*wNDR!`m9q>l|JhUr~kOV{^#B9oh~_}MQLKCE$R`=twWEC2A%3V(ym)5xKoll zrTfG$IjBI%c~l|&g%ecryDUm;q2FNvi>L8YU47{&a@Nl^#oGA|Nt@%zTL{o`xE$6B zpl^|bMrlEF_(+o`2D+tV)y^narJMv@A6V$uov2tSOs95qpG3jAN}&@Vqh?f6hGC)K zl|yO&hM-?6Kdwo~)}URf6TGCyM0LTh4WMBJWlKZ z|KH6Q3YI20RF4YIb+4CBpydCuwOKr>k<94FOLp0Qt#bvUdONI~Qy=Q3x==GxK?Pb} zi37(Tld0e6^F;!L$u4K*cKtUnq5cz;UR@?#m9p2sPTgaci%n)+{wg}f6JWKdPcfhC z7*MX>R<=ri&+HeLpSonf3v=ZI$dw7{w{xbdvEQrt+&^$pyP%WB4}O`=@uAmbIyBIg zg+?pw`Yv|6kgl&QXmRfYNL9e*AgC18C6y?7l=wb%%1Y1HdH0~?bgr8;s}L_A76cXJ zKWYe#(ykfn((OM2VmzmSx`X!|@R<68`Xv|^JDY(W%W7yeSko1?__~+v`aahQit5ns zqABWg6a7?!BsrUY- zTeFqQJvQ!KZGfX>V32BP)GfWPT@Tg{nXDWpP^LXDT5JGUlPOPX9=?`4b^lL(L(DAq zsq|bi0r*3C?Qu=QAHgJq`mbEJH4iiyv)`Md%C>WZsJr8C$2S9+rUP+cvu0orKQv0v zm4ZgO^tx#>S`{?*Tqjoj9yzO&0yD3K+Mc0YIdgSFQ zWr7$lXNsp&Tqv+pXp*bGbcf|AIk8ksvWMPW>1mYK`mLpYFTCKvq)PXehj9Q!Z3^;1 zL!;jHjA^T@!nNx~SOqOY*;hs7Y3S<|IG0c-{XQyc3*mi!yPj9Huv(=Q`|2Y3*xRWM-Kov}Zz|8#qU1FH!)aZ%wT{mk zx=M43>XgoYzab`4S(T`)r+<0%x4kU~8ZEW!IZs4+{&W9%l@!qZ>Q3!H`?Cr`iBWPB z)LT`AnBbSfq%?s3jnt-J=lnAE^swBKmR9Raal+waZsB%H-?@^F? zd%w~TM-q-Y8NCjb|;vJi;ARD{*)6ogpg5WD5~4y~RxY$&{XVHedpb1djoJCn-J4WCdIL4 zrWjvu^QX0ElP5g3$-3fGqG}6P!|DLI-lGX)V1l~5JIzY5J0k{M^D#Q%(j<8nk+`SI zx(n1nlx%Z6e3^1jzWq{Frgr*C#5EC zd_dW}aix!B~=yRwo=S$$k@o5@|Kn#o+9K>$P;}}=ow>=0YY_AO@Gl*5felB z(JjODEgIE&=_J>4cp*V#0 zihKb&PUw|{qWwq6Gu0wI;Y+cM$fw6~E+!oiKT=GWK!aq_OKH2)eAjPCeKN!nSl5Wv zQ4I`jSy=V;oC9eT_41!;{ze&Kz_n_&mc^B5$mAJ-dl7h-FXbudI48yI)DIGxBlVAg zZIV=iUzGSi{~6L-am&ij`Z$irbW)0EXp~oFLES>1lA3czB|S9YsE2k;PmtaBlfhJC@+y#$$C_BVjKW z=2Ol`j3@d);B(j~Cj2a7bqY4kDI}^ts^o*5ym;ripSY!@N95}Co!!cyW+^kCsmvsT zdk+C}X`b$S@|w{ztQH|sW>_u&h=UU<8MIF>$&f)g@VXvs{zns4{iMONP2j5s0)D-3LR)l$y48Xe8GMGPA z2Uz%C)XoHTi9lE~o5y{H0k?E%^iP#Z-{3ns}7U}Kk0tN9zPtTqi?JLGkF=B;z;`Ya&tn~~_uj0#H z;`TNfmvII`#o`z`8Rv8wXdpr~svS8-Zy;4!o#VugqXf-=Q54g+NPc7Xk(53(?8OXP72TrpzN zfQd=O`9XP5nbFC6OOc1Xf!D#aBxIUPlq?eo!75@p))f+^MMbC=?F2!?R&vTAnL4P) zNTMRMnT41xTp~+HUdpOG;i-L_rD4&=gzgs=$nSsngyTmuwkP*@@h>Ki~qfo*ZLk}F{yeLrY*z6%WkSTAe(2-Li{en)C zj09(9IZO>BQ5lJQW+r4Tu#_N0d^dBT1kqKD8SnVHMF2qg{188TvF6Qgo^vycN; z=x8mm2&=!k%;YrOSjv#gedzX>9UY4kS)GW}^lJ_gI*ur5p?SqRn}ft)drQwq>YyB} zpjx7R=II}mkd&4?V($R7J67B*%;?QRHHjLYpfcU4Jv@)~#6^!8BXgj$ti0Krj>9@p z8ev;|Fk{PM_$RX11n%d=p|NPKD zer_gxCU-!{XPm_})jXwyL*+P9y}RTs*{ricC3eP0B39C(Ltqv-p2-(f{j!PnLQ1n} zB(nyUI~EZM%+u6ecp~VMk%8<mn4O7aQ!8TBdb4##A=59L|L{(dy*_ooBSop?r=aDIZvH7~S0+>adE!p(gqBe}xgt3JU6TG} z@383v)#b(_MWad0-9?EY8t82C)#MPN8;7bjNLo>$wX5JAlxJ8HRAYuVJgvfFwxC)( z8oxN^OB4k{+Afg{l)!vq?x<(DukEB?_IB{K?&pM4qMtk{4C=d7r!lCY3=Y~FOfR0$ zhDMWI0;E(n(Xc?rQRGmjakdESFVvsa&^1yN=paAdVWmUKTPU9;RNoqjm@lUCP?Nw| zBOMv&5|oAuUlX*++!9WH!a0T|Qy@i{SKbw{q!s0~!lM}w^Ki&|LK|+((m+|CPe9as zsVD$}gpZ$xZ4`eW+%YpGi%TU-nwk&O2*?{3q?LP?8SE!k`YD*udtXV+Jxe3D1xD#{ zDY{|QDH;Nd>8&Dq<-U+g666!&{s|KDIy1+VC!pm!K}~;D7*sKcM?J>oNZLgf5vk`+ zNlep2^T7m|i?cDk$t?~UFMY6S)*R1-Hn|7iuO*=hohQ?cH-)y@TvA~VjsHCxR2~GH ziIg_89Fr#SA@`l7TbIV#f>))PbaWCc))!@;I_P7=D8hXw%?vbC$ z!^(^f#EHEn7v0z~I*;~|5|l5B1B6b+VG2l)v442LbO{#I2Q|W3#U}9H1a-?IzDr~E z{?Aydnqvs5-%(=u$LnUMMhm!Cfm!GUxw%AR;(Lm7LXOnfa$_vRd2|wuZm?vcf=aE2 zKBuBD(+kMdFcC#V#xZ?-t1^@>bZkxF!}}^*ge#~W{!f&Aa^BdMl@@(4xi)lTNkI)w zHyC+NC1fy!+yvFuFJ~!1M~cWJHp~oq^vH{DjINVpvX0?5=2%$hR5X4>`~&5soe|os ziOuZC6=~`-ft&hrTJ?Ruh{hVlrjYCDVYNp$44Py&ujD|L+XcDf5!1QE0b|??JMhcT zzc}pOK%c{KV;^d8tK&g8ni-%Q#IrzD4SF;5(JPnm!%@>2srG0aa0g2d*H2~WxM40* zzDj9Sea4(~xA+N4WuIkh^L0(za7|U2cs1)O8OHWLsOE zC++Wl^P8=IgGo(8;H6iZBNkP#Jq?1`pDm_r0{<<#tXV9s*`OvSq1+;+2`}gpe(ME$ zk}h=5F=gzMKDeD&72f{UnQD;xzC`swH}N=9z>PuGySBsJ*njyyme?lpqZ`b#tb)3+ z1d0g7$VU$_eehcZB_OpoFJnkKvu8Tm7CL5XkML+C;=4tvnQh~Il8_(})%RE3E?K}G ziZwllkZ8gD_u_Y|u?4xelYv2&53!`^CdJ%U*3bI)kVa!}%2wqmMzWv+rc(2py@9bKDr)L>_d5c@}a(0cWBK1?L-<2bES|7zA!k zgHU~Vpku32YCGT6u9~QqG6{=aQc)ci7wgaBKTT1kH!dnfjOwKYxj!Sjl|b%9Bj=bI zej1IIlHaO08SzYbr!xl$)eXW7tfJ~3OSO$I>x`gI1-g0JAo#C&q_ie5#Wc}Z^R8ZM zWgzfSRhO0uzqHMOdlCy$shxVQX(L+ABGXYA>IQ!X8bxdF~c{`pWW#*IZ z(o$ijt}DQOZ|8c-FshB11#x?K2MXHdpl-U0t)CkUwDavpH%6HXQmuM7bI{*Fe1Y$H z1!fGo)wAFAQ*T_ccO8iO6uhAOixkhN+L{9hx`2D6?`GPFSvr~Y;{VG)yZ>YTzjV6} z2VBjKm24yjbOVF*SmR8`RieTncn(y5f_Zn8v!A*nn-kFSdz`34f05$(L|yXsiLvV& zh)vrm00Fatxz&pe$o&m<8&KA;OlBhPYLn}(KyRrsNVg|~+Nt&=Q2tpksOeegSasb4 z4*e@APCJUm3W%C4FV+T7{~zylX$)=;^T>4$K!$3eqY8y8+Lu zDosNmkfee-7d*t!@t%Q>p0!r!SmKscBxqzT6cw@2NV?ucS&lL;}h@jPrEy&%o zAh#$-jJ}f-+}7HyN^}F(Z+*6F6=Fibn$4bAb06fLNb))=0r8Rp%tm%__C<>B&a2i!JPA-{Zz*U z#-82sRDQs|tf02`q_kLX(epM`S9BVNXY^tVavKjgEDaOVKoC^UrrMN2Vnu5DMZBZN zK+I!gv7ZViu!WA-)GYOLODu>v8iq%uA46Ta{`JTN)zyoe7UUMrSG#9`G*C!^n*LZS zZ?L$-<3h(zC!ynjp<{26O0Y}Sh7@DhcL8v}#@N0P?$q9vBS5Y#vze*}SO8*Q~L*4g-+>fXKf~S=&{D{ge8`HQ| zX^Bj3saG^erfGngu-jmoB`>V*xfD;&Uy^!m`y!_0>KSeXFU=KHmqd|Kbx^yev9mw4 zGN{@_o-0}EEl;ujSH7c!cN0pPUj(^l2m6MbSIjFs0x3i6XRTOm)TJlYmC;9{?AtmyDj$LGf9&pu zSS2EI3ZS3plw{Q?1w+S8dU3{nXNI8Kl{B`%6W4HCFfF$4XMQ(8r1gQs9=qkqor!AK znm(u$r=dx{RE9bgJdnjF--dPGsoTsVNm>SMD$lCngzi=}n`210j`5aSQ-V=lCDX7-XM@VpkK08SSL#GWFlKV}0)qOyN-|?; zT4T4t^g)GwJ-JO)hF8YWng0}2p4)*ps7qgNh_n*qb`2g>hD@;=$NvA{MO4P0K=OrH zHJYPX)%v7x=vZ7?fyVJDM9d^QIs$^E64Ya8dS<|MiTf3!Rb__Jhws ze?z7Y2wWW-f|Gbit%J5QMNpBJ2qR3s7U~_kYHq^7rAIG<=Zl)a{_4aaRIG+vGhe%B3MLWa<#(Mta&(O?n5=;m zp;;tXDuTL?J_#q^0hUQxdrrKT2qxz^k`^;L64N^5L8?w`CKn)sWsyRz! zAYPki%Rx2uW>f?6B$7wyJ8`G1i;mp&!XUTXTYyc*GLoVe$uPhnjj*6EqaoBe|4h8Ph`wbF9+HqSl$n$%&f=q^_UX%` z-6C=+B65L)L}BWsTKhpkDLoB?qldfBAn1+ScbnP7zVz2O|B-m&dSm6XC`q5Y3*(|J zy30{m-bBWR?2_XY^uU*=;aQS3f`3f?B$+gu8k$*R^^U%PpgwoMD3MvJ#Ff-yCgE!f zsp%PkV#dJ;U)LKB>gXY8gNNoKc6bn*go_6cU!DqBZ+?}WeMGj-CJI$Y<~sn36G?6G5q~bQAs8P>R%O#b$B2OKIXB*k& z9EAjvI8Jy(BeUwe8L2c6p9*n8(7~x4s3KH;C9@I!i zB%{{lZjisz3c^l5vrHdL}PSSAIaNShNI9h+;c8A!%VgoBwZd{{n3 zUTO|Tlekcf{Ze8}Sbm!@kr4u-qp&@YF{sR*w?=sO`2X>S0BycU1`p@kR|GdD19IC; zP+e%Iw*y=0Kh6bJW(}xUV(8mZ7Vp8XE)VEx+DG`&Ww^Nocc)}<6N*6;-N3*1r=v5AsO6{WUJ#6@HuZWRRe zkE2GUED>)0`*y;R#jB2~##}dKkR~FPiciec^a#u2^t$&aIS%YV% zogx<_$~HLHl}s_d&W4IMQ3NjLkO{8il);WN+WBGkJ_2a)I#zzmr|dLh<6zxq4~i#} zD82Xk-+%lEO3<@#{lSz$^%*>ZC-I|-JtD*tu%V*Zhu`srM)!I8Y)4*#GNZTYaZoSp zzrIBMfW#@$ql*oc{!H z0*I(aRKkM1NqV?RA?s04u_-neul#Dt*_&r;KAj$UO`VE+uL*G8Uh=o5gNFDrWz&wN^D38Jw<~@ z=iBB5CpKQ0g1HYgQT|)NQF>HZf~i_0X+~-?lCYhcqjLW_H*_dG=@MOxV2bb&v-xjOO>#5HFHOk-!Xv`Q?4h`p< zfP7nW^UeS8yD?F;G_eGU;3>g4C2;h}-4Kcrp~wCgKl~z$W_GCFEK#C*?!96?9mmZH z2|jAF#Xra9#Embl!NU;JQgxzoQ9V{B%7ip=n={-`MC`D;!I}wt*Xs%@i!f@#V?tA- zOGP~N-FyA$bA9jCx~N%uo@YERQ)rl%2?KHvoKok9X2b<;qO9puEfHF@C4$@Zw0iRz z53|{l>k|$ll^g%P*D>FFwb~^8fabKGGBnWD|GGNC#pK4*56!TNf>p}GG`Gsw3*J%2 zk_D&g>pNJ4G0YAlFMtdA@4cpDy7$T^<9(u22T9vE^Q%LHMcgxq{W^fit8tX=}n9{Q#!UNZrho*_4LD8yXbtw&8 zR6{eH%zdatDBq{EHf#cWp?1@(Y0%;I2UW1z!l_!gP9bqFx7ho!1VklG*{RMslDc-15-m>+1b2ZRd4v0;TzTi z=b&mXdyX2_;2lY;k7t%m0wDx(9~{(MqP#>l)bIr=sINCqnb}EEPPAGHhuj^&_CZyp|Y8&;TI&xMRPoGyy3pc zO*Cup+4{IIW86t@m`j=Ac?;2g@VQLS1kCAl1zWqe&0Ew`1Mv1PU>>5({&%@w64xref~jl{%9&XrZexe?A1@l#(E#?%8BRO{RP+`|5)$iUh(bYT->CI(N5~i^xicvX(Zfx zT~`$UerGB=#umXqKg;fB*7V{6J{_yk4!b#c*XM26bBv=3nnRDkiuMjxybw_EYVN%< zHn&B@dAAd=u|6do<2-ilWY&zE==Vd;yFgwVRepPQ0p`&^7cLp%!VJ~2uc|G4?{%~~ zmQrDJeRAWOjh`Z@tikBf@!MEx`USzm3KX zRF#OsAHrBIKdc>8S2eCHvmfN5i9B)MnF=9aV&!B=iB)UO{4BdqLXq1LRN`f5bMV8H z5GqRXxBrNaNIhSGSBgjfhff4*2XQ};@Uana2S>ZI8V;*N+o(0~y;s%)&E28f;gmqa zIC_LJs2>F27D*?w=GjC)jwKCLBaWoxCytMHiye`F7Pb0_^RGG5IzzE|024q$j6w=3 z?v6c$rk=d+9xrJSi-^0~mtTiCr&OITsF6;rNcQ!!>?gZ(UH}9J?U3vy#OjG-NdMwM z0bIk=1Pkzp6KdIO0YOADsK_zk?pU9$bSGyw#byd*?kp(NxW7~&RmZtaSX}`VPAuSK zf`N?nv+OG;i*2H3HzAho6m^-V-w_#yxTuZs_6kkYUGFQ)6P^GgG%h6AN^qLX{;Ku~ zP&%pvYdGS>%!2Bp^NY2=XX2di4s)tbsZK=v)^>p>+eSNr+@f&43xL3&9SkR=1OF4p zfpSFnL3-H_+Bq50zNBIUG(lk(61BZKAhm2R(6&o6(&^U{=f2kQYHC=2dOC*pSkXho_`SAjR^l zlAuCU0I_Ja0-3dN3M4cBR40)6(SV<@zISy{_W|TFiIrvXI7un9lKD5$Gun}V;am@dIqX1YyiegT=5@mn`RkeLP&GMibmsta}#eZucz&g>J%ez+!`@HVn6;#JKS zbUOwJxqJsFYJxf_E9_j=NN=l4TGt|ZikDzNt?bV9Qyu>TGFx8pT*VD2S*kN23TM8e zYqzx7!NkWQ235x1CysM)jVTonvN5b`r@>M4pzz(jS&EN`>#?e?Y7kUwH^ndM63kuv zt2OR$HXwyUnoq1`_FKU9gkb`^iT?f}F4e_P97k$AZzhCZ?18tDspuvV)*dYAt_74r z;%GS}LkXzu>zb`$9YKQc!`@QP}>`2^{xlQ!rf-U}SfNS2(!8P}}ROD*UO6E>|+V-R# z567|coF<2q(KzCCo)2eeW<4jd5`pt-zD@L_o%|;HtUb_A9NVVr1lL4S9QSe~8fR*nhx0Yb( zNVDsy6@?{1y$t9~0r-8iJ0s3;k@LzXR>V3(Ai}ve(Z~5s^z?9Szo_Y@W+FvnlA?j> zL5IlKo_4K`a#-9{bkHG-2kLW!Gr3a#{4|B@OybSoFOKh zflkyWmJY(=o9JWQL=O;3SkP1|xCS1iwIj;Yge#@J`hEAa@#kaNu*3fqs>)7$D5&dD ztx+f%=T=LLvGv0Wb2}t!pCDs9|L4IOdJ2QV#A*|eu=pl=sW#Cggz`8nfot+3%Jmn! zZdbK;L2??)D<9(gH#4AJfLzoP{e-?8hEJRP^4 z`b$A23}_%nJ4QT+@$qolOX^Ts1P4W<-|}i{ES*7{c0Dz!f(kSp-zu*)>6TUv!0!cc zhC^mf9Fb$uP4o<*xJ@tR;2Pq68UoTUEHcN&0x=+dl$nD{B7+DWjzv98P6NQJB^7HN zE?$1Ce^x_9opk6Jz?jq1R36NiS2X>%RAQNvU3?S0P!NjS^pN9k;hHo9GYRW&$M<@9 z!honTo+yFGWT4+}A!KdBBz;=dZu??tZ)c~pu36(fTm)y}#A0^hm29GiPu%R(x@wSIxaPZfl;+?X9}U58 zEY6yVdd2(tJ`_J1u1AFf3viH36&#fGSV!5U1@M-KQeD?Ly#4hflN$V91ZTjgDt4m# zN;c82?*BUUZDbEfXNeiENg1xW$lor!m5L~*>oETG*lqWA;c^;TIH<=WmbwJ_kHuB3 zj`FU)_nPF*?Ib}@aWS0XUtn{ddFp!cP4uh#{{juz?C|R>usf6>5rAv<=_syLNzxNI zsqS4PoP&%79~_htGjQd;@Ssb_qQZ@8ds`E|xv3|un!xc}3ml=!4rm%efYqgc6>ofO}hmWN~-tSME z+kJGr7Qh+o#`8slorb`z$vd0k5e4|B82dXaD74DKo};6V3rH zEV^6n&DT+TEJq(oY3~y<)?NVVG`po?ZdH7gdOLNG3(vGm4ikX9YjE=yb#u+Th zu}DxeND-n{IjChht>79R)Mq6FYTsDA`5*P`<-S!fIyhLa63|vr;%e zmB~JXzf9o|BD_NF&shO!veuj@+2;=`ETN*tf#Napx5Ped*50;3?N0G}d9m+uAZ}6p zSFF}p)a-EaX12n6T8f9CyjMO*L>UiVNo<(6iwC5LgbSvs5Qu|JA+9u;_gHe^8b2d* z1&EwgCE|r8OCVQkv0n|pysIUT{v?kgCEh2TlNb*q<1wrHq3c(~7_4@TxKgRJ1ZF^= zmd+B4)Zvc6L8u1Gs9N9NuY_OTLdjz^||u*V9|x z&evljc~~ArgXGna&r^qesN!T?&0xhd0I&9l?Dw7I)2}C{e`&hKm`W#0Y$cC-lRrS% z`-J6~L#^YuBbA&C?>eseAADPSQZiO^O^*7+Hs@U@Qd1qv`WmJ)z2u>2YK$oUfx+rT zbx^VY)*VrtNfjp(NI1-cZ{-gj$1qm&vp_be_6t|CMP4tjyD**P(feR$ggOdJvD*8t zraaJnu#pPwTlw9#Pwp6`q$%ywgxJ>q;4vF9^9Ge*ReN%rrn#2}i+R<7&^wt}QErmt zarW1bsXT+@JI70p439F>L4|)FPKHi^HpoUT`{0}V;PJDtV;_;N%?IzCgUO+XJkA94 zo%j0g&Xjl6+DD9q&ry`|o?_4b`f=HK-_=0E_vk*^`7o66m*5t{nI|8QgV@@(BSI%MbCvH}8YTbv;&Q*Y~VJ{qYC% zJ6bf15Y(gP(@*8mjCto*Y?hqKbOQhKlE(u@=N}U}6Hcp6u=^0pFvud7Jm7;5Je*8~ z7YOiQfSbgRK0U<;-#iZ(0`?~~=gI?`}@%0syiAp~k1qvUb)eC5Q$$w-Ml%}BJ7K6!a+AAEBM0Qb^U z{Ii(h9e-F$p@T?<=+ZQR#5g)?y>pt(k#}y_mG%)klga%0@%J0o_(rXY<1tDeu;=}xh?9v^1}fSFKgjmcQTWbD;(PFz$4VvjDZxA0j6vmb#GuMX0{Jdq zhVL|H&pUtN!#Qdv6V_`B{(c9*IMMkQB=1Z~#PFtf43xy3nq$ek>356TMslp-ha>~~ z!sL3$L5aJIbj2Gtfmo=lcdU^!o;GXD$2 z@hp^w6*53dh*0u)?&DwoP?mEn&mi$6UmGtZMq!IlXrd^ zC^wl%u?mlN%}^RQJ7rc}@n7?Xbl2nH;NeTb{N~oz~UW zX_5sZ7i8AFo4WADc|t*GAKu<9U+c_3#Kqjwzyz>WD6+XK{SjEbMzk&JnBMhdcJlIH(c7OK3-&Q^Mnq{dZSos`gF^NsW6oqM>2FKg!rg&+l%-t+56HRaLknf=*`>y9{_48sq+^F9fE z1HeWICbj2dr#(k}T>UFa)(2?|bLO4PeRN6t$gdEmp$RJO0Gj33k4O_SX4AV3RMI-r z{Z@{Xk^Hhnz4Jcwcs^2z23e|8Z1$LH6$L(rppgu}aeL;x^K&0GP*Y8&a30D7_H&v* z4f-W*@6%pxIW7b$mM1-*9(g_#f951+j;Sg*H0CC#{dw}v9WCw>zd6>f5Ps6vL9soQ zhb3a}>;2i5M{(Qs6emM%+s@8=iof-IuqkUMHmT=}DUJF4j0GDA>f(84y|KMq;Tx1% z*F`ABK?UW}lx-_{RJ0YBia3LoO6p0^2Q`y9)RmU%InV%l%n9(=hM+E(cM-*uo14OC zY!+`&t)L%kl){pnmWUb0luuU3utY%>`*EMP9ruMu`mX2m8G1g>Sk2~x3~FzYbCOvV zB}#asbAN%nvs)t)^Ax{=DO{Vy{mH{cDR#Y-hs4g~bC*mMpyc6gd&qma(}B`7`X0~6 z8LOFsii8zuKZo{nP_XHT@Qw55o!uIdny2`Ca$U zTIOdYCb?Hm$|#T61d4x0t7uD{Oqu87j#VR^I;2R=C*voo>H8-Str(9H>MEN`&R?#~~pR+`-WAuIQk;W91%R zYKBn`c7fn?5L^fs$~)#hE|RxG$?X(Ae^8mlws+iLJ`YY$cFQRb#iKl)f|J>5QwR4u z(|A7aSXBp=3i-va;zL9^5~ZT_3B{N8vVD*I01^P#}3at~tboQq1z zgW(64Gr5@+wcS+vza_x zun-x*xm8MeaGDw%uCy&Qe&BF2{=vf5oBnxK@q$;C@}#097}McGd1nn3a13-%cTC~C zEur>iN))qnU%6J-|AG zI~ZVkur<-`?spc-J8P&UP?_xsoM-5Mq6!?)<0HQQyB2lx!X?lSx^tY$w5 zH0a_<%Tp;f_sMb)~>3vNvIrUGbxgHB>&n22MPG2|Ikdp_$SkJWGv7YwlzPI-KWSy>Zv z<(+G&5Y9y02Sn9d%=lIrlx?b~<`5ci-Yum(Rw?<+bC;!U)xKkFTkZLLqsMCIpmH5i z?;?db(YK1>B6-J#N^^vU3gS$P`#3g*&v%zF9+Apy1$_lL@4CIWlm}}X*!^MUdjZXk z=A~Peo{u0P2unpcJGM4j71F9GA;B1{;R1QbM-Y&qGUBZf4{(xpZQ*lKV5>44=p3+N z7iDL4LO;xkoQd%aZu$3pU(3H2u;V2{tmktMgHK~MJGRz5|McocjMNDvs$gdG>C&SG z^3F9>psa{hE@l)|&t1ZJ#CL0qpzpg`6ZH9ER;D~i@+q}chC&MkcHgm|2%*8EmfUPc zY?TuV`yP_YA(XNk);e?MoolGDVI$mP=1R*0DbSBLez^aRdxIZlorqJ%Z>cEuU~g>br!-5BKV|{4lGL z1WHr2F~R{56YmA&{`o#vdp_)gEg00z%X-xbYb7X{n|IYXlOu^#-X&x~-^-l_X~slJ z*97%R3Hzbm3#ibSN+RTK@O&0SmpEE~NrcPe&LVl|dJD{bTz0&jio1mRj{8ObO+vAk zBT7V>In$&8FhQ*(La0zI9@OKF1{9rIu-aK9?_3#5WVkgVutCMXSKlQxf_{l}&P2&n z@1$&uIO0KPN+JYwqD6zcRNGkl4k|fo2aD%j-djK! zkJW-a7+-VjAvLo|-uZDRgBTIDHtk))g#GYYM3ktklddu0-}T8U9R|0Acs93SDVix$ zGYjUO%Wc`m_-(>e-z8LnzOzVGJRU4dM2>Tz`x-X??!?7$gP?)WoKTM!%sUqxb06cc zzDr2hI78>dYUpE9L>c=N5HyO8`^4+6C-rAxQ#_5(8RSG=JnyQH>br#NM$ms$8PvRp zvh7X4I~E&gN;&e*e{5w_x~iJ6gA?%pxqe$%n=9`YKis=D0%qG}Q@>7f*Adi;zI_ihbp@9xcEzlbsn>)U9PHRYu!Vo1kH zK*R?Ad8nUwg`)+G$;v@d>KluunaKlByufUF(p9a9gGhc}@pSLjtTJA?G)+)hM5)vJ z)tWNGU|~>KijWC_*+=xmYa(MAA!D-ZvuJ8uCoYXjstGwvb;UtE+?7xzeqP6Al$QTe z-K|;Ezd2P0l|_{86$)yQ#8LwDAzWkX4q*f8iPv@#fn0%%iSNnyTK#}z9$^#%x0?Jw zVolr+?7GUZ>^1$Tfj|Y!K;z`Ei zR08wSECP3;OvWgu;C7{W4C2PG8a1Cqqiu)*DF%HgC+-a42?7n1I0CUHe*Uwos{sI_ z60B9Ny}Qy!_2a=3d5lD!21gGaI)z^u2zHq=Cg|ZzZ|alG6CczXag2(=bElk~qr@M_ zSWPYw2l4zJX!SEY*stALwReY|CS{KYM==L0j*`>o!O?TKA-*y&(;!IV-59r~EgDga zFRgPu$g`1(sPi(mbCFq$vhf)yvX;kR)% zFvdjab-A=flR~)Sae@?0vncjlO{Ap#m@t$-!=SP@UjD9u>c@lGCs;Xf8#0NITI0i$ z`ZYtAicGZ|_*369 z23gVu#h})Fel}oKO=20DV)C<#r+dr&&eNxB&#GdYe>_+RYkAiRlxj%W096V!Cbr8{ z-_+j1a-)3|sRk-S{!sxT% z(M&V05%t|SIi8FN0Eyx}9vmkeESGS&DW%0B#zn?N-98zgQR*{ekQBWP=Pf-<*bHwX zs8{8^!3QG(Byvn50(WI(@Dzt|&?JaOCPX72g?7t68E-9`48!G=6E#OnHQ`p_8y{49 zXJwRsJh)B45)<89Zq*Z-(anj5O%^u-2&xT!JvsYiJd}xuU)Pw=XkDT+Q%&%D-}Iu& zh`<5Dfw zsD4BsmPy8s2iMMkG@sv$M@h;Jt+?SL5*+-!T$$i-O?u{STp&M^(l%=+IF^k!eEKgZ z>k!m7AOgQ7p1{BiBx$%F%0M3OB)Z{!z#*Vr^^@`2O)AjgWVq_e4BJ+N$;}24vVwE*WL2#|?0Xog!k z-tgls4Au3`L7eF=vXVrUi-HURuZKbtd#laQW``w?fwgErad*nZcsqiOrr_&pf}i)M z2bB?lNRD!k2N&QGZ&?q;zTb}8b;=xroJI2}w?a~x=*8NaIn>o;_(lhnWrpm=l^`jtX1mJrrz6dcvcro{Zl*3-h$OoUk>+K~>Gd+8ZC#o7s-M1ie#1-O`Z8u*5^L zI0VL^+%d2g&EtYHkzg_B;A7e8W3$?uetblTKr_jD6az*C=<#6TdMFR9hr)CRrC)_( zU@aOK=D{){v0W-5_GktnHS-1^E+TOKYj89^BoW0eZ1vAANOQfH0=NMU1=h)O#{i22 zGX`OyH3JPTTEo=L8-LUxsE7z00wQqj#y=y8!ph7ek7F>nh`|~`i}k-Dxua9<7%*et zph!7uW(T2({)6xfeFK~n&$3Wu{ByJqv-mh>B2&1843Jc6CNqhL&n)zm3 zRg*XW2mA=svEUOFvWPBSe3wd3QWA(Q zc`y_d|FgjGH0VGsS4^)9mvCL0vD~H$`-;QT9zJ1)0i-z|) ztB%?=qw7Sb37}GMB?3&N>e*!FP@p`x*7UhK*?Bw$Qd`yU4SLYds&udGq{3D|83Kuc zT2)wEB}&6xLYk^XFef|V+l=qDi^l7k*>pis&0n>XhV;%`$G}*qivIbtVFMk98hvLl$DzLju8pJaSk^+22Ptxp^z zp`sdT`*S7`N>Xyt05AtCN{W(}IqBbwPsp3XoHu$w9c^Ftv0w((eqhmRG@P_DWtpLq z{>}Ks2pd!0sE+1l@*xza#LCJEYOkQ+AP3c(l+ee18&gCQnUabpv>@WhgQMIKzz~r- z!ee7fBI@W80KedF!;WL|!x`#tf{1+R;>+lY1W4e1!(e>;px6QFikvcYQhh~EnK>w- lBFvfkf5+rZ=iq-c{R2H7ZuO&Zz5xIL002ovPDHLkV1l^v;+p^f literal 32467 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 literal 34233 zcmV)1K+V62P)Px#El^BUMF0Q*5D*X`F*$h}GGjg|6+j{)U_C)nQet9a#x+vJE8o;09cZtqbRR<-Art;NnlXd_Pg(J^Qez>PiEcu2g*{`X_+waOo#pr>2`> zdaYG~JXrd4-F{vzFB`Xbg6qBi;!iG@dA;(_4)3>q_tM#3t@pbl$}Ot;Ib~L;EbpE9 z>AwT1bu^uHC*Dtf5$@|Ba2g3#>ec)Cui1RVI2Zr@6t%Vd)8Z7J^!)|P{y;R<#&pi< zFKb>#zVcA~qFXLZx7g4)PVJ|!2>ka)xF|Q7XrxUDQS=l+FrD+%O5%yXOw*J3g`dE` zJ~uhXD|dSBrvoa$-x_{g{}eHL%t?D38StZbx;p#^MAdO~0;i%4DsE_S7g!iEBBNDu3Kj?(`Jsp095z~fYoHWjzcs7 zHLl#VjUFD(Q!?Rk!o2>&!4K>yh$|t1Ctay5+c}9RfT>fj{Ud| zJntwnqW=U=_3}NeKH~m(k_tc#Jij)Ua#Ml*G%GzGFkic#QCeB9hkO=6>AxpT0x28EvFq=RzePNt-&s3~_Un2?PUPQm=~vs(UkbSm^u zO4ZQOQ+Rd`wH3p4bp4CA+;Q`Fw0;KG0@KGSH9;00a|w?Eqo}rpj}fN7?**+36yHAL zl;%OX{<84Ei3;XAu2D~GrthPP#tFlAdbBKnf9rDVAE#Uin(A4cK0GQ)&<`&98vL{E zi@Mszh|zD1|9HP4O+&w;wFTMKVyPtg46e{V+5g23*OATyS<<5T2ig%%uP4z%oGt^C zrMH*78Ghk>0Gz_gNpkBS5@L#xoIQb)NG6nMVbgT7A!=}*`CH>C!c zX-JE28;H{fW@(V7kzeszT^?{6ri(VfPwY?HJV`3dS?^>}Av&o*X4KV;(=bgX6XP_d zCt*UME;*m+%{7UJ#Mfcs8wEaSLmx0<+|VfZr*X=NdNcss0qC4)08?DlyW5DEtoqY5>WudrP4}iNN(oi8e8Rscx$QD(3mE#21p-V1WYwLz zUl~+K3i<*5r^QZilrxk|X^^FHo`!Cd)dkuL;etahI*v%|Z`2cZkjCWlliu0! zfzo^CqH!8H6H%Qgz3@&QCDV@^`gYdxCj@GzVD!;g^QkQWA04d>^xmg?{O}Rn^Z0nk zWd=`;F3$Mc^|Ug$+?fDV?DP(*OTwS0O3&x&>Vm(Ws8nWgav1k8M`;auQklQ0GFN)% z3Hn&4G|!0^{^m}80n!B1wL1jcqTj#VCWLuHMimb4C~iTV?^{EkW*nviDxw4${4~W; z?sqJ*o!5T9SN8(`Wr$P3;3sqSUFsT@TaoZr^D2JtvYQ?*Z9&=r%6K`GXt&bj^Cxuq zQ|j)k3Hn|K1@-=$&q*eWQU%k48HLGw>xSQ)Nh$ZAps!MtLpY^W!ZA*{-{HyYi`Wj= zhkq1Jz@-c&Ih9lDGU0F4t+XR6WmDtZc6^fYw>v76OO}(Ayrg5@?pJX7CJ2QJPJQ== zrsr$nWq`QtpkIOQe2B2C3}&$o9a)=wH)5LaElI`qWj&X;oby zxK(o6f&~ZMKFR0mTh*i{$u3{pQkr1L9h3yq_nU=GI;OxR9Zs|lr{$LVB0zciN2fo< zDQ-Z&L;1fcjfPx;vXinf=}9J~eFTX#!C##iSezd4r|j&j;m>s%0Av$RDhcYy6mxCO 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 diff --git a/public/images/pokemon/back/550-white-striped.png b/public/images/pokemon/back/550-white-striped.png index dad3bbdd9412d7ad0839216b2c9381bbb4383288..6a597a631cd411558236c1da67c3f75111b6f664 100644 GIT binary patch delta 5447 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 delta 5471 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 V2MD1XK^Xu5002ovPDHLkV1kkYXJG&U diff --git a/public/images/pokemon/back/769.png b/public/images/pokemon/back/769.png index 2562bffad19cb8143657dac9bb3414ed17466336..c13aa19fba235d5dd9c2c7b455198264eff9be9b 100644 GIT binary patch delta 1886 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 To4)J6J|b;(JxGnJUDW>o1o0nG literal 6487 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 YznJ#YQihIJ0{{R307*qoM6N<$g3&1F6#xJL delta 7355 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 diff --git a/public/images/pokemon/back/844.png b/public/images/pokemon/back/844.png index 78247ea8b8b03220209a2269f76dd7388f3523c5..1fe88daff9fdd8430408c3fd6b61994092ee55ac 100644 GIT binary patch literal 8396 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 literal 9150 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 literal 31585 zcmV)2K+M01P)Px#El^BUMF0Q*5D*X`F*##CDHT8>B49l(TzElJQet9aH;h?&sIR1?q^sWG=H}+( z^6#^rD?|VQ01tFhPE!E?|NsC0|NsC0|NsC0|K*LIrT_pS07*naRCt{2U5R4jDzX*1 z7O}D7|Nq=E)XpM-mLxshyf?W?x*Je&sO5llrU_aI%XC4zs9S8ym7T)~m-c>%aW1#X zg@as(me)01zb?dJz&T$xM0mk}uNvS2qlb+?{W*iA|C~O1nEWLu4;S?Lw!k&rVgo~L zt>}>f(g+s~5Uw%KIy&64_{sZ&C=bhJI6T|jS0)e_BJVp#xeDK}D|+3Ss$1UR_7UXG zzmdM)JBGT-@TWrZb%~X+UFyBRZUpoMPX>D~@`y(dV zXlql45PUQeuZ-Z;Fu$j5E$18Gp@Hw@xZPJoHhgWjt1$BiW3k>2p<~qnra-*vsXE$< zGjx#09_s$PnvOpX@LkT^J>!=*vcDp{zwRplZyVkn@+z&2E%ti2X84Kbj^R6pUkI|2 z6o`)iyfT39-yiILwH@x3=NhzG-U!xKdGAjg$UUFnxZlwJN?%vHZtnYIUd09=BwVRTaN6?tj}e6y$12^wnoSYkRcrp&_ChEAT`stqx&Y{T%%Q9)`2Ul zIQs4l@8|vg{z~{>_uu-bB}o6S!|2;n$9W6BkM;R_;lF%uliH*9YO|EW0bZ}_2HK(`wmRoYTNHYK$neqRA=%_*oy*%S zO9<4nON8P3KhM~le|}NhE-=w7aRbS;PY9ZCBg0~5z3%PP1Hiq1y^J~Bk|2LVjtQIQ z-LKk})A5Z7&8(#QJx5~NruvW4S6IYNuAnhM+(2uk8d4EkI3b7fF8plvbIkCu+dvBn zzljaDeem=ncyNHXfB*lx5x%!3E{o;c-elPKLvm> zLWr>qMA{y>n$u@=M59dDb z<@E7?2`=EK(quy*d@q1(Z~*{q_`cJBs~uG4_vMn}o=^W->l>{dUPY{|!(=;123o%q zYARMfjPGdcEI7abjaq)R_g7p?&vW+ZIf5_*OK0{zOzLPcip z)&6l$2n#(-Te3}a=N~bQ=a?K2%oxq0O(H1b>N*EYK=5A_!aD*_d)F76KG8F{+aa*E zC+@YaDaf#)CAFHUFSj~Z2)@yvK936vt>JN&0ONxxrVb`n(sf!(n7djk!MAfB0PX?a z&-*(hry$%DiXoCipqs?cneD@+nnNby*|~dQJ=aijsKM40@Cv}AJsgElFU@2d+ zlF=^jZI0wpLZF9ADrTDlr4;x7GJX!MjwQ0L)Owi+YQC}a_n5(U9D9x&ikfx+fD6OK z@TM<*z$)1eLZie4$dOGf``EMRAtv)udiGP?rS#YlBds}r(@6O6h`>`I7_5KwT+8QN zEGJd2i-FK{H!BIo2AeFjo8Gym=Y|0993Y1Zbq`2vZJ)lY9FRtMs`}0-OlZz8nlg3@ z058yu_+AF_?V*3=RgzJ}r%1@;E#HUlTA#k&V=unbW?a}HRF0&*1BmbKs4-`q=us%6 zv{hxWRH4CTh!Ot^Mxj6(z=2OG6i-F2=?5T4EBVq;K~IR0e*f+P|IO2yoKAg;>~LV$ zLjjm39j7d_CNz7m>_PS!3TrO|Md)5k9)Cf5ejs87-ZQ+A4!Q(4k~xuHdeHAWcPX;lO%@HbU|0DyKdwA%m-$LG1~|m2Q0|<^!G>I`ebIk8{?xRo#e#S@9C4VdvWex#ZITZDt&Lx8t%+*^k-L|de4_~ zDT6VEXg?5&rGMHWSgRGi^Y-c7Jtm7#h9QdDt0Y#6w9Yxxq=V@^;zrC8{NvpqD1Cl@ zLh;aP75`F>HlS@?@+pq;+dN|SBBC$M=+3IZ9wDw;Cu%v`vCqN)14akQ(4a_>R;J z%wAlfM0%UYlJPow_b(2|K>`Dk1+ecetvRskx#Q@lgup|HC+ox!AKVa1Z#UkBaKB_h z6OEF?k@tKbzG2dOPZnJU>95Na#(k&hs@z_Z`$b$V7<=lowhEODFfXwzRaF8*m0b1i zPWOUc5|{D)zq+Ri-gttM?H~PjAf%AhC6&buwP*KuwmSY}=BV?EO7o6=la3vdRSdXs z?(c<855o?eK)!@7h!YfTd?+{l(3X$B6y}_cWu!~hV^AjUGQ|Yf2OKP+4L1%?yZAU) z8QXO(A}974g`#$({o_IYF4hEY;-%D!sktu?E-L*UD(SnsPX{8w9A%&vq}~HN@BZwb zeBe?uy4TzOIlk-hoG(WLuVw(Ns<54XwZ3}h58^OSUfC@I zgj!XvtDupBKA-WTAQ?17#_%!GZqz}z0zt1lY)`T6^iJnhq@KO@>%wpJcD`m8?9Ag% zeP|CgLKU>Tht*WQkL{kqFm0ogO@;lU}``+0tpjR=*G;DuXgJVMm( z`O!OjtQ@?}>-C8k?bBWOUITbqjS9kP89qOq-?*v25;bMd4+hM#Pjn=zzjI7M?2aJ` z6yY;41f@Uuq;bD^rtYNsQ(P4l%aVCJLLE~U;{WxDCa5w^z334 z0tbeurw=A2SEa-b|2>sFLBLFNflO0XQsl#j`fuPHhzPrTJ_q`)xD~Rx-Ss>0?QQQS ze9|DZAe`{SxZJ$aSTRZ^VvcS3qEGBmyO3vpgq)&@(~(&zZ$J51(H{~K~369U}TLmBzhhvk2UtzGRKD_S@zM$b1^j^O-* zHxvguDhR^0L^F;HWG`H`Sx+;4HNU6b<7xLaHqW48D0lO+>-`?i;5~7ewMq|Fn8Odk z62QSiG0}xj%Eh1DGS3ZwyDAvDctvgoOak$;1Cb8b(HA`iKZ}VWB8=D}w74Wbf2DO(%DUA2v5I{I7~#r+BHdMw~xem?`iwwyT@#vwZ5x)k7t|5 zS;p&6JLwa?_|4FEY7|JX=Q#+(-@l({M}xcfbIpsdLa8u{m}FsxLQ9(p*6kf{@J&|s z%7;jTIpo3fEu&3MDJFF9nV=cU@Ei07rHIqIUe$-0?JFQ*~p9d6kg%%LjanYts^9+Y;V}B7hWPls?gJ!!Be{ z2`nN!jMI12y92XVGff7#5CvEPe8P)+R`IR7uk>D9PTo9i7P)R1W_{GAAEF?rcgjxm z4{z+g+xsi5Zt&v217Q3O?>XKYeVge0Ot)oz=N2ng!Qc>zJ)ij#wd1GOj^_zG(_^JS zN-x7oZ@D2-&lcvMA*iQ0dIIQzDRd+WRLPnYXp}Z|cdtxMC%o|o1wpSWDdhqJJjIVV^F+n{yEyS<-KC;o!gD4t#!Faelr{ z^PWbiOrL!%hkvi(SO6S;9etPApKB@mbmB(LnU}A0$Ju3v9fHH2O@>MSNm40HAqKpO zY#%=9QN8<|-oSEXtbhoaql!x@o74-wWh@C9TliK$L4d1j9I51-hESWQ#UeXLX_YZL zlCh>l8|DnyEClZ-_-(;A49du+6eYnsmX&eQ=cNU2tf(ArddPiNw!Gf)&2uBC&Fm$( znf}NL20n#aTRZMH(Az4^W>onl8++87NO&mRUn5ylj8fmH;{@L5sNO%tK>QxSdGz4A zkOBjFqzMq<8wrZoC+!|b4sbEMM>Y@izP5P^yNJ=fD$xiZL!1E(fNvjx%W>|eoV5eM zv*)(>cCzkucxy0{O=??SR&+t%h3|1}bP4lyXk^`A>76k4uAj2v{OE(du0)_P1d>9G zcoQ4nTjAXRT*?u6r^ogP&NwOw#CRnQ@EyomC87Xsp~m6d+$6$`-KRUndB6wk9&dLK zx$gxpE^gtwOzZh@F}KJtz|ku7X~>(yL_2Gt#5WLUsTOGC+vGm7=h>kcKr)xo-0{xw zc6@i0%7hr=On;o5NPJv(PTCHW6lgY^B4>iZCS4UCJfoBFUg0-NfQRjJ#5}-+rUpl) z{S;wFttPG{5Mg0?#IajMn6}TIdk@lkEYpI|H_!Yanytwqi(Rs)X^pOf8gm9CjX&%g zCx64a2ZQn=KZy^P5Poy5m#;dP#6Fo9vo<2;tV>C4@P&6L5^8UD7<(g?*QMoTl#2KOeQuzY>O_%m?VAL zM7BKacu&!C?c8YMMHD0B-sdSl;uRUs+2s(vF#zjqs_tRIn@m04Bx0KVtD{&JR0346 z8(rl{Igs*Gj+f9TnrJa3!e-zH=I06#CXZpmyaKq|J;bsB3*lEckCU_~GrG08-t(V* zoIz#!cbUF3^95{wq@-X@Gk@>=|KjIf+~%Egu}N+cwh8TchvAaXjW*2eY=6=n<(7O3 zwVGU-c86d?xsOT*3lDC*$wu#vvsX%wXDI)Ix5-+w9O;|B_EWcti_&KqM1-Zo==nWN z{G{zx@5%>K?`rc<3q zOESzG;BNa<|$YC$Y$n zcJEG^CH|v1R;@*a1_x3QH%GR-Y3#zm&(OR-;&}$(I|#lzUw5N+y^5Ii9q-_*19$vq zGhDJs2qwBa>P;n=w-_HgW?Bz6OKEKOCZXS(Nbk0LkKu=rm=_RZ_*TzxD-c)~QZ6Mz zK8Cn$c*n*7zcH3&^OT*x*I<3~*x8a%g3p55FlVqnd*uOU{6N-|{0_vP@lGkTH|Az{ z!aM%4dTwNT%p6qK+q<**4W4&$={A!~Xl3rhw$3t$9o|IOIMThGqtP*ONCm{~=@#2Y zIkI9N?V~Kn6;A-$bcF~jp5tCTh2A`}nAkb7$n6j7;$k{I!JsR&*Z~mskQyF%*Q_Q} zQm%OC57Z)gNQRmEG%F^>pgwtcHP&>`@Ga{;O<(aE2u78Wdqa$Qk4f0ge|e6uhC4Lx8t0bsMFO{AM}rj`tnm(niT}u(xuiP64oR zu+f{$WJaNZl0xY^N`VVqp(TxE&u4^3~KEz@Q&F(xo?>Y`QQk}et_pEND+_ZPSlPM z3-0(%d}Dv?n|Qa}Fu6>JP(!aarma}wn`=Ng!N3zb^d{Z?XPHBWZ(X1*svPMnAZqrR z60ygg>Isi^8z%}Xoim@$@P2BN&2?{{W(J!x5Xc#9A4oNuz&j1>GJH=7_5kn!>*QPh z1HB30n|J&hke%UDnV1&uNu(k4_8(}seSQ7cKTS2&imhuW7!WN-668F8HM^%#j*LVg z{SatLf%lgU9Q*K{^^SP>hzoF6n`gxCmD7K6FqSijN#VTCsc(&BZa0Gq&+LHo=ZJNb zLvd2J=Cpd(v61fYuGj8)pYz^auNp#Ss=2Mn+Es7T=Id8Xp`4WVSVsy78slDv_m{0$ zcH;Z4;hlza?t{8Fo2T3Q)lFZc)QL0L3Ga#sj4SYsZ`c~@7EA)Pj3CnKaM^uqG)W$n zuid`hYI7|dtg^Q9CUd;RHRMf9co(pJ*m7hB?a;n*q-+|1oMsYFz|R!D$&NSYI9W?- zAF>9#dE9$-dY8Z%lN1LVhOqYs;5}79F^1$uuQhmoIf3M$JHc0SPcFmvO!s^C`liVw z_s-h7>P?nWb64s!E=NoOvGkTBWxHzt=5>@N!ulboS^;mtx4wQA34>99vrRr~oB=Qp zyF%L9*eCSCCQ;smSoIy@@{aCFYTz$-O6fzVmTRW6{7A?sf$r*Rv+>+j0y|bAA?TNipW^1))VzhM1n}pn( zbT$odeMr2&9O-C;ebhdsX{>vV3<2CqngfViwohGc|eL(?HZ{^2P5a7oLx)=E7?bF@)vvO?S z;0$PGeh<3ycF(1@y9Y5YNlZpH%eUhyV-`Y&t0vK-kl^VL>k4%`3& z+pUIgWZC-rkOa1O%ZJym1$dc=aK$rtR0q9PJDYdLUYD~2#1G^QyYVIi{o7#1Ync@g z`#K+<%L$#_(l*x8 z|AyRfhsnF2XzBGx(|z<*#B`y)$76Hg40L%v(jV$3?VZojR*#magiGk`q}*~c;djNG z>~C;JTrWpX2Y9!bz)!}0eQfUbZFzi^&W}3rq8-@(wZ2a3P2UsN-ef;}mk*GqYquli zNUOoy7}#=K zcMRXfGR9fQZm+=iRJ#X1en2jd zQI?7S9OagFe8b)m;BPlR(d(~BSe*VHFokG~guVFn^yy6_o&=lqCvGX<>KzYE;sRcX z@9H7aiG1eahJ1mF$evu*dr{qPe0wG(;(dVyI&h`#?a_V1gi~~*cdb01orY+Q1eH!SlpI^8wp?soC^S!-L2batZQpyG7VHnQkl z`kg)kJk@N5mB9A_{Z4!bz;}Aezz*Ccvp6U=NqfG3qt_cAjp|I0BPDy1Q6)(^o07NI zQ{15y+#$X?(6D&;DS+3UcQBYw?_~#7Rm?eIO<~OunjJPuQ1OvfUUJq=Iq;a<=Kt~s zixJQ68?WV)ENGgqBQXK9&-de7yOJbB#BNqb7}H%=XHyQB(NTIuQmnhA%6r@3`QO>C zb{RBej4zc`u%voTSxt0F0Q{)~Yv#89OFm{zJx~Y7(td)&Zhi?rNe@S15X?Jybj-A(-lQ`ZxbYw*Ir(V@%1QM zmppfRb=0H)F1jB*g%!NRHNiUQs*S}B2=hf__haxiI<< zETzj+LGswe0P7>5&kB=rRq>7UkXcD$wa{avPWR1u^?9a&^S|p`G6fvjp-sGi4>;I` zUTtgEHC0$c#6fc4%feNgCwx07+Mo(bw6fzH06$`&w+SFS@j*=$!@6YN(vHM>!8b%T z9VTdal)7Gf^Ak9#5U&@+#l(fgrIb8ht=}d1b8;x~4Ghg@i(6eCNc-HqI!$#byTAWp zR2Yv4@0aj|8dIUdrvVmv@%6Kq!g=zpjn1mYjv0+g zosu_1Q5ivQm9bz62;ha7m>0$ z(~^tjOXkT`qHma`f;wOX{P{BhJ-w(WuPWy#qLtx?d1Kb=+N%6$A z{nrs%>9mHk1R9UwCjeh`I%oloAP?-wKUh?<3UFp6;H6QxVh|xHDpPiQ>{R2d=0e^U zR$TNVFtemItu@oqdnTD;eAcab0WaUm4+*BVQP02^Bk5%!&qyWtu`x{b-w_~WS z71=MSo}R*M`inCBUClFP06IDx*i2AflwQ?Rc=GVcGH_LZdrnSFlE2j3ufTT+aL`#+ zI7#A*D=^VV#gHN|LX#2@bSg;HN#;ptum>6J^RxZ2Iao`t@y&+K)=fh1kZEY@{Oyu5 zEOP*O@fp%c^Kv9DDW+td0YH!Ix`5vjLrq#J*;UV*C-C1Pxoj^Z2;C@KC`f((!`7+b z8=^ehft+|d)GIF5a8>3cSc1d4D|w)1FZ>NBM+mlQc2gI}(XzOHyg5zi?Y+<`)oc90 zJ3jxz%^COz>385eSsmP~0-w%0BPih|%V3*|(bF@vb>O&YV_HHyi{{)o=fD1j#8$J( zcfh@wEaH=bDQ@%l2b;NUs^P;6FP9rXS4#yKf}wFGEc%#`*~B;a@1+090`YO~FmX{| zh5ip z#y2+(rdacwEpBq(N(XLLC#Z^RE&u=^07*naRI5m8xrFtJRgTN+F}nRQeWDmbHVQL5 z6@V{NVpjorUKljgRGwbc(k~yG6vc@6r8bXqbnV_Rn@)95WLKY6YqaP zaEp45adP4b?eSKQJ_+>B7sRw~P|Gi>mM?Qb2$d}6E`shMzCrPkoC#|_mXaUv$>+)v z`fTEH^w^t^^Iwm=UR}WRn%1P7ph5*9XB^0xe|}04+vL}-Z603+(nh$d0lgOTq&M}0 z(SxY&l>qmAo>BCj)>@4I2}jaDif^1-yqE;g=2Fc9d|{+;iQOQkp~*cQPjRc_N)|i^ zm@B59QQ>eyg1!W}=ZVi$KcvD5V&^Kpy}p5`!0d$A^l?wxXhT?EEPwn10Oya#wOzQ% zl(ogJ(OF2gBDCq?Dslzii>-a)NSEA?7-){*JrTg20NjfaOrR&J^|kl81-_@?>$Ohs z2=BV7QL<@HnoaYX1ib>bSwQabk(Lg_LHtiMvkda-!t8^4>U4BbOQ_1?bUuZ_?X!I> z^O01sN!h6Cw}rVYMvmAMSx>w3IA9Zmh|~6%iC*)SAHk^ zJxksY;>)UWzN2Z2d$s#%X}!ib2_1s}UO))0;Z$Nu>$zLAZO}GCDlcn?Cg0KIUdVLE z?`P!i(+=0j1NZHTw+rh_=o#KCjZ&0|Vb&!}rp6bT2P{I{@TPqk%=*O@M7=~-7*-0b z@60l}6+@lK#|sJFamj26a*phWCMBd070jPp%j8^ITgui z$=KK}|GNj9CjS1X0gmv#N9i6=??I4bf`Y&c5a<mDVm|jJ6;r1d<}9H4 zSp6*D`=7@FEXF;20*>`S3x#1(U=6yQeBmW(uP$+r0|x>u5YtE}fVx=%Ip$VBhi@>^g|-*geqjRn0WZfJ5b8d)A?+L7B+OWJT4{xGJv`ed%$d+3`IM^rhB%MIn9#|U zeZK7zue5gW_Ucv<{C3I)f|PflcZt?mqmWYb;&IIpl1&D^@g+e?jL#%-nBd)-IIbc& zl^A;T%tIb|V`jP7%re9ispP&V&1=>!aS*LprR_5UdEGh}H%C5u5)L6-S`#jnl~@R_ zA(W*`ww!b$e~WCW20`lYZhz&%DMPAWR``_iu9JWF8eOtuHb7j-q7i zs*mhUoLWLh%LkpSz+25My@%Hy(D#eEq*OT{UHAkrH4el~(;$IdC)mEDDP9Z%Xq1jp zYpX(a`nAZWq7YpBb(5UZPC~kod1?U1->w}BUftsJBEWB=K+Pslu;W1geuyH_xBDkw zOk0zc6Uc3inCJlGOFcl93?@%Q+J(tAw z1Ckk8`(=JUR#^M1o5uH@W!#(X4p;GRs|Q}U4|Yr#c(GW`ZlK^UndEa5 zFw+Wcua5wgg$!%|{%12-XOH~b3C*c2;;xm&F%oBHdK#O%|2h>sBPRj)7Sc_T1*$9o zFW$U%`#p_axXWx1in1@=QA>foLyOu4u1OpxgPDo7D~YO-2H*F#xgEK0O0EL$%}jyy z-Q9oi&dHcqT6`-Iz7v!!UQ=jr9;;yO{llm4e#U*PyiL@_laPwVcOZ)o*_;}25@|70 z;p2nhl*xVb;r9=-rsTq_;jAOjx4NaIWa4B{_gla_$x8BX+;sn1QT=e_zA^L=zLSI> z;adXlT4I@+hl`2p#3s}Bb=IB|_dfGn(}ehaN^|7K4Zf41+^ktE7j3>VK*>oY7Rzh1 z$dPx#`j4LqJjoh2S~Y@Q5$HoD(AS#|mXIjVm0%gf*yM-F*kMh0IPDr)LFkz@a#Gw? zfpjuUDB)F+lI- zGYXX|@c!5H#>XnHnH`a)KpZq{pW!fc6Wd&(ea0zc zRf1kyoeF%@vsY)WgBcs(DHRA;*!_Yf1-{d^e`di_<2!RQU9uknae+50uwvjHw1v0$ zCV+c9xT~|8DZZs-^M^lqXj%dBCm^2<`1Rg=bgqQA1WT~&EmDT$Oz!y4Zp`y_A@g2`x0M*~oV46>*0g3Kd+CbK z8fzanr27@0T9alWj_Kl8W^%@OpUtVWf^*BxOyo@Pw*1(sS89y!_FHO^xFYXfRVVu+TSG6AG6T+G?k3QFL-^8 z6x@i-ant1Z4roD$jnGX^@{+8BJ33pc&oL_~W8;50RP z{Gh%nc;C%x#)tWpF8ppSUTQIqH>olO+4OCGX7aO#0;%2Q@j1}r({rFtCjf`n&$aQr zyYD;oR}o-^9IID?Row%nGj1pAr&xQa8lFxs?b|+QY0;nDw87&CHs260#cId9#3G99 z^MOsB8Li&B{l?~=$}=~Fs9~xn0i1_RriT9=ap2frxnwOt=f>o6e5Vz>Wyd3Pm9$3& z`8NVQy00?y9-65tTa$6(i3xDZd@J#mKBAq@On%%bwz?|=eOkcoM0T~^@79}~@aT7m zKES3cN}vaPpJAx` z`QGH@{#s|;3FE~H$rLMDVw+ByN*`zcgH2IxigSDNnMq2(e=BF&2=phd-j8Qv11-mR z`ep5igoyqVhD=|6#rtVjnq-*@-d|LW-}W2{{&+hRm>tVkllb|GrVyTm<0}@BL}Y(C zz=d*iF2lDlsizNmc88a>E(y@qk=M6hLA9*r)%boR`}gBpm#lntoZXE$^UN!m`j^`T zngfa3&8dc__jd4U-&1F`-pm=`{ZfEC*4X>ii)muH)7DUw(kVwKIKq!gqYt!h|I|)T zP-&t1NAb%AMsUIwq)Z!l`;+mV?!6>v+v@fAH&;C}fisgcY~=nde0OQwwlCzgKl7B* zo=fD<4QtQCojL@FBr6fw-@lmLT>Hr6Aiy2%dH~IDwh1x==%4ma)xisQs+~uj;Y(~# zJp(+oy<^1mn?z)XS`o|mdfP$LEgo+CAwkV${;BU@(OXL7Bk!atntni-r!$_n9a1@e z>a4My%G%e82d7nJfBjk(tt8h{8s2^Pr|}}UbQ<`3l+oAPzNvyL@*B`E5n50Q3jPQB z<|uZ_^v~<6`WkhmBI|#VM%#hrT=(a&CXm)uKT#hsFLcj80pRBBn3fCKOh$r%_DC||9PFJGg`bv-}zT@W5f5J#Eg)*l9={8Y*JHkS5qBv zPbfdgDhu=}NgTnY*W0DOoqt|x1I+M`bs{grqNOA}yJz~7K(F-shQ$Q7>3b1VqrJSS zXLx0jDGO@92H)^nX!y3O;=c6H)yH?ef_N-yf5VHeqlBMFStscFIks_z+gB%XzuJ^y zEbV(G^n+@Zy#@lT)S1%M)=vpwuYRxEaFzA7%DUuxaI_K6c(aQc{u4{<(I@aKam^2fc2wc~CZo3GR*j>`j1z5nDh+xT+k@ zLG5Sp?H1*ur%AS=o$6>J;YC9P0gm|g+&gWY*zeg7b=MqhzkwTxLqd3}Afm0DGY%Y7 zWIsPiL>3e_-#Gv9jkm>DD>&)0q8F8ps`fn4sm*K3U=n5B_?{%I9GwNVZ<}E)^Mkd+ zy$I`P;xG88gM&iWC2Ke#UrDzb-8adl#O-Yf}RNPaRx6nJF z)l@MNm*5K`?o+eiCkYW!-`ULMeX_zC)-gGiv2gP(E?_o)6kP5@x<*%F?`z zH4DEfhn+}O#C-`1rUIlo<_p%s)9Ob@I&M%GuUTN1OaA}+cbUZg-2F?}jZr8|@ zLKut@)MLG$fQ73vJu8%p`R{I}K=D3nLlLTcq` z+4BS*@rx6d+t*)}_WJxq!CAH<{4VoMEG`)k;*ej~`d?n6Y|opT5$;JgAjYtrDVme* z17qU1mbc#%ALRH|6QsfJQ2@9R_z;;kP?0S(q!BPlNeB@VaM7yUTj znSir0W2QVR%DPK1M#*AYAfknxVzuTzwfH!+iVocBni=6;Bo|T}7W>A|HUyIKk8l>f0Q0plee5WDw_WtZp&#f{)j!`!0gBL6pNT++G!i4wH z;thja5=PH+Hh_4nxtG%cUaJ*ep3-DdaSyx~S;T$WBjWBHzO*=RDc5Hk zz>}{Epf7mlS3MMQL~P>4MCI@lJu^~aCTxSNdJ(+!QlgDK;d?GbWVMQHsH$v6X!{A{ zggPd`f-UkiOWq{4``!cv3<7DCu)Z8|v`tu97uL0aH=ykE8i_VjD}?1GBETlru!_5# zYd+NninYY_az(_whVO+mw0YaWV`Kd>(HFLFLEV`VnAn7XZh6gj>*QeRP!S+UDL68m z*;3+Tz;lqq=7WJA|9HNEiY&h`zADlv{*bb%oPH<)juqy{iDAVj9-nI>J4D5ug3Us6uIxoMS1aO<31*pI>Q(~Wquax-7!r`BRLYNF{*!UW zo;9w^Gls;^FbCUdBK{yW`zj(cGkgSaGqN#vdO(i zpHM$002)d?Yt#zMo*pH9e*19=%{R(Mw`E6V%X_UK`!FR5`own3KhShCMGJ_| zDUUT?%)Tz-{#X%l_sSMD01@u=@C&V6tNftKGEB_eX<|C4gBQ*vvfx06R1xBs1#NOv zh`rWY^3GuuS$^HPyzh*Xj^$RD`$$3J#V$s}dr@qv*G~e3)6YOW(PDMpptj{R%ov}z z67%;r0ry0~hUQgOaWCeYh2JRR{zSQ!Hoi%>j~7omHSr7Gc%GiUu)>TDnY;23EjxH& zkEf6Uo9HuTK^+uTO29Wnk|Qfja_+${CV!vyZR3sFe&KTh$Y<3m(1ooy>uk41^#2UR z=`q??De;Y%VV_7PcQfXn)V$6Q6pPl0CMhHMYd4cjIY#gq{}MaSCb$wEY_l) zMjw}ac=%+*H@^bUW%E=-A%`@J8TN^>+Ph3# zm^vkdQDQzEK z(x{TWr6RlW#&}m5Kn=AJNvlegEE>Iw&5KUFo6Tp!y54Ywks9|B(lX4jMq8`ozM{4L zQ=06uSHxZ2x`pqOs&M?cG2okIprB8y5IwibYfpD?tGp&3yvzl0pVAiOsKOverKG<- zJxO}ulWVBRvPycNzJ0@kGetC)r=$-$vH$$cZkb=*k~hPpbqsAsTRvD}^bFsDHQK&W z!^+9}sYMJaHO#`V%=L!prCVCZ#UlU2Fo>W4Z|(&Y)Tf;IJ)%N%LqRvtxvSULLKGx| zoVjG~J3MxBRPZE_%b`j#wd@tcNkw*t%4Qwkc#YE#%2Hd%UAHSvyqnFjw{~b5FbPB&Ueh*Iy(G3I8$s+8Myeeat zr;;jkcbd0<5J$BwLmj;%Jqb(7HdJKiB(n+6!}#u!Bdam&io_~?_@a&mFFO&eHwrdR z{h*asgE)W;-_a!o&}i!mY-dbWskqB#tjra|?+1&xQ+m19JG_$SiL!LkX`b?!@?%vY z+6%GS;2ik&k47FE`H^u{+g^kzP8*4|Q3T#mlI*VaQ{l6I+iPiaM9W8*hY@)5CEV*y zyjLg7t`0LGh}9ViHrL_ITy##Msr~%{_6D`6mfS9@2J^V8X()=Sbogw1evP(L#of8N9)7imJK!-s--dH?EDr7Fyx)ohdb&x!T7LMY zN=&PU8L8r6&AHU<$2clwA=s)>bkL|=Bcf|EvK=ywSagR#T)048?btjT#cb>H6Ymv+ zIKekXXQLafAfqah-irIg$!03RR>j?jxKs4CBJNw!*C~XD+2A5O5SeEpwQp<4V`4h@ z+X~_MdaMcui&;>FOJ@CpEr#s?Wkb@#^Vc_N13Eh+{;k$H(Y3b9M&XrCT97 zr!?8;;iWOgLwPQhII2!%H%Qv1x=J!Wm5Xn_%s(vTsBQNjBt?Yik7WuKNR{*is)-qH z0e!=XcXj5aB?`zm5(qx>};U=@SbtuF#VQu#q@i2c7}tU zBS#euaa8W^auwO*_=bO$xKxV>r#ae6Nlqu;-w$tjfJ)}35mOc=$l&ep0&bdjO6zQa+{1w}t!;?(Fcc_^n%7#3#zzp9!0dv*`RpgUHv&y1rwqdD!qrxRpkO@jD_?u|XReVz|}2N&;{U!p#~Z~Ci< z8FPu(HRsf1PZDu2;eAJfK|*oAM09@cVh$Mu6i~+AnNmZ1pFzUjHNMYi$rj?mGlCt# zjRy&kZNVj=_8s$YZSHi$T-nTQxm-9h+oUQSU(U_72Z4h#GdCa+EoB*>GQ@bTNcK0T zKXjTeVd5O6^^@TZO=X8BXHDo9%85?|zx%{{rKt^{!r8CJH_R5k1=8fOhC4kyCE(H- zEo5SkMgT6y<^*x$^*(AOY_xqirG`IMMwXi{fcV~yoR=8RY4Z}$x3+A1D0v zo(|$$vekTR(?SlAqjW*>X5?0@OY76#N^-sR1-SbD8?`E%Zw&lKE6LYP( z=TFaIq@6um16)_$Lr4hU?N?oniGqWTX%HRzFuv=Gee@3&zw+^PJd@cu-;JgoC5_VJ zoZ=?_H9qned+S=ebhb5H9AuB~78F(59_bp{Mk~ZI>h?7N?odPaz=T(tJwQ_Mwz244 zNR$^k)B^HqfFN=xQ zkn}?h?0w8w8`&actCvxwK(hQa6RUXpd&ixSbtpJ`t$hA_c+{x4dR!y9*$mxQJ_`Hr z;v*EBH*)v4y&DI7!7*o$-h;7{EuJG;-E8r4%7xwcHpeOJl+F_irpC5)C|FT5GA&4K zCNbeF6@>-fQ;k!dB-iSuRFBrnEAGHIkjL`N2^|~mZzG!e`m6PjX1EsLBq06M_=aO7 z{c|U6Pj4O#+WqMd@6u}+;u+(FlB-`A;`pkDHjK4V>^HK-p&@oOOniP+U{|%0x9?ege06lDOR4eg@I_G|vFTWG^|A+c*>hBn zOZ1J7(9&R@P?v4(W5{>`eSDhSxAZPZ&wRm_vDU(AGh0mIRNT$69KW_le}h1}v|Xo) z>DB0gU%^Z*T|lKrPM_VR4BvZ}T)ht9#V^()QQ`hL6gg4bZ49%&T9&?{cl|=GBrmRf z!D|2Q?TMWQjqgP%o{lM2ue92$l4OfsyV||2`Nr0@=3lJx$l9PDua-xJpY&6T!49yU zzW??o-iSoj{dpzi>oN$cT%5xDAigDyi+$5O%;V4aN{flF>3QFUzJ`#PG+hp*XzFPQ z*Ehmi^Y~)<8os-?=(n^z6uO7EFI!bgdL`)O6SN(?|5sj)e!1f6fu6kgY&K;?dqTH@u`hs1VowTbV0=NpNhun=@vLwr^_;5o1 zEA3m@T)?f7c3l?Kbp~U)Tyi!3h2t4tqX7ju-ZKKx`&XW8Y5(n{s)*H!+pNyA)Th)J zPam`Z@t2syK_=luOnS%}kdD}rXNyVLon9=Mh0~ECYKp2lz=0E%QHtAH;`Y-|s9hg8w2h~+R;X3f%0byfQ z#WV8DlQU|hA&k_o&2N5Z09%!?98?#X)+AWTmjzkQahpOCXa{zJK0v0$z#oU6d^=} z;0p)D!790!^w-DUz$7B#^wnVy_%2Mn2;R8x^6AUg?EO?7Twg zVbf#i@Gj}Yy7NPc;CK4!*%PSVN$d;lB*09sO~o94;DM6=F68nm=^_adj}Eb9ioyJu z-a-)@40M7&GtZYN-l4+hE*|$g{pG|6>^!gaxvn!kvl3`CimPG2;wmyy8NTD}RlRq} zmg2tY0escNhR#|7avzk~6@76L_9E4<#U$m4^dM(2LO*y=TcRf*eA8l3I7NwKPXf=Y z{>D)3!U8cvq9TN~k>>$U(`L+>6T`VmP@3pS0si0#2-)QU)9dqJARH_9M1i(IPpX8> z0x7PJKb^f#QPQo)0q(h$pf7^J%=a7rH_zfJkSbR| zDND#@-vEJ#zYSQZAvC;mfSVyQ_`wiroWP2zAr{ClA%tn;+ibKLAZWpN(0fmxW8Bw* zkWvcZkhl_|i)yu&@LH(Y9RmoxKs1Lo47H&C;KM4e1`=HTAi-6h{?_Lw7~gR4N2dwo zWe)*diBv;gQmG|8Dk7)cauDAs)?x3#>u4A8$MVY$zeSye} zSLBxw8%=RCkJ1XRl8xwT%k)GDS1KU*yg5IQ zTaeB@e4nQtix7YrA_k}+dT;!i{Bo%If(Jim^ajg{?}Nm%rIv?J5VnR`)&NdrvLOh~ z4&ps(+5)~ILHv+JBa8%(`_iP85O_JdRlU6*-}*s~+!L5#Hbz|{P@MPq(@J`hU5HC2 zPkr)vvweU>w?5CITU)WH@O{7q4Gz~vAJ8<)Qp57g&aDj5l)tq@fcM+TfvOo0C!~4@ ziLx$AkcQJFNY!~WJLr%dpCdf*H@ou_uhsf=Y^05YZ)ad@E})Lw5?oCuQ+%t`It!Pb zCInRiGTnus%jtl=R>23?5+=0-AFi3NeZ7;_*cWL0Nlh4Er`m;$c8owOH4CVEh;{gR zN%89$5O31lp@sMr5Pp^fDIZvPoh})0$cdT%^!txf4ZitH1>hpMN&v44t|H%>9Vd`7 zpkq5m8xst0G)?Ia(@{{lRs_Il>GE0`PpmqLFZh&>jp+*ERcEkEe!0DeR)L>?XvNQwAoV`uiz<9Snk{{g=e0W$SeInxQF9fYxH787cYNdk^7awn zji;3xaiO?ho*gIHK&y`wK0cTa=moe7tdCq~Kwd3Xo$<%74~d(9KdV;XQIY&cq~ zPTyzJ#WJ220TqS-Yr45TgnuoNAvOSB5yYNJLjycoI8A~y4#j+t@_*)3*f0WPlz=o> zXs#;BRY)1>9hXXQ_5HZ5r;VR~!y9pk@8)p=J%IM9$sysf#VQ|AdlI@hZLz`WL!P|i zWV(niC-UO8SQl{DHszN?x9?Ne^-MlbT?1{Xj*+N)b_F)rfqV55?V8?T6&sGy#hQdU z7MaZ<-V4$(gh_#Xwu732@9;6G#~jX-Agw1$aGk7x2c_aMUGUwUfZ+Qc1#g^F@(*dS znQU1TTx~urAD68jC)DXy{AQGn(pweb=LO&>{;iW^b?u-B-;UueE)b+hL25VGUmoxV z`XTt@Dt758QpBqVepwshy&zrgwG|>F?Q2I+E3PC+&(mmZo}QZ%GkYQ&dN~0e0pIWa z%rsYB2thyRh~O$;cfbPKoGQw3LP57C)Dh({25==Gn_(jrPc}VHl^IZbX{c4|SS z={es==)DY+X|5VEGq)lrydk*C1W@KkWrxDi4!cvGG+-9T0Lu>#lTylLX zv?CS71FbR-Y9*-uJ1AZ&c?lP`yg^*BmbvUGI$w0z9`Y+ggpMJMU@*A>6vTGL2x@@Y z;obC`I|ttt%2ff}XD4Q+IxDV+tXb4qaUW+i*aYBn_OxMLaFvhCs>cby1S}Q0wcrD~ z>8O-l;rB`29-u+4&y>nknE|i6#XL~=@_x@!U))GZ7uM>QUsm|OgIe3f$L#y8K!zC|6yrdnuSybT`!**t2sm(W8u7W*|OTfLsJu zZz#CBG+z|x3EtI)+@mV`lu>WK#lFs1N@?npU09{ zExG!vNv_7HEd*EF@43bgP;4J3wCUEw2kfDvid4%4UVgf4kSoH@cm>7QepuxQ?gu6 z1`cuG5B!+Xp35*sa#cHu^tA6^4+yThg=F6vJ{x4OO>Zi7&7UWrcB~Lz z$u%rJiV!;1krJuJcRYXHDZlK>eDUp(bG2$1BO4-pHlSw+i4o!lLb-*KhP0L-Jt;Af zM-9By80-2tE2jh=Se*IYmtnO2VD7^cz6S(X>5rSo39*nsLYJ|}0hjoIaXLy%e^(r9 zo;(aN4?KVsYP^}=L2Ne-ue^a9^nJBG#AD1#;#oVKd&ki~Z(ct?$08X#$q z-p_JS5+XL|3@z1l))2c;2!B0@t& zjmA^-uw@>?xRNiQ87ZynA;>;Z%`|#uZ)Ct_=|BP81+Lep?uX4z5*XlKpO9AgfB8U$=1)uq}%@(t` z-r9ODaWv-vT;qG<6NQ91=ji&4S~tpGg?)&pwHvn)D#OYnlQkSY@7F93>-rwn)5%{J zg7~V108V>Vq#SnBQSM$W8!ptxhZJU!cmOWn?b%3~)b8y9`DKg1=w|O9%^`*qaBG6t zyiGsU5DYOmsyh|ma-#6Gr{_U|VKm%kMwh=lLuGjT(DCMCezTQ~g&U z&dZ(Yy~kBQF#{J#rF-@CymcTfoWQ=zFfNDpG_lW^jHqx2zU`HY5JHvKP;{%Jque3U z`3fC`i7W8}#|M&BKmPlBOMe;9B=$Xr%JipIiRZmz7=)+a&>(kwND+KL&wcAwJw0DJ zK0kIDMk%gR`(UHSpGc6h=V8r}Ggc6Dt$k#$`|oh3XPoPegKk!sxkCfhm83;}Sr%!3 zXxC%ZhEN*MJBP3;=~YE+M?rVrGpshXO!d?A!RsMCFf?mtpQ@Hr7Aw#(6@_ zwICW<$0}R*Kuv~C7OjZuY(uzAyMGM#%ztq{Eb@fWoj*pIluj4r+wEpg&z0}9oIrHo zCy#tT&SsRy3HTtYoXPptJ&dlI_EU(zdr|tqP{6D0ALlzjP-<15KjxP82%)j=-n|C@bvy{#XZ zQE_(aR8KdkM)*``Td`a^9w6<%FEUEv9nQe_Zmrtx0o=s{OcyNnXw#h6)H)B206!x^ zyUL*TQ<3k8^A&0%;rj%5qgL%@4xE(oF6;k(`R?gyhzxs}l^@o=J^Kl3mY(*KM|Ohm z`*-5ImS;t~^?a})wz>)foX$pQ@6xK>Zaly~vFE-qV6lH3;P;B>lSxtDdgQ_bx83U5 z9ZjC%y%+CaHA?sUTF<~96=F(&I}&Q#sa0!-sZGz366C=F*4~Q~>E!En&p;C*zH*qw z#BMKn+z`fs%w(^6c1OGGBa8QN_X{X58fxJ0F6ygkj+I{ z03PD|7kj7~qS94DJJn2G{=5FjppATvM{2ZZ!M9!j@6iGRlqjllS^V;Hw3Vk^B^_Y8 zF{Q@Fiw*D{#q<+?0|ST_?(So|rq=FB+vl8SPtR-T!E_m+7vIGrCvD^->e(GFKlZz# z4Hpogpb={6c*1vJfHM@GNY!>L+0{0X_xwg_2&w%38Xn;AayYX?C*D7oFZNI?&|C)g zR5Nw?Lzg?H^vld+T=K}@aGtQYfC!cE()C_#E4XG)N~8eyUZI%E269S3cAEGtWs}ju z?O2XADLd5Kg$M8$DpLQ>U%S{x+BQo(_{hj^?9+}NY?rZJ(-}EsFiO(O7dVeUCMi!r z<^gj#iVx_&or4|Zo;*U=23pY~b=sS`l$xsW@C~ay+`8tnD!-aNas;?>Nf$cs={myI z=9K+oSVKh_xLoKkpwuo(NwYxwPN~`;15kW`x1%m3H0MbyH1K+?4Y2wW7Za_ul=NWy z`Hq&HcHd;SADLpVV~=56(iM+<8oOTOr1$2O#uKn&BaA|y{D(w2ed3OcBpRth;`Siu zqNl9~FnW+I6tM9)C_Jx!V|FO+AMo6`d%j_@ceH*!eoKCpAK9o2YnOBtzRw_}%zH!| zltb?r6zP&zWudHzq|!ZqmeeJsT?IeNmp9$3S&aG)dJnK92k!VyW!+MzAu=) zd}uy?pf8YLRX#&jY%0}- zA)nkYt_jnx9{BA^jw@BN<?Q=$J<3pbZ4_51?{3>l~ zxRmP7MGpoP$E%2{|PTWwEd!3LR>tLzW_C1&y$-)(BzY zy$I3tY6r;{vQnXs1xlIlH-h26HXw#0{h$of`zh7utR{;i#e@G7FkS$m~*W!_A!&$ zL3#@nQlUm>DbR{E2FS+3_#g?E2|%IPKHH1Er>y{_z{g&Aq=}|S*3Vo~7xtw=n-)zI zubm-r_8{j8r?Be^-_2v17ss063pUk*x#0gSagGAXV^M^p`32u6& zVIWeWAa=T#5hzos4PYLC9>H!OwcZ1Zy{8dC%0J2QL43R%*X}!fk!Qw7uDFafi)NDT zL4BRF+jnV;W+&PU?yUagSZ^L*A=MHl&MzRQG;I{hstCb}lINpn{G^|s>q_HFYA)mo z7fFdr4UjKJdcySqM2gg`H72BCc(M1i93bkCG(Pl!Fz3sA9C-1}I_8o|Q69Nw(N)Rz z&`6H66Ya6&Sb7xFSZ5*>fcP|SM*&f7F^zLg5h3!fbE!p|hJ2(ctt*Yo4ytS+kE`4m z02gI#0G1*x6D+lVl+^psV()3?;bH|JbX9Y2{;Hoja~VyaL>5gZZCO;#%g#=YnKZVf z8dpvG3y3vS;me8Y2nyC>zQkhynrkYKdWA{Xw%H1^*c$l`1Alv)&`T~5V@ZOZ%e941+lk)=xPms3*!VI z3pDWXKt!zr+`m?L(1Ii6K_U&{ItCCa(t3iG2OzuHo73-V3Lt?2vVjje58hEbNy=Aw z=9Kr;ko@nhRQdNuD1%(fzG~OD{ zr9;Tn+r$GfzhxW=xZlpJpsP3@c#g6?Qe=?K&lD|xykG2uasw9snI^}jc?zF2|X>F?ojoJT+& z82|?{O1pw~TI|a9Szqiu&99%n1SaH9sGW373`SgdX^UqQb{ZB9hFv$g@lkeNOtim% zh(r0&oRY*1Wl(s@OwtsCK{>b=#zF_#lRP;59*Cr$+5G#K(u)Gv_X& zZBf_2_g;2=2jSW%nsyZs+vA`PoYC(wLbV0HL20~0>r2bAryb;s_PbR(l>u%81E>Uu z_K%YQRPBCqvG+8(58T2>yLN)qvL7Ds%<25B;xby|*=*6e49bDzc${!mq}o{pM8i@7 zZxYX_wK$px+}~~vKLr2v^rKwuHyjYWaUQ}dryn--onQ@wUaz^ z9(0Y%uoj&`o~`-nk|W9S2;o|gYWyV}D!nDhd1RCqEM|8VkTn^4q$fB zGn1364bVG+%Og+{+RXz{5=!5-*gIMiALc;#Kb*YsuxBy z@ImLb^D%h9Gn=Hca2aij_RPO=qHtPrY)OZ(Qb5cn=ad%WAbo@~%wNuA&N2BO)W*$~ zLP-f%q>9V{QAe*w%%IG$-Vs{|pt-Tw#{{0&W@MnDPhZZeovPx(qEyweXxAfC^>;42 zUfPGNvNq}P#vaI;pO{nTLY~grN?HmR<4T9Q7;d2kDa)Vot=<9BZnPf&&5D4#gR;hE!(VU?=JQ>QWHPX&e$3A=U@l+#h4KUhw?$4Urr(3LStQGiB zB&8wr7d&g2rxb*>U zEWx~E0ByAT_7R76h5A<$A6M2+$|+S%dL!U$K5~AhJ=fbAgln^az#%Z~^8N}tLVB$+ zylY~O`0J#QymutoLEL{sPHg}D*Y*!>pYz>!H$GzRbS59aWm0wOJL5b4;A-%Lxt%eBYYZ^$A7C>8k!dd>P+Sck{6!<=)Y{33S6W-L zf%LeY9G^?L){11OJgf2Qr}(6&k?~9jJQ)gRg!2dBwH5~Gvh$q0mH4pumfSL&T03cR z;UgBUo+y~)xJ|h34(KMSg!Z8vQ>4S_T>XTFEMz=SmtnqVLbxXnV1%UIH|wOk4SW#1 zv)bu?uy%5pSK9r=8|=EAh?t;su=q2qMrt&S(J?&3K7h;Mt%&18&ru)j{4Vnmu9Z_LBhaP8Ray%l+65Yf zBnteP1HZtgZFc=DCtT-a58zt(J{{nFW?It}{_%EA>A0iSYbV6_J*%CTV;V%Miria%Gw_xK~(*>L1yX-H7UqcWH{iBe@lC|z+fMmpl;TEUr{=JfpYd$p2@K53F5z) z);K0lo5O`=b*H162qVq)uV*MzDMyMjjeqjhUx#$Hdkf!#OIm#qCq%M$G`}$N=Ir`4 zgzGu8H!n)U@1p)_uY9M4i^o@^vo7t%E0d2mM+>??)L4}>^C#)cKpoQ8D%97G(h0Yv zo%BxS?7>#B>nG#8C*3Ss)ji>xEYi0mZlCfi=g0L&gXq3BF#}Ui9&vE~^=725*JqkV z8j%=n&h)dbb9!&lg_Q9?y4h?>zs@D+8bH6!XxsPej|SG7M_EIytK?A^ zbYbCgDO}s#mTRhF%_LcsA74)p$uOaYr6dxnJ!G~N#*X>IHs#oV0@FS_GrJOFuehdb z@C~8&oX)E0=DjoBZ1>vK@65IB1Hxt#-yj?0Q5T(DzYk{Pcs$tf9n&xGvxxdwd<4m* zvQX3Y^e+-onmANxE1(MXlLFbeO1zr2sy)mfB%JhgnOi~;oG!p;?9&(+dc`#za^N-A zc!D!OcN(*_?-;E0QCvAAJNV$}>7aQBa`SsM}IY{iPTGzqktzugi~b zC*;H@k~AX@QL`Krj$Pb}m`kbk?323oaSwus(q#9db0AVVO{#CP!d`qA6vreu+3uk@ zV0eiPxRXukv!x6BCyiu7K_;D%8QXytq3#wgk9U+0%0{XR^!zGkc!j}YTY8Du6UwX3 zaX`35wue_6Cn3<_rEB(H$C`yxDZ3RzZ>UKH zVt3+%o*!IDtc&S62;XTGS69y79-xerNULQ4C+2ZiW?VZn7VeIzJIDzaa#r2L6zbn$ z(%#AE@{G9TAW!@C)ho>y*nJ}^f^=-q*za4sxGV2zJ(m;`3aRTM!;1pr!gH-m7XP=k zby_(xP#i?z!LN4WB=VV7J62vzS(8TIRz_~zH=|M~C)S_$`*7yKlW*5k8FeQwUmi0L zi+{h2_&0PFSf0@@WH&)i67`xoFz%J+a`LFuueJR~>@>;LOWYM~8&FUwQ8*ZClt>so zdcZhPYa4r~P2n*;MIqlAhPrcZ@Nh>R#YB0zleVa?PmqzK?!Fd$jObT?Of*sJR~RZc2TnaLWwt~ zJ?PL@CeIeA-!4&JQuA2)1EY&v~arCKV@A{sT1x+s5=#qV4U%EvnKwH&a0|z5B4eaM-#$b?Jk@|) zGT<3*@`00%z&)f)V+f<2Ez-yodMnD=9NDZgG98P=*_vJHsgO^ORn2?Zkr@}{wA9Co zq1cN0VIC60F#zt)gP*4iv5)q1J=1zb3LPN zeEU-tt}Ow@8pE=4((gYv^q!yw460-x2Ni+hIRq0-Y{@BMGG2WeX?9?Wj&MC z+{RXH1RIzxKL4Uq*-y%Qs+Oh_Ff#KAl@FgY`B4D)qbaZJ61!5- z?3JVkpCP5R7rU+kgO{>bt>3*|H1cRM6We)7-7;XcTZq!q>|FI&$s;9Gj*lrC0Qrg1m zZA#I1%{}tEjubmfz#v{0HEk7mT8S0&9HA!V-d<10HTU|6z*lit;0d!*|;mF6i#v|Q8L(&_VDg}Y+nmXPV4wIQc#30CyxTt7Uz%7>2D zkY~&QZskYU<#io_(Ca?Yb!84Qpfmi4$w-sOd!_YkEogH+MF>5<&aX2;ArtTwcItFt zP;OhAZs8~gr3oLw33;UYI{mm zU&No#QTdtYnWm<;J$^E~EsiMTM;qLY5+QWI+R{AnwxxZ=K`jDtv%{Hq+|1LIJ&d8VmfNFWI6E{7*Chm%IB+!r z;YnA1YtvWcG}jL~cZcp6?t70#G6Q5$uOEU zd7e0V!*xboI^MOO@BR2*h?W&lgCpcy+;q(D`{5CoYxu4*cs9X&XqXT|&`p5l_As$m zyQaBc85ySymn-afmr5KKedI^(3CfYqnYYU0^>ou=zS*q&YW69$?O~v(;I$?{>L2ex zR^T1zyAt3gkARqm`QGNf)WOD^@0;uSi0k=SQ@Un_GpF`BOqe9J8R2ohDbY%^e)n3R zGF5=aW57%SCpljaC;^!C5nwQmbgbu1zNv6cX}WD?WZ&|uHgU+0{4fCXCt^2S;-**Y z2TC`|s~BdZS@{($Q?FC7NE27FdOPl<%kP8hnL^EbJ(o45 zYgSNV6SQI&*4UKSM@!ce`*gZcV>kdOe$H{i{J`3IYh&sXd)YQ|-aC|$`B0>GCW1uO z!?b1DQ~3GUQ2h`n-E=8qZ&!Y$eYAQV3_$N#SMsAFlOH8{-KA!uN$Yh&|Bke7lS5SQ zFm-^%#1_6iCsW>j*<4R35$khR&#g@Wfd~4H`$pFwQNJ${$!zH|v4`uP4PHIX$iieW zPvc=SX=Jd6QO+JxM#e*t7F}xS0WP=e=SJ&|;86kif%2g?5W{*iUA< zx$1{jLtbmNO>48=nXNedaN+&G*!Nf<1l%r_Y2=w>ZwM0029%K$IaxFAJFQ&( z+-R%Sc&k9J(+`&qtr6g%?zt$8k{|s@6*9_?-qJnYq(8dxj+(nt3!{`L*m=+Jv81;L zqr7U%8r58Cdp+0j?NH$?DS5I0D;VCuo1W#J_-rQjjcW>=UmBP!0Fxm%*pfzeJkOoV z$R)lxamW&5IX6OpkKkL?Q(mW=eqZ@e8^GY($TM<_;Eq6zgWOnNHwqGNbgp_7ykv3b z-J=7-u^sL8TysaezMiwJXZsasM!-++a0vV~+nGAXGk|3?v7c%{$?{86W+y*5f^TaO zS5eO1sf=uJ&2BYMjEf_`USeay>+sF`K~o#ShU0emP-$CEg$OR zP^zpnk8avH@di-*;B?UPx*c!Na|CeOF$OM-89EU~M*Xo7?RmD1^^CE`@jBH9)1$Hlq!^n|#V~C8qOX;SY zb816beWQF>8||qZV~0K~{pF;%0`cXZJ_+IgIA!#ZrxC!YZ{$^iZ&}YQ)_kN`W42=N zyIGx>;N}Ve?Hu1TeQ1ePJ0W!C*avs{UFcqv7>xwKbldI){=u}so#_8 zl+xfN#r*r+8RF{*T8z5tE`8OJ<|aL(iX;l5-&hEJ5v}*N=4oxvnrcy6=qk}G`=lh99WNqa6Y3GDg zglIRY483Y;IT>XNGm+~CCc(mlS($D(Sj1kfj7-a?5wnGFl{w&<2-%W|Zk*Rh!{u>DOeEx;_=e=JjsaXO1k#;ZZ$O6(iVl#%6H=w zdJNxMe>$U(loRgQkH~LKv~r5Rqon8gl+&m=hOvP>ZFT0c?G;AGQ$KPa&Jd=J030#5 zkJqTy4>!pSjpet?@>U&sr{pGu;fwtr@2Pre>Vi z*d28%SV^)SI0y*5Ysd`}Oo;wkIc?nK(xt#djpzb@yYvlDqvbD0j zEgueM;8P|}d$2cB>n-_4O{njlDo*we_Q<;$+ltwYC&x2pgNP&P%zHFWVnk6f;SH1d zggh;uI(2YN_}lu`1Th=VfVdwy^6Qv8w)o?RF})Km_@MhP)oG745_5Kf7U!I)xVEUa zwW-?mJjK#kf@ToH6Ys8DGo0jMZ1Cbk$J{Nx-(L^NXRF;=%v`0#ho@}@yUXmqEWOcF zKlF@qumjWXdBCK5#vFE1EZR9~-0axnIr!G{!j-Uq2oEEPphkF(5?8|0j%~_5__gRJoOzQ`E$9v%i^)=SB z+@My@J_!u>a%ValfztuRIkV^Zb1b`RwhNRy)%@9P{A!=#;cpk{% z7jbfT=jCZ?l%pL~y39Q|j-iej+yG;|)-J_&?C3&iS{NgruDI}>9Uh<4<`A__v?C3) zDGL2_bMfKpC`ztaK1myjY>g&Ae2ms;Is3DxrfS}>K2w^u)oQ*l;rnn^{QDcTcgcer zlpM~}CdjHbKUTG`XPXw=0L=CF87nBIPx2pbj~|J;*7>U{QW*mHzS@CTezham|B;Q; z%c7okNAt7^LhnV(r)a8j>a;meNfl4vHsBNGwpWlG{W?vWcCa1ieEy6k#A7{-jgd0y zAEz$AE^|*w{1U&dr$A9=t zndOD}KKDrEq}I|zhmXs|Z#`Hl=7rAx1Nh}_^Rv!dUQomb(hm!{r|11i%XiXL^NC&4 z?UB|Njb{J-_81;DN28|hL2255ZL=LdT3!|ozn+#6HDmuW_mrn6nP#-7Z=*J?C*k?O z$v}TpqZeo|B+E3#59p_F95|;<74iSGmZff5Gde7!sq65~iR>2sA_M(NO=PW6j52D* z((=9GjY-Sjgl}q@W;DJS%V_GROXC63^1skRzq4uo6qL9yzBXt|A7l{$sK0gfKuR*n zYEDp+z*}2VZeq1*|56M6(x&oDPs^8rZa{py`tto{s~41JH0B}v-h#y_GE#o>w^``7 zH_x)x6TOL>w1q{0H7w)G+5Zca7LecAd! zdh$2ACtqkrTTR{M4weO^X+MXhY5%qB8p!^ltab1&vw)c-a(e&eUghjRz6DlahIecP zQt^bhZLpj@>vsOb_%CQlGdm(Xsl&gNqYm(@NzfIA_oywql(YX&ny4ZtBzwU#pqz!C z0z!O9e)(U!s0EV!)vDI8eo9(cNh0r2ME-wh9``@JUmbRQ$Si~yM>|D?`)z63f9<-) zvcI0)6R+PQ%V)h)7*s_5e`o>2n-O2e{|js(r8&BwaOapLlgI;#pMg4yt=U7ASojIAw}drxOwv59<&{$ zfhgmwHKR$CF+u!eM3eDfyQsCqg+UTIel^~Sozq_vet}#96_pa+;T&n&f9$QqUP)ZIwtOMIG~9S6Rz&_B zQbhifn_m-O_Nc0B+;>uB+$T-@ubtjnn#katc=3!Pau`%Z{-Ybc6s-if)uu%Qg~yBl zkD{Xk(w+a>m91F5nj~^S_mmd)FY`{d9EC`5evuMM(>m}2{hEyb+SRS%p7iRG`xfEs zzYO0UqPj+!)`xBF?0@ZhTI53f*6M*G@?$2!SOoY_&;8pPJ8)BmCof<%N7Ea_j3#5J zbmzZzP4gtZO0ug;5_we-IlegPFLB`B8GIXUS})pFBE9TIlX0Kw(Z6|SB`KfO6Cs*B+cMMo*XF}zW^6EzwC!TX0Bx+WL1aJa)yFpsCuvUs)V z+bazJhc}1fw5TrbSew@8(#s-EyRDu5uYF5%=$jJK(}#Fi5;=sbBJ!M~?>kZH7l!|{ zTPCVYFP~0uXX|Ku2fCi}58glDM0%B1&w;QYO2)FTFu$&oqHn)2{2$${sIG|GGt@Kb z<(Wkp|Ka=Rn`r(fOw;N)f_JWnEJxGv<2^q-`EP0B0iKztE|=d?bCg9H(;EnqDC1x9 zhSy)+w5D~Y4^qSTVMXLWu$7{^TGKuX>XLM45@n2FJ!Pjg1Hy^zi>6_J;t zipYOlD@1hzi|QuD*!0^>n)Vvii+^prSoCY*Pi_``^S3RvU?qx(wgx&se+j zr)KxBtu|5?E_JinGyUyrC!)GFvG3#x&eHDu*G_M=c%^POc<_J8rPlneFeUCsv^)Q` z&c@2w#UUlS@PGJ@>aO(dKP3NYO`KEdno{ij>uV>sDysXh{qD9Vi42n8e>uE=r8e!q k*4x&Vv;XCm|Jvd9KS1|7CVK!~Q2+n{07*qoM6N<$f_%t`e*gdg diff --git a/public/images/pokemon/back/902.png b/public/images/pokemon/back/902.png index 9720dc5614dd205153ed4c11c0c0b449a6258a09..81e467ba8c6a355b6bbf6351e83db56b773611a1 100644 GIT binary patch literal 28242 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 v&pq-f{moA5@EPd;jsF{4RpSQ8D! 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 FV1fb1GFkut delta 4485 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 X*O*xvB!}>J00000NkvXXu0mjfhEE~N diff --git a/public/images/pokemon/shiny/769.png b/public/images/pokemon/shiny/769.png index 1abb216b73d812628eb3f1f1825c9b28f4632ef0..048ced8b759a13179cce3f25eb5022bd0bf6eb39 100644 GIT binary patch delta 2246 zcmV;%2s!tX6!H;}7zqRe00020)Hi*RE--%qbW%=J06^y0W&i*Pe@R3^RCr$9o3U;q zHxxyMNij%ickW^$fySv8u#q2FErQgxkxxiVXyH6%OEscY#oI*k4~#uu8H$wVX7&x| zVoXRyZn;N~k9-s$;4D4qNjXWTv>7O!KkZo%QvPxJ&2Y{)!_oOW68`_b#@i1`^xc1L zHqt3S&ypSG?qfF6dAj?Q+EV#=cmE+DY5p*?33fkw_%#EK=TG;aW?(spb1<8WG=IDU zCoB(v&r-a6e8lmy5%>c*VOa=#{xJJ}fZ05xQ&i4;vW(>;q;k&P)P&_Dq;Ni)#!{A# zupytO?qzFp1D1)fp~xHC$BZ!*SPp+es>nBeTdJ1V=GtIDSqK}7+%-eBbq>Hw|Na`AxSYzEu(7GBiSf+R3i3 zzM&yvC%#K!*@$oujdVw3vEJ$<*5XT@)64E&>Io3S5mM-x)?(wo>pWjI@;;b1$LD7(QFP^uMozSbt;Z%psVA*!v zZ_t;V_y%vJ*2LbU@$|4n}dr4<`Op+9fcvVPvBbk@ar z>w%)K{)5u;b{Vcys-2S0Vcm&H<=557ri-}J!f(K8;ZQ3+0byMru>(bkh`wU6g>f-) z06;65E7Vss!jc&mH)p0{x7{Dkl~{#H5$}jIn}zStIlowiNYPj?Czc>W#&@(C9yI@b zUcSyce@A~dca=r)U zR!iIEd=JX47VL7K2jx~v+vQ9T%B_~R%XuD@SS^2Mm$?V^QHWSAVwZ^ry}r1

5J9 zZI^RBD59(uvCA1A6uwJ2roL6y~l?@B(=%=4hiYQcB$*PCNK zC{m@ZmVUh{R?ALohN9MYDXZ1k{@0sjQ{(cv2L(dl(UfEAd%gK(6N#3c^&*lqf?rKL zChdQ-7Y-e_9oZSKf*|-+1imZ%dJ|Ux*$KgzMll1vtLOFR{-T?DKs^!^lJ;H6*PFNs z)o}RDskUaKwWrn!(T30%StJ zz;O2z@l2&P+s>tGaY+P?%s?#&(UxOZ$p5QqzCwOS&iR)3=kt%qJD%x?Sn;e!4Y2!^h@crTs=aQo$HrS0FboM8tMJ zBkjkQTM+?PVS-Tve@hj#)iF(NF#>l;uwgMPH3uRXp$+haB512NoBGgif&Wa$2Hu_$)TTGYPvu2uAiU){sTYc@h!vtOR3zh6N6#xJL07*qoM6N<$g0BBang9R* delta 2536 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 diff --git a/public/images/pokemon/shiny/843.png b/public/images/pokemon/shiny/843.png index 01efdd67f0c578b2390ec5343b6100e1ebc87739..bc78f828ecb327d1ea3a3267fee0615d954efc30 100644 GIT binary patch delta 7708 zcmV+%9^>KXKBGL47zqRe00026>VcV&E;fGwbW%=J06^y0W&i*ks!2paRCr#sUC(dZ zT6&cjp+MivLXv7BNRY0&ikA(N zjo>aihJ`m^W+TOZfQQ+P;kTGte^kHwi|1Z`q-Rm|E)Vbh&iOtnKynVrH0+835jB4* zRv>6qU5E*fs&Js*s)CawiBX)b2Vy!EVu#ZwgDG9%{11{TtpW#32PQy)QymUdi4x2? zPLfH)i^-J?Km@Tk0bIePi}h9oKbqbr%W?~lK&)JGGWB@=&fq7#!K4x&`25osRd6d! zH6BM*lNuNjA*K`7i*9nq)BEU0Q?P%GTl$`Y!G4#f3ZA;~>(%O#%E*ZWb?@$vnw+Uh z3sqjd^z~hqUFbdpqt|Kyr>oU1Z7*Pmx_zbKUZtuuO)n%zECwz~^T%|UUZ^I;j>}H< z(kwgQ!E_nDz_41Y)#?>(f1$QV5T)QOm16lVY^GF;IFu@vjt# z(Qq8}=;2mwUwUx=8|~iCvXSsc2y)V_Ip_|81Q%Y=g&r}1M%J7E_V~qA;uDvCoMpSq z>500t(7Fh~s~mp6s})nyLKaT|VH5lp)$o+|XRJr=*6AL>6o-VG6S?!CS+jWK(o z>3;tqTSyq)yY$pWRKVYU$-1W>zC4=7I|bam2{(Vq{^OryZ(_hyy;hz7?le>6Cnw&| zaeOXL-!F_Ruy6d5y*vFdUwHTh?I#{ZPogaSA8v{Mr_ha$dJM(TznSlNs#ao?cu(IS z({83}i&ROD582XJ)&G;ZFg{X4?CmuS&1N^;9A|I;UDp!^Z>(q$y;XHm(09YtD0_Q+ zydzNyZxXG7Ni0{@mo0x1$D1oNtH@r^EcOCag_}Zl|9+l(s#@LEaK-5x;p%3!y1UAb z)%KIbz>jZDOy7OsuMAxOwwjf4I(@g#q$i`Ww6daWe`LW{{Zb``ql4W!mR2*QLfKhN?`&#FT2l7(LwDwgG% z@bSRXtNoxC3hl-vI1r}DfCe606y%pF@hotv=sizWISkRzt2R5r(6meRMl6T~?GIxE zcMG_AAVOONtp0?BITbd1@&#QeAMA+XGVE}COVaZ~;g)~s3QOk1aS@7M!GbGEuZpJmkCpVzHPHL2XjwGqXBYmztqzs~6Tu3_mcRvK0gr+{fd>D? zvFv+{p5Lk-REa?T&CI69StNs zQ`P7s1<8Mt25ZI~B%tMA$-hdRRhromZe^J;YDrd}n+c){seSfUZ{GTcjK&ptElQ4O zL;?=nDY{@-TCWa@V?yzm8F7Q_Y_t;mkusPe0XNq()-t>26ysDdma`3hB*+?D$Z zcV6+>11XWC41(9UX>;P-UyRB*MLkPbCfQr{06P zb1uxOBpvuJJMRN;K2_c6?t{^xyPM!rmA}umR>H%LJhU*_CCMxyRaut(!JVR_2^$f$ z7`T5kZsw9dYLxJGOTRxFZ3Azr9#oYEv^Le|Km=l!=oc3DN%D_TgC^CdQ&=0aUL0+S z`H}EcZO8*lsmij0K57K%Zw|xIQ+2&3P{rANb-ta;wJ2~bO%i2UW811iy^W=y-jBAO zb1iis7k$a&Z=dbug4V9n{(i1@ql&94n`?hn7G@+%F&Dn7eWfZN6HV7?zVWMF#dCE| z{9y!DW_xz5nC$+c+Fh=4K;YMnkx>;^s1k}~l$FiB14VO{NgDJ6o@^uwhUM*ZPgN_I zyUSHtOSw6}GGMzx)eU7x+MIpOy5{yyQgYsU?TvWi##7Gup|m3QWbwl zP;bUnwFs8@7`WTSc$9-)!fdzUq)F(tY*egYDUy6VXR74MGwR2(1HYcF1NWN9uZ$>E zr=Dk}-9wF@RsX2$4u@m`Rl1&8AAyr7UC~zsqI?;8yF=`TDne(ovk;uVp2JK%AyHYpRF`ae|!O19t(U=KUGM%ER!^Vo23Avg!3YvO@8-EmP|@4 zw5n-d(+Q;^_R8E!jI*T5?k562gh*vJ@d9mgyEawkeLR@>)T=+M79++YPh1eqz(?;c zQb;YO0NIWVQp#1R2&?b8^gDlax)BX~$1s$BXW*Jk_5cElJf68nnLXe)x@yc(MI+G2B3G?r(k@iR@_i=cxrjPxZg2 z`iRbC{qRm^1|p|nFjYZelhdhQVdjS9(v#P(5{+1O2vy42ez$h|{!*&~NK)Sr=*{-^ z?S`uVVMKQSz^xyWSn+@1_=SKfxN7DU+3}R)_@{o7iN=m7s}fQboj5G1qA=m~{gDE( z_HRRN!;`xkt9%9Zi5B(U)gpRntG`udKU8h5y5`g)dkS8$SdD+8D~BgNL=87xEpF3*zi!bxe}oi`}PafM;kC@iDsO=xmvoa0{ZPfCb4pa)S-W;%Eklpg<=8tKR>;D zJ717g1Hx~=BV*lo%eFo(>g}zpKX6syGI{#*9Co}iic_6gj8%3Jc}D6`+4{QqA1p{w z!&UZnG?(DSYvMK4r*L3lQXkYO+Bbhzw}`7sUy^}6GIo5=s=B-UMpplLbhRv>YDt?s z*Udv!o)Rbn5U79RHazOLa%I_%=cwUs9MbIxg1-$xwDrJ-Q)*P^Yfw6pLAQb*iB14I&uMY9b+SlW)U!ZGFJh zxDo5CLcK6aRH6XboRYO-|HQDMne;xxx>FjBos^_ z0(6N&K?eq20CONVIuw8u$tU>NL|5?oEzy-)2Z(X}l_ZsZyXbZlT>Qbo(zd?O(o70& z<|D?a@4$bA3Whr7eT?V;D@ZI$#QjQVf9rXzRBre4`an6!Q;1Ge+q_+pI%Rgh(Yuvh zl%zg^RMgk5eY>)L8~c6p{@F~c3dp(4^p2)&F(w%XgeuJvL_)jjzSJPi3^h^!9R^7s zH8U_~K_2l%)v&DB-x3H^dM0OhB7(jFalqsy2Yr9Ckj&BL5s@ zRlc@KAgCf4)t%zhSL5gt7}j+W9$Kj;X-K8i!|M8OV6(2Ik}6fdQWaI~P!D1>!YQkY zXbKRaLLw0nhI!~qRV<^!%K8-8&}v)I*0+BkciXQ&Z7fL^2{^W2#3)~|%Bj-X|vqP}pm zgvhPGAZ(B)o&})-gJoD zI^*?W($D^r+yyNmY&(e%>E$Vzx;cF> zXnbvcs;1|MGnC@_2YV8q$wIbMyUZi>6TwcQZC0@o4C|cvnrYo9$~==lO~gHc2GCek z3>&XjaAzK}u%G>8xF|Ax9uTo=3U^|No*h%ZRPqmo~ zCY<%^{m7$|)C{{MD;UC=--&-pFHEpD*vXqQ{B|6*XUp{@7)Rw{tH{Nt>3@MUZyH7{ z;0>_a+3sgYZ+?a<>JgUtiA+m+kNO3OoBesJoE zu}NfvtN(~l6>d~G^Z(ZQ-TO=XZUkPK5KAN|Y^9s~-&WF+o*zzQlL8>nplCu^GyCpp$gH2Rkg2gwi>IghhY;n5)sdtr&!`=SsPh}PEcr8 z*v}r>{x34=wS|q>8Yr6RnzM1ws#i%GsB)RXa34K^VqMV4ea+8?D!#B*s2}) zrhiReuI`HHU;=)$9v8!w==gX6w91)3nc%jX7be(#=F)ct-fJvFFPfM**@tc&R)0%& zRYVm@Tv5BL=wpA}R`bFHs_?a?jPIo9r2xA{G=YX%CMwZbFLrK|97u?^Jkx#|CIh+u z3HF=30J#od!Im_>1&mfN&`=FU?hQdA17=A+P+ChSbw`BKp!O3SwR-lYB);%ayitW@ zAJN1_H3a@-P}D=@($$Gbx%Xxw%Jz6*2AJSYluB7if=7S#F+okG1t9yNda*>oLb8yE zFzZ~`_OlY1g(S?Hul4llD71<$9i?B}2?C8^&AHj7kO3$U04#qCQ>c55!}s)OtkYhM z@CEuAsA+0hXxyJnG!Ue(p4%*h{bDME9OGdVkfO^NZ+P&Vy~hRu)USPQib&5sVy|&v zRoU%dHB*18PWopFXtA4ZvkyM()C)h>bi;ch$O;p_hxZby{v*n#Ij@th134kCJCZ{ZmT@IuFXogNss(P1sY!!mC_pd*~*i~fkcI$h=j;> zoYL3Ygr6TZ`hO^1m@o+qim(L_TRuWRZ(AzDidcW<+~-I3;SD=DC{S2q*Ct7T3Exc4 zR6-N*tc08NRC6vL>_?0uMUE7h5#uqeHxFAsf<6N-OyBvWhos z+-NJLmz5>%S-`%0_eSqX~{ybu5l zMKTeh;bW{SP>32`lYL;=;Zg(|#X6{Z3cs~5Z&y%OVr~v!t>GmL0chFmh1NzPb*NNf ztZpJ=(XunoRV}5~J^nIAgPHVaxt|iWc%Xj)lYDH)3cDHT0yMv(e)+or!%OxuMvbZ& z3ju^gF+i6e4b&$hn%}%i08s|z?|g7oJOn^A0e;j2TAjE+6@NDXP57@-RC>Y)0sN_q zMs9X6tQ>1oahDPi_ay{fx`QZ0q3mT076Oo4tYs}>(ihPLtowC6R)r!*Y0hYcP9lGT zey_>yZsXkmFF-lN_IpBrP%i%^63f&j82q;2wIzB;Xq!f2SlZ0)ZkDD%s){NY6?cn8 z<&Vt_e-Smnzu#!uu{!S%Joge8lnKMiDLibHUZdc9j2*+XhPIxc%M-G(@PShu_f*&VW~047xpD5eNR=FI@e@}I(=CV;Uwxlb0{;?b6u zO{8eb7nS+X?+1#WKs#&x6n-4@0`SZEf?M353*{E$ylv`4cuY6yOGGFdD6oGIkUfQu zTR;UgC~#lcVs0_A2|ECimBbO4Y}5dz?~p&Zv!(!mVEq)neU|_^2=?;jxy7e&i=6?e zPQC9Sja1a2iURzFKtBW^t9@gopTeKUI}_v}1t{uOakrRF1yt$k^*3UYQ3Hy$l(GEB z@bvvsssY8U*-c>S=(*I<9x*R7^`ko|*oi}?UN4_ikKs;B{Pq_M2P7)%rZgnI7+ zs>mAOEWmnIaEr4y@B>;fbl?9C|G^=4JhiRbzxY%;t;tswurQVt_AwUQLe$+5c zd=OosS$u}5sz9$s72JQ~Md21>0JyEHRYVQudsr6S)nJ(kPvKK60SpD|taiA?ot|`y zVSfuZ1V|gv>uJ;B48bXIVNht+cgHz7I`#*m}R9}EE?iR!ES9ya; zK{!*JfndTz^?Wb8FEtBpF;TUQFU`Uo##EDSw5no>n!We02ZhlbyfS`!(`$+|B|iAn zN+k~*Rg;Fags6U$Au5M&lNvDX0RIHR0j*lYOqiHjHWn08*<$xz&Df|L@%x z%@G{n08N#m2K#@(BVq!mx(Xw7g#bYN^;yKMc7SZbXg1FFck?zrxMY89jeD7znrW{C z4;%qN($=3WihQfRf%{Uon#?WMem{O}WhR=+Ir!I=st_KyUdDvq62zVzmL~8V9n`6U zTTTve8@CldHlHat&?yE~(bjg^*WQruo~jy*T&vyO7gT@1;t$a`1o`b@=r%nZt z)7)X&U>-Q&Ha=MduF`$s3--5mfb-l>AzE_&{lgN|7MPsJ^A&$sN<2i6O8XkBBv+*G zON}bn&!3*bEp`(aVxp$3s+M6A>4=K90mALpUBLv`_VvcXo4``Yx~6Ph2*B)iG^IKn z6{>c9yB&Y$KW&WAl{M7~zM``1DR^$R^92tbRngQInu4+HGPQCz^FTGsO=uGfjBBiR z{#FCrV%}6O6Wr!2BNfqrHo@nfs!MLQ^Tplbk8Rr&&ku%WCb;eB>Z4=z&&Y%y!ET1t zj=8eM++rBOXbQ(&CI&iP@u%={2b4hm-6Ou5v)q3g&2Wo(Q>CZ@9grS;1xV6E6~U!u z*VP2L)y`L_+~Ov)+lk9<%GNCV>P;1G*si*0R`zPLfleD-gc69Vb?asLuwsBTLBtIo z!PM3Qz|@i+Ji2nM@#hu>O3pM*Ko{-;=j%b0Gaae{lt1S5kTEg0*$)8tBH^q8TilsO zQw@LqF{fs`?u$QFXa!ht{P%1s+?hsG4K&5w|m zbK$iK&8_iUTL2iJN-$)0HCtYROW56>-JHVNMz#Q15P%WF?bcHf5qmQJ2+lNH>?1y) zg58Ysey=CO6L6vZ@(6Z$#Z>Ukn)}^me8hhTU;QcD%{bq$vgU;aAppjFCfsD81-BV? zvA@_ye74BuKvi^w?;Q1+3lF;;$pD`E*XQw(p9B5K^BRoVzmZ~?r|u0C?B+MHn_iVVn9}6Llr&I7hzP($S6hS{)k6y`|w=O*VdfXN~2yTse0?U7P z^#XQvYZv*owX%a0sYfw7zEb2Zj2=GOeg z0Vx^4ZNbj>^AIM!bf)1p->V8A@xgyoU^maL-HcwznlE~VU;k%H2D*4^U+%nPQ*rF- zdJo+4Q|y}m>zk__{I1;$W0&^|za9eoFZsY3XKr)72aadn=kVJdyIEH~sqS^+y&3?i z^;5w&YhYK`rx@Js7Dy4`Ve?)ALO{jN2+p*9GQQqz=Fhw%W8P)&5}?-{y*ht>eIXS) z7dzPLxy=LocMSKY7$$^43SsQ#0qkbD@Kf}PWWdHC*x6arQvtv0He0It6eC}B5==!c zV>iPZN3U^WxB!v>8v^jDpeS>u+4A^%#4l%!txed?Zm%(1cz0({2{^&5*;JTaUF*DY z{>aZZn6v!A>lFel7}uKkaHfA}46V;r>il**8IE3YTP+y(s!e==fOBS7vsG<(GrKv> z()y1RH37P__KbOMSL31k>J?Nc3lHq$?b<_)Dy?}40Enq*5XL-=VQp8R-#@IUGj4a| z@pc&Q)x9=tG7u7&MR*Qf7u9w-RON~Zb~RhzH(in44YB%DJY)N(V=>Gl`!}Kpp_#QgGx`S*0 zy*g6&ItB!P!i;(L(0%=Sppyj=$Xg}pVeGQ6?(kmW*QfoGU!TC3_v~ssbYHh%cW)ic zj~d%hWsKb@=u%xT8$f@r09A^i1>m?f<_Ux`%)Y#HUy7mZexZhfuk`PsKy|MGI{Bg>f&hC3@{PP2UGFkhkfyVCq&mJH%UfW{r!S?GI*nEYEcwbnD9oJT%JeLa~B(rBv z-eGO|`4Knx?d^nqev;ohm4%XVe;^RtW#WGfAmN9tx>vp)?Fsm(qc4s>H*lY= zwe%m;ynuO`aJ@WWHTN(xN2yR-R@E(7KKGSZa@3ZCZ>2SVuqWbOwr<9sl%Tc0RJGw( z>Rap|WUjAv*v0v4Df{oA$)vd3Ze{t=oR4Drq zj9w~ve@I}*3*;7+EiJ#RZMbhxs-^t`JgL;Xnmuwd_x4 zsnYD=Q{&hDs$=z|mMXxf;|Y1E0_AMT*_JfZ%j?hY^$K-^Xg{8j$6hEc0Uxh!{JOgL z2&|ELywWFykn^e5&9^qNVx^vrm(5S07yR*d>W{~NQ`Qo$Ay>DIq0bRQ`163dZn%SW zUIQ--VY9w7_Q(65?7cWY`zInUZ1_AWgkt?CoPT=TqVWTh;;tQkB3%&pDU@n7J?ECU z{9@pAO9S(?^4akFr+|6E9n2mC_yfU9m5o=(b5g)}=P$Jn*>IGqnP=ap`l$(lkB8&g z8Yql^r`UmPi0L9o2ym%X8B9g<5=~ zU+$W5wf0ZdRX;|0tw^LuLmln;C{PL#ydxtg&_kR0k>4UjN*R1mz%%nXC)N22Ij4Py zpZD`S;rlKNTT7qIII&pfx74cT1$#nqmr^~}bw@=)w?tMd0Or}U3K5~XP+1E8Gr?nj z=cTa3d3ub>UncKv9cC(vQq^a@cLjv%@4omB1Z9c*2m?(=6hi&`yoDh4sPhDTE)_BV zOz>q-#MbmTm%FbTA;5WMV_^UqDI4|yly`g#jtJp^vf!R;+4bFJ+ zA(^KetWZ-CzSOLgeHa)Z?Ms@%5w9#<2=7n zCdR$4t6xDg@Vj=r<+TV^yMFf#ksuMb05qZetq9E}G!Q)LgaD|c58))vqm+M0vHV14 znJh|0TE51Ck+67jz-*Q>?vmizKBf-dlhI>U&_`b~kNfjHnQ`wyo*SiBpyR%OLWeQK z5^_1aG8>WSr-2FQ4){<$p}4VCDz=Jkc|CDyrONaBG_if@;=)meB#JxKDF#0--s=$U z`x**e^)G_golEB7DZ~-`J2DMLgTWJ9Y@i=g=JP(hKR?wS_9l4#ko1h+Z{8~^=sB@ z4%Ccg|3sJ%6i1$4x(jc?BZV^_r<9~0Y>NB-kWe^f)?ulvT(a?F`i8bosh(e{<6)Ny z6zlHM7C$`E23#rqc^`0Kg!=V_^uD#Z?|@3wQmR-!e}!7TNiupaJn@)+YOUh)9}Dmy zj8eTJkfeP58o&nHbpgqM|L!|R-!I{b>b07Mtq(~qQf_^I3CRJxd-iQm^jxUvQN})3 zDTJ5);|ZoF1JS7X`F4OaTfbwsC z<+mWUL?BiN@@}8%{R=aH^%sW;CI@KG$C06ETkcV-IM8VJ;Z4DpQoWRi1hrx0a)`#T ztogZ#^KYKpQK|{#euo_7Y99>x!wZqe`heu;-6+-A5$-q|uYEoM@MW;;ScS5zWZLh3 zMlQhfoxkyT-E(=y3PgK=#8N72MDT|Ei)`(B{%};bB(mY^a4heC&y-i|x|H50(CBP! z=7LLA-yv>I6#`O_m?J_rwC~r--=kvRkK>NY2KmPTHntHZDkj6b;Om9_cy1==qLo(AF8vque zR_z5}ex}yopAp=D@IG9Ng~jP7Sk?AASMRS}sR2aDO&k(ygYa?E-}=1!*e<~1A%9sP zzT<_`+BdE$T5bv-4A#G9Sd^-Ve3S0Tr5XXshJ`(D#A9w0YUG}c-wWRf*}e^@>H<9% zg2~SlOb@TOX8(SZ6!lU`fbQ~|Q1=~{zJcRxo0s@mxhhqE-k9D(GJYhN2>f=I%_fr!(Yzf>ygs5{0MsqGC=dbh+- z2r1dwx$@m>crRc*uHW6Y={tYt(tv)y9wbQsqRdEZW&hv8ZjYwD{FOl;!T$d{JW9Tm zw5Q|0UJD?9eI*ZsvdRmH9h!J;+(zr&zC-%vq3i2B{W^_v8#Ul?yMz;)?&}Vxa^k!E z!PWu9!65ac7B($+?YloQCElINZm}BseneZw(g})o2nfeAh3*}6R)OMg?Q&-#?5wPX zNkjMOE+F~d8=}A&XbjUW_X*JA+rCrRH>9bC*lYHGF}crxP;cli1{d_cmZ<5Lj;3{E z=|1_~H{bosi4MRL57b6N-bbajpa=0h@20-x_c1=QO zx-Mq`9w{~g{%yzu6x3OwVw7sIN1Ftp=^Ho}!@UXx=o<=YKflaO8UR4?kKO=6q$fyu zH3h|g1VSi+`lX;o_yK3XNf4r3D(b%JIs{6pu%(ms3-4FUAEyEWENg`#U2&4$qeObo z?-M_1Ru-aG$Et8a^KX0iXS^qT-BR1D`^WmRtnOpgu^3VX#QSXmf|kFa8-W3?{^nVI zT4^ZG5^tddHB#sl`H8v+FHTE#F*b$DjW6AQcsB7;Axq#sT1cM!Q&WPJ{QvwG>h>wA zOh|x`l@`kYpjISQBfX!3>_SHUini`4OfvRBle@7f)o&9*tlXzMCy?cSYXC@qKdt~E zQfLh0%0ee%0#>R|Bh)WY!xh_yF5&F+-$$DJh}_@Jz4Cwq+ONQJw*u5uK!D|MZ<8T^ zUx@2gB#QdC&tUDKU8)|Uc4Lr+qheXy|91EMS(@J7yZSU2J*Ri+Ae_B|%Ov!BuN zlV5d@yfAA0+pl|4)@k3l`)PT3+#4)^cb16ss#Yo z6)0?$l{zL#yyz$pbyj$tiYgoRk2M8ORRoN#3x-e);8S(P=DjlGAOL9-5JOBw%FkLh zGJsSL1QQd8)~Nx3s2vKGLg47^Z3BPFrMmC_SMH0gz;ah!BQ>z+4B$}M^mVqk>P|5M zLYNB$dM z-83MgP=OKZIqGwo`q5PUg@ulG>F#M!dH#^(KB?a8{0B!^O@HpLKyD%?7+Q)X7<1Ij zl9dYa^$P)0U`xyHV}3KLONBZo9#*PzO*8Wlu9Kt!D8ioaP&=_2?M@wk3daH)c&eyr z1S}e9?jz;YpI8A>XrL?kOJ{CF)_zRNwv(h1Mol#?wGpaPpPTH2VJTVyh&uM78cKra zr_OyNu|kt-9Mpe6O)KtI5d?H!*v@Z&UQ^9ftOG#)DYD?((^^f|`xwc_66b9ps8gCM z1uXy*AgEFeIv=eQ70(KP0P!!XW@v!aW@0588KDMSf6(Xj(V`0)dz4kJ-=CtI=7g(kI22Ae}pV|1b}|N!BirNur3uK$agNY&X9*iEvOx` zi%Hi%1NBboOM2#iQgxKKt*BCldLVug0EHU7+m-YHqW19mtAD0!m|HL>^Bec@7=$Im z|EmC6q$NXMMXf`bPbigY;5}whRUi{UBa-X+F9NtrRjAyz$&hEEe9s3EHemOJ=gZxD z1TbAX_+B#n`A5x59dIj@#6V}28mQk3)M(TABq81-trQl2b-3Igla9P(_@h+r_ASA( z6+)=Sy{DY@uTbMneGj7R3u>)lx#7NSZ22DofH!XS__s`C;V9Hm3G$h%e=HdCM4)1z z1`F)zss%-=F)fJ(!XdsMCZ7D?q-#40n*;jP8S+SVQQ@qAcLM^L;oGvDq7IjP5sR7s zOgn4`IK8xg_59TnP+j!lL45Moq(Sw$Be$oX}reLM#1-eA8l0(xhK^SNTTL3lo4 zq>v+j;$+CDdAk6$Rumv=diZ*WDAj7pF}i5L5PtMT8UdYh;e}n`v8nEd|J_<4+Isi{ z8S;$cuWKQQZUm&q)F^aRBEGEwD?e<4cV|^s0{T@6^rXS;Hi-D-q6$mQN)_5SWXNBT zAx}@t*AyU;8bUS76)oKhmNV43eyPe2u~dkE70yZphM~HDjimQVg=p*GSbO0{jKcTE zQ$H@Dz(GlRT?rtUX2}6!CcIA8#0UbUJ)P0qENVh?3ja7>Yj70iDP_UQYi;%+Vxt20rLEfEVK zj9FMOfyk}piKqT-?dP^l%)uXjYbE|5?yPK45T13155L3E9-FUTudBzvi>97u73R0F zM8;cC>TE++c&TnIFOi|4=>E%h>~%9FSl55gDfO|1U1E|SYX!c3v&A~^n>1J;pnvOL zT;vG+#_&%9=UtzA<-P_fJtpQb=Gs!Da02=yxL>?hviprP^`Mg=4-R&JXPoyo^(<)l z=0t%1#$uFAjTRIpO!(2ET-+9?JrC{&QiDiU15FsiuJG`RMTDS`ATJ6bjyClZ6PkMB z^2EA^oLf{R8dUh9YjAkhQ$nY&OIqI4WU4_e0~^Ve3@a5f4q)A?jW< zg$bK$ml}m$anO#g=LB?r>OO9YMUb!Y8{b^g#Ua<&|+78Sg?GZ@t0pIKq3nXdkdDpEgP{8d5OpUTA6(pdCpq%ng z9-D2k$XJLVpMTx%XW$F+fEn|Ikc6@dmpkZJps-soGz|{hQV8gOt5g1o`)#qvsMMsA zu8+VEtovQoVZpD15u+*rp~4S`Tx5fQo&@(hVi8y>a(=&Y96!Zh+b- zBr%HGfcdZ2S3A%xYXbVh{YI?-t#@@Oy?^SN7-h$HacuY1M$xY==_xb{!7b_d%ad^(0b`{{PZ(_WmJldAGXD^m&Mf)K=SYf-`Yks9Ea!Xh>Rlje_C7{(X-k3N&kg=(T(`+r)&zu3LzNtH}Zr3 zY}vAnvhd@7@b~pg_v-4bVJE#8eyXjOAJPtZ*w=-9b^8saSXj~#=gVTbWaD10_*SE6 zUyX-=(#HR?TH+DsHdpy{4FEeVUo++z9De{kj8gD3d0>9!f#t1a$lqP48RPU$|KrO%eqn)YnZY&S^raIA+TB@jRhjE zvqTkDgFMxh*pK_#v>Q6bzNtJczph1D!+&(vFzY|)C=EXGzo1q@NOV|!rlm^oZ^_;t z(pP?eG=4;v6Cg{^A@q8wJgi}TQh4w@f2onNuc=j#5(Ql8PAk_L_`RA!huz-+MM(g)PFVBu-SiuU=8Z8(6$j*+GODOlkuV7MnY%2<$1V2vHZGJm^FNr zBhIHB0;6L6&wY|WO@cMjDhL#RM8(FI(uE;^FxS~v;b{3(AC?cNs|#0Ncvoi)=f4^) z)-aQp7=2Q-3Ie1^(D$?M#al2c8=3S~OjhKL!!xtLD%BwP-u-BLnE?(jVIZ;s1`0qD zv%R7fMake>4w_B|#xBXd3NKUQVANmWB4bPIZBTd2{89=!qk|jF`HfnE7xV$lbEL8b zG%A=ZFBJgPA9hrttwT#2l5%vtLWdVKV5U2@0w<`SI%^nS+`vXfR0GTo06S)hx27IuYgN{8o}2s>P<@|YiO;K&h4+p ztG?!Rqhczyz`Gj%7F9}M4U2u!M!Mxm8SWBgzx=OA)({M;G$Hmkw}P#~R!@KN6(Xf7 zA0oR~?~~}09>*_@DzF4MJ4B6t;60OF_4Qb=)&H(kgQ`5q*caxlH`+cem8|Y?Lpm^| zr&2n>`!M^;{c0kQzo^wcaxD%u*06t6IHaktV0i{ea1SQI`#`7gkG@{KuZJ)K^3(EV zsQ_oZvU_oKgx?$$0%;=R3JXYZ2dwg_5V32r?}5MOD#;NDTOCLjcn*7irD_Mqmp?d4 ze9pxn3WqT&lBj?~x)exM)?g951q%A?t8TjD*n1aZO#}LE`74S9M+ygPR0yOl8!+ho z4B>HWvK?i^PNA5Y_2>W0Bia&t3Lk;o0`Icnxal&rZgvt zVT!kH%!u=|R$o_&a^;tQr5a)!eN<9Z3qVeG<6HG9<`vm$>kZ;l9Cf_TS>*TI^m0oi)7CCqE>@TBgU*t73qq@y;y{{!(>^ zjD7p2ssg9LLAcjKfdonAQmfvyQeNX7;{0Z*B-S+N$~y%P3rL!O<)T%T*iVd^S_IhM zf5%p@tArG(%9K>P(I-QzKrnU0>@a!`{$PDIjs3Sc_-hrw5$6_b7~o&^38cA#6b5UV zw@Uc^6B-B87&$gY9viD13%-7f(+1$}5je~=4_p8N|KzvZtpbi)vI}G2*c5sASNn@D zu8&#|s7k=>95NhHaRdz19oo;d_S_~Zx@CqEZ$k02>e;PbIZ+u~%D93q82VZ6&oQp1+%16A5 z-xu#KejC9m)r5{)mya8Vv~{~!r~pO<&}9H)RD>bqN4&p(3^KHT5llw06yCB(FqYdY z(ZK<09TUf?ON|LHFzl7XuK$9xtYZ?X4H|D*qPTn6@B(jMNr0b=Uc;Mb$Yav7eKP#2 zQf^F)xBN1WX4g*c=Vhg=bwdgOj^-!v8ErbkgPA93dH;-UA11w3;5c;cXm*JWFSiw0 zB7(neNk`>>d)oBQ(i#37ew-9{LPci;YtYugh8H>Rm^W`dEBFj=5}uaoBc8Dxt%Kp0 zm69+iQiR$obl$jjH2WSKep*`fhi7<`@IRaj3?>kgq5p#4ZD3+P*?HqCZ`)$S3k4XK zCc(epj~{7Nc&XqK@BfIjY+zzO0dIXChc2^*Z8p4rd@^@EyZ={xR+!JLpA0V?qJJAl zy#Eu0g~jk^yk)Cbv#pa2FPkFXe3t@b@#z>-M;RLeDOT0ZRho72d@iBEaU)^X_mwn9rg z0m~b2dv!W;*;3G3Lx>uWrf2YZTfFsEkI0hHL8qY-j``Q+3+H)Zb|AdB%qCoI4OH% zXxAEShu+FuAHLAT=I0Mo2^tN>-u!QAj*o$1)zovKZ zjH<~m$0SqHRJ$7BWH*ES{irl9tcN!3U0d;0-f}tPJ8@IFsyG43QlDxc6aJ97u;Rh= z{^iD0)>)f1Eg{D=GD{B|-Y9?spVOv2T;Nm9b7uuFrfv)q7z}HkgS)MPNdZE$!EUit0|-7;`82(wo-{l&$ud;>Xv-B!f!59R;> zg~Ngiym2u7#ySN|<&n~<=-`lf^$2l)e_JtczA7v%-u!5k!Gxz=SnFVV|00;4Oke7# zQZnvwsAqiRGtABV2Bzi2Z&ZKK=3QLif5chd#6%8TH#6|JmGb6QOLT?76Fs8n-*I8L z*2btxY-A;a9g4G)H=hzYi`|OuKkR#>QX8YX#m4nhoPiX;C;&8cbAkUEXL$>MlbC@) z-1ZmMXSqR}|1WTscQU0J+&qI2xaF#??((l_^Dxt`!@f5v<-`Pym&EN=Tcx5d%0JFx zmznV7UW}c?zPC%Y8k7T&rkBKRe_MBW^U&pjHote+_g<-%nbvF-;`U96+wQjd%fG{f zuNC@toMnoM^-6fA3&ENbx4B_Kb?RuVzx;?c|Bv8rt*NjGHm1#mSnDRPQhi)^37w_}NS}m+l#GPr ziYhtrktC37FO2vk0DfkmN_@`9_0>1jTHTstU|;|OWq^+#BzZbH8b61&NE zl~-kjCx#zntlMLn{eFzCqt-$vQ-JmL_05xaR$r-mev8X!(*@I{k}eAt&vtBo>Q6?BY-f7e#d~qxR&p(Rrp}_qc!$hvzw+~#8Hb> zQ*2S^EKlEl_I7_FOZ%}&5-}9Ky`Jq7W;~_v;=aXuYP$!CuP9)~9Emiyq+V(2#kdF6 zJ}D4+E0$e8hn4hkD5NY_>LdLUa8;<+JgkcWX3Ta5D)j8l;cl^VdT1<|Xv5-~#HRrdVL{osT|G%0pi3Ffww7s;f86okUq&92wa%a?dt# zoMgd$D*|;`8sCQU<@!m$Q#TgM;2S8UdIiFH|LgPlA%{~rAb6rRB9He6G^62m5x3p? znTRQmW5RpLO1AoFf`uQ!P0j$ zt+hDuUmUCKdQ=Cfqo7eL1?utVkr7|4XXM^yDU7dM0&a0J1c+rQ!lrCJ4EO^@Hm32<#l$>4;(kxePW&onSz9^>D?c)f#+nDp)nMh` zin47%IRtvHQws$eVucU#gNOpg$={^}!En?!k3ede+zWM6{w+3+rsD$Ge9+ z_)AxfEmwSc4&j*DBAu`&DnpsYbp%ZenxYthHn2wlgqRBCFpt_J5Z!p*MgP zdMl}C!1iZ0pm3?_nPh@~{h0zrVJpxRz@bXTI>N%r2~Ans3+&x515Ip#RYK!mzoq!` zdQG-0Q)nV~%IQGh8)oMFpG+TIOoel-iEFH&+!qY?J*D8=((L5!9bU@bazB~gyedU1 z12puVxh6Gc-@UxZv#c~TXtJLOtL2BvE4*+W{2KGU#0{hFq?}`Y!yS=ZK zeCki#NgdHxD07nQ=gTI%{oDd}GDB`)-BR)u?mr483|eE!!W|2!D=5QekqLp;tJ}yr zLi=Jt_6lT(6tXAGaG&|09~)xycBK1fTK~x6HA6-waEsx~ZzC^VbxLYAE*&vUky0{= zO|GwZ!4**!>1HJ*3qWRgHqM{;NMNkCwmhso>3tNnZPw{lx!Ge(3%uh#U&FY#A%0AAed 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 literal 9452 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 Xm5GZU>txL9M_AhG`f8ObcA@_R0Y4!8 diff --git a/public/images/pokemon/shiny/902-female.png b/public/images/pokemon/shiny/902-female.png index 97fa6f5cb71643dea74b4bb45792f10d13d1f0b9..e6807b123b67f5df28121e159e7b4511258e6af7 100644 GIT binary patch literal 28304 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 literal 34233 zcmV(|K+(U6P)Px#El^BUMF0Q*5D*Y3I2a%?Ib%L4J!L0eBy&MhQet9aM~57=Bj=CJqX z=H|%ug3JE8o;09cZtqbRR<-Art;NnlXd_Pg(J^Qez>PiEcuT*^|`X_+waOo#pr>2`> zdaYG~JXrdC-F{vzFB`Xbg6qBi;!iG@dA;(_4)3>q_tM#3t@pbl$}Ot;Ib~L;EbpE9 z>AwT1bu^uHC*IF~5$@|Ba2g3#>ec)Cui1RVI2Zr@9JRIl)8Z7J^!)|P{y;R<#(d7{ zFKb>#zVcA~qFXLZx7g4)PVJ|!2>ka)xF|Q7X{1dEQS=-^FrV|(O5%yXOw*J3g`dE` zJ~uhXD|dSBrvoa$-x_{g{~R%T%t?D38StZbx;p#^MAdO~0;i%4DsE_S7g!iEBBNDu3Kj?(`Jsp095z~fYoHWjzcs7 zHLl#VjUFD(Q!?Rk!o2>&!4K>yh$|t1Ctay5+c}9RfT>fj{Ud| zJntwnqW=U=_3}NeKH~m(k_tc#Jij)Ua#Ml*G%GzGFkic#QCeB9hkO=6>AxpT0x28EvFq=RzePUfVjs3~_Un2?PUPQm=~vs(UkbSm^u zO4ZQOQ+Rd`wH3p4bp4CA+;Q`Fw0;KG0@KGSH9;00a|w?Eqo}rpj}fN7?**+36yHAL zl;%OX{<84Ei3;XAu2D~GrthPP#tFlAdbBKnf9rDVAE#Uin(A4cK0GQ)&<`&98vL{E zi@Mszh|zD1|9HP4O+&w;wFTMKVyPtg46e{V+5g23*OATyS<<5T2ig%%uP4z%oGt^C zrMH*78Ghk>0Gz_gNpkBS5@L#xoIQb)NG6nMVbgT7A!=}*`CH>C!c zX-JE28;H{fW@(V7kzeszT^?{6=8HDK&+JdyJV`3dS?^>}Av&o*X4KV;(=bgX6XP_d zCt*gQE;*m+%{7UJ#Mfcs8wEaSLmx0<+|VfZr*X=NdNcss0qC4)08?DlyW5DEtoqY5>WudrP4}iNN(oi8e8Rscx$QD(3mE#21p-V1WYwLz zUl~+K3i<*5r^U{2lrxk|X^^FHo`!Cd)dkuL;etahI*v%|Z`2cZkjCWlliu0! zfzo^CqH!8H6H%Qgz3@&QCDV@^`gYdxX9Q}eVD!;g^QkQWA04d>^xmg?{O}Rn^Z0nk zWd=`;F3$Mc^|Ug$+?fGW?DP(*OTwS0O3&x&>Vm(Ws8nWgav1k8M`;auQklQ0GFN)% z3Hn&4G|!0^{^m}80n!B1wL1jcqTj#VCWLuHMimb4C~iTV?^{EkW*p`NDxw4${4~W; z?sqJ*o!5T9SN8(`Wr$P3;3sqSUFsT@TaoZr^D2JtvYQ?*Z9&=r%6K`GXt&bj^JjGV zbL#G^3Hn|K1@-=$&q-#BQU%k48HLGw>xSQ)Nh$ZAps!MtLpY^W!ZA*{-{HyYi`Wj= zhkq1Jz@-c&Ih9lDGU0F4t+XR6WmDtZc6^fYw>v76OO}(Ayrg5@?pJX7CJ2QJPJQ== zrsxI;OxR9Zs|lr{$LVB0zciN2fo< zDQ-Z&L;1fcjfPx;vXinf=}9J~eFTX#!C##iSezd4r|j&j;m>s%0Av$RDhcYy6mxCO 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 From 2b3b47cc07ff6dc618ea8df47d12fc844fa6c868 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Sun, 10 Aug 2025 21:40:08 -0400 Subject: [PATCH 105/106] Remove random unused empty Palossand exp variant masterlist entry (#6253) Remove random unused empty Palossand exp variant masterlist entry --- public/images/pokemon/variant/_exp_masterlist.json | 1 - 1 file changed, 1 deletion(-) diff --git a/public/images/pokemon/variant/_exp_masterlist.json b/public/images/pokemon/variant/_exp_masterlist.json index e2fe24007ff..1fd0fc183f5 100644 --- a/public/images/pokemon/variant/_exp_masterlist.json +++ b/public/images/pokemon/variant/_exp_masterlist.json @@ -132,7 +132,6 @@ "763": [0, 1, 1], "767": [0, 1, 1], "768": [0, 1, 1], - "770": [0, 0, 0], "771": [0, 2, 2], "772": [0, 1, 1], "773-fighting": [0, 1, 1], From 6c0253ada49f9371e3f7e8f6d418164dc9418cbe Mon Sep 17 00:00:00 2001 From: Jimmybald1 <122436263+Jimmybald1@users.noreply.github.com> Date: Mon, 11 Aug 2025 05:43:31 +0200 Subject: [PATCH 106/106] [Misc] Expanded Daily Run custom seeds (#6248) * Modify custom starters and added boss, biome and luck custom seed overrides * Added form index to boss custom seed * Fix circular dependency in daily-run.ts * Review for PR 6248 - Use early returns - Update TSDocs - Use `getEnumValues` instead of `Object.values` for `enum`s - Add console logging for invalid seeds --------- Co-authored-by: Jimmybald1 <147992650+IBBCalc@users.noreply.github.com> Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/daily-run.ts | 158 ++++++++++++++++++++++++++++------ src/field/pokemon.ts | 6 ++ src/game-mode.ts | 9 +- src/modifier/modifier-type.ts | 8 ++ 4 files changed, 156 insertions(+), 25 deletions(-) diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts index b5fb0aa8c07..f0a20a0b02b 100644 --- a/src/data/daily-run.ts +++ b/src/data/daily-run.ts @@ -5,10 +5,9 @@ import type { PokemonSpeciesForm } from "#data/pokemon-species"; import { PokemonSpecies } from "#data/pokemon-species"; import { BiomeId } from "#enums/biome-id"; import { PartyMemberStrength } from "#enums/party-member-strength"; -import type { SpeciesId } from "#enums/species-id"; -import { PlayerPokemon } from "#field/pokemon"; +import { SpeciesId } from "#enums/species-id"; import type { Starter } from "#ui/starter-select-ui-handler"; -import { randSeedGauss, randSeedInt, randSeedItem } from "#utils/common"; +import { isNullOrUndefined, randSeedGauss, randSeedInt, randSeedItem } from "#utils/common"; import { getEnumValues } from "#utils/enums"; import { getPokemonSpecies, getPokemonSpeciesForm } from "#utils/pokemon-utils"; @@ -32,15 +31,9 @@ export function getDailyRunStarters(seed: string): Starter[] { () => { const startingLevel = globalScene.gameMode.getStartingLevel(); - if (/\d{18}$/.test(seed)) { - for (let s = 0; s < 3; s++) { - const offset = 6 + s * 6; - const starterSpeciesForm = getPokemonSpeciesForm( - Number.parseInt(seed.slice(offset, offset + 4)) as SpeciesId, - Number.parseInt(seed.slice(offset + 4, offset + 6)), - ); - starters.push(getDailyRunStarter(starterSpeciesForm, startingLevel)); - } + const eventStarters = getDailyEventSeedStarters(seed); + if (!isNullOrUndefined(eventStarters)) { + starters.push(...eventStarters); return; } @@ -72,18 +65,7 @@ function getDailyRunStarter(starterSpeciesForm: PokemonSpeciesForm, startingLeve const starterSpecies = starterSpeciesForm instanceof PokemonSpecies ? starterSpeciesForm : getPokemonSpecies(starterSpeciesForm.speciesId); const formIndex = starterSpeciesForm instanceof PokemonSpecies ? undefined : starterSpeciesForm.formIndex; - const pokemon = new PlayerPokemon( - starterSpecies, - startingLevel, - undefined, - formIndex, - undefined, - undefined, - undefined, - undefined, - undefined, - undefined, - ); + const pokemon = globalScene.addPlayerPokemon(starterSpecies, startingLevel, undefined, formIndex); const starter: Starter = { species: starterSpecies, dexAttr: pokemon.getDexAttr(), @@ -145,6 +127,11 @@ const dailyBiomeWeights: BiomeWeights = { }; export function getDailyStartingBiome(): BiomeId { + const eventBiome = getDailyEventSeedBiome(globalScene.seed); + if (!isNullOrUndefined(eventBiome)) { + return eventBiome; + } + const biomes = getEnumValues(BiomeId).filter(b => b !== BiomeId.TOWN && b !== BiomeId.END); let totalWeight = 0; @@ -169,3 +156,126 @@ export function getDailyStartingBiome(): BiomeId { // TODO: should this use `randSeedItem`? return biomes[randSeedInt(biomes.length)]; } + +/** + * If this is Daily Mode and the seed is longer than a default seed + * then it has been modified and could contain a custom event seed. \ + * Default seeds are always exactly 24 characters. + * @returns `true` if it is a Daily Event Seed. + */ +export function isDailyEventSeed(seed: string): boolean { + return globalScene.gameMode.isDaily && seed.length > 24; +} + +/** + * Expects the seed to contain `/starters\d{18}/` + * where the digits alternate between 4 digits for the species ID and 2 digits for the form index + * (left padded with `0`s as necessary). + * @returns An array of {@linkcode Starter}s, or `null` if no valid match. + */ +export function getDailyEventSeedStarters(seed: string): Starter[] | null { + if (!isDailyEventSeed(seed)) { + return null; + } + + const starters: Starter[] = []; + const match = /starters(\d{4})(\d{2})(\d{4})(\d{2})(\d{4})(\d{2})/g.exec(seed); + + if (!match || match.length !== 7) { + return null; + } + + for (let i = 1; i < match.length; i += 2) { + const speciesId = Number.parseInt(match[i]) as SpeciesId; + const formIndex = Number.parseInt(match[i + 1]); + + if (!getEnumValues(SpeciesId).includes(speciesId)) { + console.warn("Invalid species ID used for custom daily run seed starter:", speciesId); + return null; + } + + const starterForm = getPokemonSpeciesForm(speciesId, formIndex); + const startingLevel = globalScene.gameMode.getStartingLevel(); + const starter = getDailyRunStarter(starterForm, startingLevel); + starters.push(starter); + } + + return starters; +} + +/** + * Expects the seed to contain `/boss\d{4}\d{2}/` + * where the first 4 digits are the species ID and the next 2 digits are the form index + * (left padded with `0`s as necessary). + * @returns A {@linkcode PokemonSpeciesForm} to be used for the boss, or `null` if no valid match. + */ +export function getDailyEventSeedBoss(seed: string): PokemonSpeciesForm | null { + if (!isDailyEventSeed(seed)) { + return null; + } + + const match = /boss(\d{4})(\d{2})/g.exec(seed); + if (!match || match.length !== 3) { + return null; + } + + const speciesId = Number.parseInt(match[1]) as SpeciesId; + const formIndex = Number.parseInt(match[2]); + + if (!getEnumValues(SpeciesId).includes(speciesId)) { + console.warn("Invalid species ID used for custom daily run seed boss:", speciesId); + return null; + } + + const starterForm = getPokemonSpeciesForm(speciesId, formIndex); + return starterForm; +} + +/** + * Expects the seed to contain `/biome\d{2}/` where the 2 digits are a biome ID (left padded with `0` if necessary). + * @returns The biome to use or `null` if no valid match. + */ +export function getDailyEventSeedBiome(seed: string): BiomeId | null { + if (!isDailyEventSeed(seed)) { + return null; + } + + const match = /biome(\d{2})/g.exec(seed); + if (!match || match.length !== 2) { + return null; + } + + const startingBiome = Number.parseInt(match[1]) as BiomeId; + + if (!getEnumValues(BiomeId).includes(startingBiome)) { + console.warn("Invalid biome ID used for custom daily run seed:", startingBiome); + return null; + } + + return startingBiome; +} + +/** + * Expects the seed to contain `/luck\d{2}/` where the 2 digits are a number between `0` and `14` + * (left padded with `0` if necessary). + * @returns The custom luck value or `null` if no valid match. + */ +export function getDailyEventSeedLuck(seed: string): number | null { + if (!isDailyEventSeed(seed)) { + return null; + } + + const match = /luck(\d{2})/g.exec(seed); + if (!match || match.length !== 2) { + return null; + } + + const luck = Number.parseInt(match[1]); + + if (luck < 0 || luck > 14) { + console.warn("Invalid luck value used for custom daily run seed:", luck); + return null; + } + + return luck; +} diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index fe85e92772c..29f775ad094 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -39,6 +39,7 @@ import { TrappedTag, TypeImmuneTag, } from "#data/battler-tags"; +import { getDailyEventSeedBoss } from "#data/daily-run"; import { allAbilities, allMoves } from "#data/data-lists"; import { getLevelTotalExp } from "#data/exp"; import { @@ -6256,6 +6257,11 @@ export class EnemyPokemon extends Pokemon { this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]] ) { this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId]; + } else if (globalScene.gameMode.isDaily && globalScene.gameMode.isWaveFinal(globalScene.currentBattle.waveIndex)) { + const eventBoss = getDailyEventSeedBoss(globalScene.seed); + if (!isNullOrUndefined(eventBoss)) { + this.formIndex = eventBoss.formIndex; + } } if (!dataSource) { diff --git a/src/game-mode.ts b/src/game-mode.ts index 82f7b4fa77f..b44e786b3d9 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -3,7 +3,7 @@ import { CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES, CLASSIC_MODE_MYSTERY_ENCOUNTER_ import { globalScene } from "#app/global-scene"; import Overrides from "#app/overrides"; import { allChallenges, type Challenge, copyChallenge } from "#data/challenge"; -import { getDailyStartingBiome } from "#data/daily-run"; +import { getDailyEventSeedBoss, getDailyStartingBiome } from "#data/daily-run"; import { allSpecies } from "#data/data-lists"; import type { PokemonSpecies } from "#data/pokemon-species"; import { BiomeId } from "#enums/biome-id"; @@ -15,6 +15,7 @@ import type { Arena } from "#field/arena"; import { classicFixedBattles, type FixedBattleConfigs } from "#trainers/fixed-battle-configs"; import { applyChallenges } from "#utils/challenge-utils"; import { BooleanHolder, isNullOrUndefined, randSeedInt, randSeedItem } from "#utils/common"; +import { getPokemonSpecies } from "#utils/pokemon-utils"; import i18next from "i18next"; interface GameModeConfig { @@ -211,6 +212,12 @@ export class GameMode implements GameModeConfig { getOverrideSpecies(waveIndex: number): PokemonSpecies | null { if (this.isDaily && this.isWaveFinal(waveIndex)) { + const eventBoss = getDailyEventSeedBoss(globalScene.seed); + if (!isNullOrUndefined(eventBoss)) { + // Cannot set form index here, it will be overriden when adding it as enemy pokemon. + return getPokemonSpecies(eventBoss.speciesId); + } + const allFinalBossSpecies = allSpecies.filter( s => (s.subLegendary || s.legendary || s.mythical) && diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 46ed7e1e4b5..aca49313ff5 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -6,6 +6,7 @@ import Overrides from "#app/overrides"; import { EvolutionItem, pokemonEvolutions } from "#balance/pokemon-evolutions"; import { tmPoolTiers, tmSpecies } from "#balance/tms"; import { getBerryEffectDescription, getBerryName } from "#data/berry"; +import { getDailyEventSeedLuck } from "#data/daily-run"; import { allMoves, modifierTypes } from "#data/data-lists"; import { SpeciesFormChangeItemTrigger } from "#data/form-change-triggers"; import { getNatureName, getNatureStatMultiplier } from "#data/nature"; @@ -2921,6 +2922,12 @@ export function getPartyLuckValue(party: Pokemon[]): number { const DailyLuck = new NumberHolder(0); globalScene.executeWithSeedOffset( () => { + const eventLuck = getDailyEventSeedLuck(globalScene.seed); + if (!isNullOrUndefined(eventLuck)) { + DailyLuck.value = eventLuck; + return; + } + DailyLuck.value = randSeedInt(15); // Random number between 0 and 14 }, 0, @@ -2928,6 +2935,7 @@ export function getPartyLuckValue(party: Pokemon[]): number { ); return DailyLuck.value; } + const eventSpecies = timedEventManager.getEventLuckBoostedSpecies(); const luck = Phaser.Math.Clamp( party